2011-07-05 139 views
0

这是我的登录页面登录页面错误

<h:outputText value="ENTER USERNAME" ></h:outputText> 
<p:inputText value="#{treeBean.username}" id="user"></p:inputText> 
<h:outputText value="ENTER PASSWORD" ></h:outputText> 
<p:inputText value="#{treeBean.userpass}" id="pass"></p:inputText> 
<p:commandButton value="GO" action="#{treeBean.checkuser}" onclick="redirect()"></p:commandButton> 
<script type="text/javascript"> 
function redirect() 
{ 
window.location="/arcpage/arc.jsf"; 
} 
</script> 

这是我的treeBean.checkuser功能

public void checkuser() 
{ 
Connection con=null; 
try 
{ 
Class.forName("com.mysql.jdbc.Driver"); 
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/", "root", "root"); 
try 
{ 
st.executeUpdate("USE ARCPAGE"); 
String update="SELECT * FROM USER WHERE USER_NAME=? AND USER_PASS=?"; 
    PreparedStatement prest=con.prepareStatement(update); 
    prest.setString(1,username); 
    prest.setString(2,userpass); 
ResultSet rs=prest.executeQuery(); 
if(rs.next()==false) 
{ 
check="false"; 
} 
else 
{ 
check="true"; 
} 
    }}} 

这是我的主网页:

<script type="text/javascript"> 
if(check!="true") 
{ 
window.location="/arcpage/login.jsf"; 
} 
</script> 
<Main Page Content> 

如果我键入正确的username-pass组合我被重定向到登录页面而不是主页面。如果我再次输入正确的组合,我将被重定向到主页面。即使我第二次重定向到主页时输入了错误的组合。我认为首页正在执行,然后checkuser()正在执行,因此检查的值在主页面显示之前不会更新。 这是怎么回事?

回答

3

这是因为您在重定向的onclick中添加了一些JavaScript函数。这在用户点击按钮时被调用。这反过来导致JSF操作被完全跳过。您似乎也认为JSF和JavaScript以某种方式同步运行。这是不真实的。它是两种完全不同的语言。 JSF仅在web服务器上运行,生成HTML/CSS/JS代码并将其发送到webbrowser。 JS在webbrowser中运行并仅拦截HTML DOM树。

要解决该问题,只需要删除onclick并在JSF操作方法中执行导航。所以:

<p:commandButton value="GO" action="#{treeBean.checkuser}" /> 

public String checkuser() { 
    User user = userService.find(username, password); 

    if (user == null) { 
     return "login"; 
    } else { 
     return "arc"; 
    } 
} 
+0

烨......它的工作... ...日Thnx – DanMatlin

+0

不客气。请注意,你的JDBC代码远没有效率。它没有使用连接池,并且泄漏了数据库资源。它也没有被充分抽象出来,这只会导致丑陋,重复和不可维护的代码。 – BalusC