目录
Java Web实现用户登录
实现步骤
1、创建数据库表
2、Web项目搭建
3、编写登录页面
4、登录成功页面
5、编写工具类
6、创建实体类
7、实现登录功能的 LoginServlet
8、运行项目,查看效果
Java Web实现用户登录
大型网站只有在用户登录成功后才能进行相关操作,本任务要求实现一个如下图所示用户登录功能。用户登录时,需要在数据库中判断是否存在该用户的信息以及用户信息的正确性。用户登录界面如下图所示。
实现步骤
1、创建数据库表
CREATE DATABASE jdbc;USE jdbc;CREATE TABLE tb_user ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,-- id主键 username VARCHAR(40) NOT NULL,-- 账户名称,设置不为空 PASSWORD VARCHAR(40) NOT NULL,-- 密码,设置不为空 NAME VARCHAR(40) DEFAULT NULL,-- 用户真实姓名,默认为空 gender VARCHAR(20) DEFAULT NULL,-- 用户性别,默认为空 phonenumber VARCHAR(30) DEFAULT NULL, -- 用户手机号码,默认为空 identitycode VARCHAR(30) DEFAULT NULL-- 用户身份证号码,默认为空);INSERT INTO tb_user VALUES(1,'张三','123','张三','male','13888888888','110202107075023');
2、Web项目搭建
新建一个Web项目chapter12(以IDEAIU 2024.2.1为例)
创建成功后,为chapter12添加web组件:
看到web目录即为成功:
导入完组件后,在web/WEB-INF目录下,粘贴lib包(包含mysql驱动包、servlet-api包):
【lib包资源可前往本专栏第一篇文章“初识JDBC”下载】
3、编写登录页面
在web目录下创建一个名称为login.jsp的文件,在该文件中添加用于用户登录时输入用户信息的表单元素。
编写代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>登录页面</title></head><body> <form action="LoginServlet" method="post"> 用户名:<input type="text" name="username" /> <br /> 密 码:<input type="password" name="password" /> <br /> <input type="submit" value="登 录" class="submit" /> </form></body></html>
4、登录成功页面
在web目录下创建一个名称为loginSuccess.jsp文件,在该文件中添加用户登录成功后的页面内容。代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html> <head> <title>登录成功</title> </head> <body> 欢迎登录!${user.name} </body></html>
5、编写工具类
由于每次操作数据库时,都需要加载数据库驱动、建立数据库连接以及关闭数据库连接,为了避免代码的重复书写,下面建立一个专门用于操作数据库的工具类。
在src目录的com.example.utils包下创建一个JDBCUtils工具类。编写代码如下:
package com.example.utils;import java.sql.*;public class JDBCUtils { // 加载驱动,并建立数据库连接 public static Connection getConnection() throws SQLException, ClassNotFoundException { Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/jdbc?serverTimezone=GMT%2B8&useSSL=false"; String username = "root"; String password = "root"; Connection conn = DriverManager.getConnection(url, username, password); return conn; } // 关闭数据库连接,释放资源 public static void release(PreparedStatement pstmt, Connection conn) { if (pstmt != null) { try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } pstmt = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn = null; } } public static void release(ResultSet rs, PreparedStatement pstmt, Connection conn){ if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } rs = null; } release(pstmt, conn); }}
6、创建实体类
在src目录的com.example.domain包下创建一个User实体类,运用于封装User对象。编写代码如下:
package com.example.domain;public class User { Integer id; String username; String password; String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; }}
7、实现登录功能的 LoginServlet
在项目src目录的com.example.servlet包下创建LoginServlet类,用于封装用户的登录信息并对用户信息进行校验。思路如图:
编写代码如下:
package com.example.servlet;import com.example.domain.User;import com.example.utils.JDBCUtils;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;@WebServlet("/LoginServlet")public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 有中文数据传输,需设置请求编码、响应方式和编码方式 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); //获取页面输入框的值 String loginUsername = request.getParameter("username"); String loginPassword = request.getParameter("password"); try { //获取连接 Connection conn = JDBCUtils.getConnection(); //sql语句 String sql = "select * from tb_user where username=?"; //执行sql语句 PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, loginUsername); ResultSet rs = pstmt.executeQuery(); //处理结果 User user = new User(); while (rs.next()){ user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); user.setName(rs.getString("name")); } String dbUsername = user.getUsername(); String dbPassword = user.getPassword(); //判断用户名是否存在 if (dbUsername != null) { // 用户名存在,则要去判断密码是否正确 if (loginPassword.equals(dbPassword)) { //user对象存储 request.getSession().setAttribute("user", user); //重定向到登陆成功的页面loginSuccess.jsp response.sendRedirect("loginSuccess.jsp"); } else { out.println("密码错误,请重新输入"); } } else { out.println("用户名不存在"); } //释放资源 JDBCUtils.release(rs, pstmt, conn); } catch (SQLException e) { throw new RuntimeException(e); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } out.flush(); out.close(); }}
8、运行项目,查看效果
在IDEA中启动Tomcat服务器,然后在浏览器中访问地址http://localhost:8080/chapter12/login.jsp,用户登录界面和登录成功的Servlet界面如下面图所示。
①用户名、密码分别输入“张三”和“123”(成功)
②用户名、密码分别输入“张三”和“111”(失败,密码错误)
③用户名、密码分别输入“lisi”和“123”(失败,用户名不存在)