[英]How to handle if a sql query finds nothing? Using resultset in java
我在這個網站上找到了這個問題的一些答案,但是無法正確應用它。 我正在嘗試獲取用戶輸入的用戶名和密碼,並根據數據庫檢查它是否正確。 除非輸入的用戶名不在數據庫中,否則一切正常。 在這種情況下,查詢找不到任何行。 我在netbeans中用德比做這個。 因此,我認為我在查找使用未知用戶名發送查詢時遇到問題。 有什么建議么?
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name = "MyServlet", urlPatterns ={"/echo"})
public class LoginAction extends HttpServlet {
private ResultSet resultSet;
private Connection con;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<!DOCTYPE html>");
out.println("<html><head>");
out.println("<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>");
String userName = request.getParameter("username");
String password = request.getParameter("password");
if (userName.length()>0 & password.length()>0){
try{
String url = "jdbc:derby:c:/users/project/.netbeans-derby/";
String db = "loginpass";
String driver = "org.apache.derby.jdbc.EmbeddedDriver";
String user = "user";
String pass = "pass";
Class.forName(driver).newInstance();
con = DriverManager.getConnection(url+db, user, pass);
String statement = "SELECT PASSWORD FROM LOGINPASS WHERE LOGIN = '"+userName+"'";
PreparedStatement prepStatement = con.prepareStatement(statement);
resultSet = prepStatement.executeQuery();
while (resultSet.next()){
if (resultSet.getString("password").equals(password)){
out.println("Login attempt successful!");
out.println("<br><a href='index.jsp'>Back to Login Page</a>");
} else {
out.println("Password incorrect");
out.println("<br><a href='index.jsp'>Back to Login Page</a>");
}
}
con.close();
}catch(Exception e){
out.println("caught...");
e.printStackTrace();
}
} else {
out.println("Login attempt failed");
out.println("<a href='index.jsp'>Back to Login Page</a>");
}
} finally {
out.close();
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
正如您所期望的只有一行,您可以寫道:
if (resultSet.next()) {
if (resultSet.getString("password").equals(password)){
out.println("Login attempt successful!");
out.println("<br><a href='index.jsp'>Back to Login Page</a>");
} else {
out.println("Password incorrect");
out.println("<br><a href='index.jsp'>Back to Login Page</a>");
}
} else {
out.println("User doesn't exist");
out.println("<br><a href='index.jsp'>Back to Login Page</a>");
}
並且你最好使用參數來避免sql注入:
String statement = "SELECT PASSWORD FROM LOGINPASS WHERE LOGIN = ?";
PreparedStatement prepStatement = con.prepareStatement(statement);
prepStatement.setString(1, userName);
resultSet = prepStatement.executeQuery();
您可以從ResultSet
對象本身檢查它。 ResultSet#isBeforeFirst() :
檢索游標是否在此ResultSet對象的第一行之前。
注意:對於結果集類型為TYPE_FORWARD_ONLY的ResultSet,支持isBeforeFirst方法是可選的
返回:
如果光標在第一行之前,則為true;否則為false。 如果光標位於任何其他位置或結果集不包含任何行,則返回false。
if (!resultSet.isBeforeFirst()) {
out.println("no rows fetched");
out.println("User with this password not found");
out.println("<br><a href='index.jsp'>Back to Login Page</a>");
}
在While(resultSet.next())之前,鍵入if(resultSet!= null)。如果查詢沒有結果,則resultSet將為null。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.