2011-03-18 61 views
0

有人可以告訴我爲什麼這不起作用嗎?我希望能夠檢查從數據庫查詢返回的用戶名/密碼是否等於一個值。結果集jsp - 如何使用?

會話屬性「loginSuccess」始終返回false,即使這些值應該匹配。

<%@ page language="java" import="java.sql.*" %> 
<% 
      String driver = "oracle.jdbc.driver.OracleDriver"; 
      Class.forName(driver).newInstance(); 

      Connection con = null; 
      ResultSet rst = null; 
      Statement stmt = null; 

      try { 
       String url = "jdbc:oracle:thin:username/[email protected]:port:SID"; 
       con = DriverManager.getConnection(url); 
       stmt = con.createStatement(); 
      } catch (Exception e) { 
       System.out.println(e.getMessage()); 
      } 
      if (request.getParameter("action") != null) { 
       rst = stmt.executeQuery("select username, password" 
         + " from table"); 
       } 
%> 


       <% 

       boolean loginCheck = false; 
          int count = 1; 
          while (rst.next()) { 

if(request.getParameter("action")!=null){ 
    if("username1"==rst.getString("username")){ 
     if("password1"==rst.getString("password")){ 
      loginCheck = true; 
      } 
     } 
    } 

          count++; 
          } 

          if(loginCheck==true){ 
           session.setAttribute("loginSuccess", "true"); 
           }else{ 
           session.setAttribute("loginSuccess", "false"); 
           } 

          rst.close(); 
          stmt.close(); 
          con.close(); 
       %> 

<jsp:forward page="login.jsp"/> 

回答

1

您正在使用==來比較字符串。改爲嘗試等於。

我建議不要以這種方式在JSP中加入scriptlet代碼。您應該使用JSTL標籤庫編寫JSP。

我也建議把這個數據庫代碼放在POJO中,這樣你就可以脫機測試它,從你的servlet/JSP引擎中分離出來。然後讓一個servlet實例化POJO,與數據庫交互,並將結果發送給JSP。

這是一個更多的工作,但從長遠來看,設計將會擴展和擴展。

+0

哈!很簡單。當我寫這些時,我一定是在Javascript模式下。感謝您注意! – etech22 2011-03-18 23:10:32

+0

感謝您的額外提示..仍然是新的,所以很感激。 – etech22 2011-03-18 23:15:02

+3

@etech:我也推薦學習SQL'WHERE'子句。您不必要地將整個數據庫表複製到Java內存中,比較Java中的每一行並忽略不匹配的數據。多麼浪費資源。只要利用SQL的權力。編寫你的SQL查詢,以便它返回與用戶名/密碼匹配的行。如果它返回一行,它是有效的。如果它什麼都不返回,它是無效的。簡單和更有效率,尤其是如果你有很多行在表中;) – BalusC 2011-03-19 04:49:23

1

我認爲你在這行代碼中有一個基本的語法錯誤。

「USERNAME1」 == rst.getString( 「用戶名」)

它應該是這樣的

rst.getString( 「用戶名」)。equalsIgnoreCase( 「USERNAME1」 );

與密碼相似。 請檢查這是否有幫助。

+0

所以它會更安全地翻轉比較「username1」.equalsIgnoreCase(rst.getString(「username」)) ,因爲它可能是數據庫中有一個空值。 – MeBigFatGuy 2011-03-19 06:11:08

+0

以確保您可以使用此「username1」.equalsIgnoreCase(rst.getString(「username」)+「」)。如果爲null,則null將被轉換爲String。 :)) – Nathanphan 2011-03-21 04:24:35