Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我想使用servlet创建一个登录页面_Java_Mysql_Jsp_Servlets_Jdbc - Fatal编程技术网

Java 我想使用servlet创建一个登录页面

Java 我想使用servlet创建一个登录页面,java,mysql,jsp,servlets,jdbc,Java,Mysql,Jsp,Servlets,Jdbc,我想使用Servlet和JSP创建一个登录页面 我创建了一个获取用户名和密码的页面 <form action="LoginPage" method="POST"> User name: <input type="text" name="userName" size="20"><br> Password: <input type="password" name="password" size="20"> <br>&

我想使用Servlet和JSP创建一个登录页面

我创建了一个获取用户名和密码的页面

<form action="LoginPage" method="POST">
    User name: <input type="text" name="userName" size="20"><br>
    Password: <input type="password" name="password" size="20">
    <br><br>
    <input type="submit" value="Submit">
</form> 
我用一个包含用户名和密码的表创建了一个数据库

<form action="LoginPage" method="POST">
    User name: <input type="text" name="userName" size="20"><br>
    Password: <input type="password" name="password" size="20">
    <br><br>
    <input type="submit" value="Submit">
</form> 
我在doPost中输入了以下代码

 response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    String userName = request.getParameter("userName").toString();
    String passWord = request.getParameter("password").toString();
    Connection con = null;
    String url = "jdbc:mysql://localhost:3306/";
    String dbName = "userdb";
    String driver = "com.mysql.jdbc.Driver";
    String user = "root"; 
    String password = "1234";
    try {
        Class.forName(driver).newInstance();
        Connection conn = DriverManager.getConnection(url+dbName, user, password);
        PreparedStatement pstmt;
        String sql = "SELECT USR_NAME FROM LOGIN WHERE USR_NAME='userName'";
        pstmt = conn.prepareStatement(sql);
        ResultSet rs=pstmt.executeQuery();
        String usr = null;
        String pass = null;
        while(rs.next())
        {
            pass = rs.getString(3);
        }
        if(pass != null && pass.equals(passWord))
        {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Login Sucessfull</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Login Sucessfull " + request.getContextPath () + "</h1>");
            out.println("<p>Welcome</p> " + userName);
            out.println("</body>");
            out.println("</html>");

            out.close();
        }

    } catch (Exception e) {
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Login is not Sucessfull</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Login is not Sucessfull " + request.getContextPath () + "</h1>");
        out.println("<p>Wrong Username Or Password</p> ");
        out.println("</body>");
        out.println("</html>");

        out.close();
我不知道如何让它工作。 有什么可以帮我快速解决的吗

这不是一个大项目,我只是想要一个登录页面,其中获得用户名和密码 然后servlet将在数据库中搜索用户名,然后检查密码。 我已经做了你们告诉我的改变。但是输出看起来像是什么 try块出错,因为我得到了登录不成功的页面。
我将代码登录不成功页面放在Catch块中

toString for request.getParameter不是必需的

您可以将查询修改为

String sql = "SELECT <PASSWORD_CLM> FROM LOGIN WHERE USR_NAME="+userName;


while(rs.next()) 
{ 
   //read the password in pass. 
} 
if(pass !=null && pass.equals(passWord)) 
{ 
  // Code
}

不需要request.getParameter的toString

您可以将查询修改为

String sql = "SELECT <PASSWORD_CLM> FROM LOGIN WHERE USR_NAME="+userName;


while(rs.next()) 
{ 
   //read the password in pass. 
} 
if(pass !=null && pass.equals(passWord)) 
{ 
  // Code
}

我发现线路有问题:

  String sql = "SELECT USR_NAME FROM LOGIN WHERE USR_NAME='userName'";
    pstmt = conn.prepareStatement(sql);
    ResultSet rs=pstmt.executeQuery();
    String usr = null;
    String pass = null;
应该是:

String sql = "SELECT * from LOGIN WHERE USR_NAME="+ userName+";";
还要检查表名中的登录信息,因为它是作为登录名的,确定它不是登录名吗? 此外,我将避免在servlet中编写HTML,而只是将其转发给另一个JSP。现在可能只是简单的事情。我已经登录了。
迪安

我发现线路有问题:

  String sql = "SELECT USR_NAME FROM LOGIN WHERE USR_NAME='userName'";
    pstmt = conn.prepareStatement(sql);
    ResultSet rs=pstmt.executeQuery();
    String usr = null;
    String pass = null;
应该是:

String sql = "SELECT * from LOGIN WHERE USR_NAME="+ userName+";";
还要检查表名中的登录信息,因为它是作为登录名的,确定它不是登录名吗? 此外,我将避免在servlet中编写HTML,而只是将其转发给另一个JSP。现在可能只是简单的事情。我已经登录了。
迪安

不清楚你的意思是什么,如何让它发挥作用。会发生什么?什么事不会发生?至少我可以在您的代码中发现几个问题:

您正在servlet中发出HTML。您应该为此使用JSP。 您正在泄漏JDBC资源。最后你需要把它们关起来。 您没有在SQL字符串中设置输入的用户名和密码。 您不允许数据库执行比较密码的任务。将它添加到WHERE。 你正在接受这个例外。有关问题原因的所有详细信息都将丢失。您应该将其作为ServletException重新显示,或者至少记录异常类型、消息和原因。此信息非常重要,因为它可以说明问题的根本原因。你知道,一旦了解了根本原因,解决办法就显而易见了。 此外,如果您将页面更改为用户只能面对错误消息的页面,则用户体验也很糟糕。用户必须进行额外处理才能返回登录页面重新输入详细信息。而是内联错误消息重新显示同一页面

按如下所示重写doPost方法:

String userName = request.getParameter("userName");
String passWord = request.getParameter("password");

String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/";
String dbName = "userdb";
String user = "root"; 
String password = "1234";
String sql = "SELECT * FROM LOGIN WHERE USR_NAME = ? AND USR_PASS = ?"; // Not sure how the password column is named, you need to check/update it. You should leave those ? there! Those are preparedstatement placeholders.

Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
boolean login = false;

try {
    Class.forName(driver); // You don't need to call it EVERYTIME btw. Once during application's startup is more than enough.
    connection = DriverManager.getConnection(url + dbName, user, password);
    statement = connection.prepareStatement(sql);
    statement.setString(1, userName);
    statement.setString(2, password);
    resultSet = statement.executeQuery();
    login = resultSet.next();
} catch (Exception e) {
    throw new ServletException("Login failed", e);
} finally {
    if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
    if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
    if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
}

if (login) {
    request.getSession().setAttribute("username", userName); // I'd prefer the User object, which you get from DAO, but ala.
    response.sendRedirect("home.jsp"); // Redirect to home page.
} else {
    request.setAttribute("message", "Unknown username/password, try again"); // This sets the ${message}
    request.getRequestDispatcher("login.jsp").forward(request, response); // Redisplay JSP.
}
并将${message}添加到JSP中:

<form action="LoginPage" method="POST">
    User name: <input type="text" name="userName" size="20"><br>
    Password: <input type="password" name="password" size="20">
    <br><br>
    <input type="submit" value="Submit"> ${message}
</form>
这里有一些链接可以学习如何正确地使用JSP/Servlet/JDBC


不清楚你的意思是什么,如何让它工作。会发生什么?什么事不会发生?至少我可以在您的代码中发现几个问题:

您正在servlet中发出HTML。您应该为此使用JSP。 您正在泄漏JDBC资源。最后你需要把它们关起来。 您没有在SQL字符串中设置输入的用户名和密码。 您不允许数据库执行比较密码的任务。将它添加到WHERE。 你正在接受这个例外。有关问题原因的所有详细信息都将丢失。您应该将其作为ServletException重新显示,或者至少记录异常类型、消息和原因。此信息非常重要,因为它可以说明问题的根本原因。你知道,一旦了解了根本原因,解决办法就显而易见了。 此外,如果您将页面更改为用户只能面对错误消息的页面,则用户体验也很糟糕。用户必须进行额外处理才能返回登录页面重新输入详细信息。而是内联错误消息重新显示同一页面

按如下所示重写doPost方法:

String userName = request.getParameter("userName");
String passWord = request.getParameter("password");

String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/";
String dbName = "userdb";
String user = "root"; 
String password = "1234";
String sql = "SELECT * FROM LOGIN WHERE USR_NAME = ? AND USR_PASS = ?"; // Not sure how the password column is named, you need to check/update it. You should leave those ? there! Those are preparedstatement placeholders.

Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
boolean login = false;

try {
    Class.forName(driver); // You don't need to call it EVERYTIME btw. Once during application's startup is more than enough.
    connection = DriverManager.getConnection(url + dbName, user, password);
    statement = connection.prepareStatement(sql);
    statement.setString(1, userName);
    statement.setString(2, password);
    resultSet = statement.executeQuery();
    login = resultSet.next();
} catch (Exception e) {
    throw new ServletException("Login failed", e);
} finally {
    if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
    if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
    if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
}

if (login) {
    request.getSession().setAttribute("username", userName); // I'd prefer the User object, which you get from DAO, but ala.
    response.sendRedirect("home.jsp"); // Redirect to home page.
} else {
    request.setAttribute("message", "Unknown username/password, try again"); // This sets the ${message}
    request.getRequestDispatcher("login.jsp").forward(request, response); // Redisplay JSP.
}
并将${message}添加到JSP中:

<form action="LoginPage" method="POST">
    User name: <input type="text" name="userName" size="20"><br>
    Password: <input type="password" name="password" size="20">
    <br><br>
    <input type="submit" value="Submit"> ${message}
</form>
这里有一些链接可以学习如何正确地使用JSP/Servlet/JDBC

您应该在sql查询中使用SELECT PASSWORD from Login 此处PASSWORD是数据库表LOGIN中包含密码的列名

您应该在sql查询中使用SELECT PASSWORD from LOGIN
此处PASSWORD是数据库表LOGIN中包含密码的列名

您确实需要在SQL语句的末尾加上分号,即使是准备好的语句。@Dean:这不是真的。仅当您希望在一个查询中传递多个语句时,才需要此选项。分号是语句分隔符。还要注意,它是否被接受取决于数据库。您确实需要将分号放在SQL语句的末尾,即使是准备好的语句。@Dean:这不是真的。仅当您希望在一个查询中传递多个语句时,才需要此选项。分号是语句分隔符。还要注意,它是否被接受取决于数据库。