2011-07-05 142 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