做 Java Web 商城项目用户登录是最基础也是必备的核心功能。早期传统 Java Web 开发没有 SpringBoot、Spring MVC完全依靠Servlet JSP MySQL实现登录逻辑。本文从零带你用原生 Servlet 搭建商城用户登录功能包含登录页面编写、Servlet 接收参数、数据库校验、登录成功 / 失败跳转、请求乱码解决、域对象存登录信息新手可以直接拿去练手、写课程设计、做商城项目基础模块。一、技术栈后端Servlet 3.0 Tomcat 8.5/9前端JSP HTML数据库MySQL工具JDBC 连接数据库开发方式注解版 Servlet无需配置 web.xml二、功能整体流程用户访问登录页面login.jsp输入用户名、密码点击提交表单以 POST 方式提交到 LoginServletServlet 获取表单参数解决中文乱码通过 JDBC 连接 MySQL查询用户表是否存在该账号密码校验成功将用户信息存入 Session请求转发跳转到商城首页校验失败转发回登录页提示账号或密码错误三、数据库准备1. 创建商城用户表sql-- 创建数据库 CREATE DATABASE shop_db; USE shop_db; -- 创建用户表 CREATE TABLE shop_user( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(20) NOT NULL UNIQUE, password VARCHAR(20) NOT NULL ); -- 插入测试账号 INSERT INTO shop_user(username,password) VALUES (admin,123456),(user,666666);四、项目结构plaintextJavaWeb-ShopLogin └── web ├── login.jsp // 登录页面 ├── index.jsp // 商城首页登录后跳转 └── WEB-INF └── lib // 放入mysql-connector-java.jar com └── shop ├── entity │ └── User.java // 用户实体类 ├── util │ └── JDBCUtil.java // JDBC工具类 └── servlet └── LoginServlet.java // 登录核心Servlet五、代码实现1. 用户实体类 User.java封装用户属性对应数据库字段java运行package com.shop.entity; public class User { private Integer id; private String username; private String password; // 无参、有参构造 public User() {} public User(Integer id, String username, String password) { this.id id; this.username username; this.password password; } // getter setter 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; } }2. JDBC 工具类 JDBCUtil.java简化数据库连接、关闭资源java运行package com.shop.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class JDBCUtil { private static final String DRIVER com.mysql.cj.jdbc.Driver; private static final String URL jdbc:mysql://localhost:3306/shop_db?useSSLfalseserverTimezoneUTC; private static final String USER root; private static final String PWD 你的数据库密码; // 静态加载驱动 static { try { Class.forName(DRIVER); } catch (Exception e) { e.printStackTrace(); } } // 获取连接 public static Connection getConnection(){ Connection conn null; try { conn DriverManager.getConnection(URL,USER,PWD); } catch (Exception e) { e.printStackTrace(); } return conn; } // 关闭资源 public static void close(Connection conn, PreparedStatement pstmt, ResultSet rs){ try { if(rs ! null) rs.close(); if(pstmt ! null) pstmt.close(); if(conn ! null) conn.close(); } catch (Exception e) { e.printStackTrace(); } } }3. 登录页面 login.jsp表单提交到 LoginServlet添加错误提示% page contentTypetext/html;charsetUTF-8 languagejava % html head title商城登录/title /head body h2商城系统 - 用户登录/h2 %-- 错误提示信息 --% div stylecolor: red${msg}/div form actionloginServlet methodpost p用户名input typetext nameusername placeholder请输入用户名/p p密 码input typepassword namepassword placeholder请输入密码/p pinput typesubmit value立即登录/p /form /body /html4. 商城首页 index.jsp登录成功后跳转页面jsp% page contentTypetext/html;charsetUTF-8 languagejava % html head title商城首页/title /head body h2欢迎来到商城系统/h2 h3当前登录用户${loginUser.username}/h3 hr a href#商品分类/a nbsp;nbsp; a href#我的订单/a nbsp;nbsp; a href#个人中心/a /body /html5. 核心登录 Servlet LoginServlet.javajava运行package com.shop.servlet; import com.shop.entity.User; import com.shop.util.JDBCUtil; 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 javax.servlet.http.HttpSession; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; WebServlet(/loginServlet) public class LoginServlet extends HttpServlet { Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 解决 POST 请求中文乱码 request.setCharacterEncoding(UTF-8); // 2. 获取表单参数 String username request.getParameter(username); String password request.getParameter(password); Connection conn null; PreparedStatement pstmt null; ResultSet rs null; User user null; try { // 3. 获取连接、编写查询 SQL conn JDBCUtil.getConnection(); String sql select id,username,password from shop_user where username? and password?; pstmt conn.prepareStatement(sql); pstmt.setString(1, username); pstmt.setString(2, password); // 4. 执行查询 rs pstmt.executeQuery(); if (rs.next()) { user new User(); user.setId(rs.getInt(id)); user.setUsername(rs.getString(username)); user.setPassword(rs.getString(password)); } } catch (Exception e) { e.printStackTrace(); } finally { // 5. 关闭资源 JDBCUtil.close(conn, pstmt, rs); } // 6. 登录逻辑判断 if (user ! null) { // 登录成功存入 Session转发到首页 HttpSession session request.getSession(); session.setAttribute(loginUser, user); request.getRequestDispatcher(index.jsp).forward(request, response); } else { // 登录失败带回提示转发回登录页 request.setAttribute(msg, 用户名或密码错误请重新输入); request.getRequestDispatcher(login.jsp).forward(request, response); } } Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }六、部署运行步骤把mysql-connector-java-8.x.jar放到WEB-INF/lib修改JDBCUtil里的 MySQL 账号密码为自己本地的Tomcat 配置项目启动服务器访问地址plaintexthttp://localhost:8080/项目名/login.jsp测试账号admin / 123456七、核心知识点总结POST 提交密码不在地址栏更安全适合登录表单乱码解决request.setCharacterEncoding(UTF-8);只对 POST 有效Session 作用保存登录用户整站共享做登录状态保持请求转发地址栏不变携带 request 数据跳转页面Servlet 单例不要在 Servlet 定义成员变量避免线程安全问题
用 Servlet 实现商城系统用户登录
发布时间:2026/5/15 20:08:34
做 Java Web 商城项目用户登录是最基础也是必备的核心功能。早期传统 Java Web 开发没有 SpringBoot、Spring MVC完全依靠Servlet JSP MySQL实现登录逻辑。本文从零带你用原生 Servlet 搭建商城用户登录功能包含登录页面编写、Servlet 接收参数、数据库校验、登录成功 / 失败跳转、请求乱码解决、域对象存登录信息新手可以直接拿去练手、写课程设计、做商城项目基础模块。一、技术栈后端Servlet 3.0 Tomcat 8.5/9前端JSP HTML数据库MySQL工具JDBC 连接数据库开发方式注解版 Servlet无需配置 web.xml二、功能整体流程用户访问登录页面login.jsp输入用户名、密码点击提交表单以 POST 方式提交到 LoginServletServlet 获取表单参数解决中文乱码通过 JDBC 连接 MySQL查询用户表是否存在该账号密码校验成功将用户信息存入 Session请求转发跳转到商城首页校验失败转发回登录页提示账号或密码错误三、数据库准备1. 创建商城用户表sql-- 创建数据库 CREATE DATABASE shop_db; USE shop_db; -- 创建用户表 CREATE TABLE shop_user( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(20) NOT NULL UNIQUE, password VARCHAR(20) NOT NULL ); -- 插入测试账号 INSERT INTO shop_user(username,password) VALUES (admin,123456),(user,666666);四、项目结构plaintextJavaWeb-ShopLogin └── web ├── login.jsp // 登录页面 ├── index.jsp // 商城首页登录后跳转 └── WEB-INF └── lib // 放入mysql-connector-java.jar com └── shop ├── entity │ └── User.java // 用户实体类 ├── util │ └── JDBCUtil.java // JDBC工具类 └── servlet └── LoginServlet.java // 登录核心Servlet五、代码实现1. 用户实体类 User.java封装用户属性对应数据库字段java运行package com.shop.entity; public class User { private Integer id; private String username; private String password; // 无参、有参构造 public User() {} public User(Integer id, String username, String password) { this.id id; this.username username; this.password password; } // getter setter 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; } }2. JDBC 工具类 JDBCUtil.java简化数据库连接、关闭资源java运行package com.shop.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class JDBCUtil { private static final String DRIVER com.mysql.cj.jdbc.Driver; private static final String URL jdbc:mysql://localhost:3306/shop_db?useSSLfalseserverTimezoneUTC; private static final String USER root; private static final String PWD 你的数据库密码; // 静态加载驱动 static { try { Class.forName(DRIVER); } catch (Exception e) { e.printStackTrace(); } } // 获取连接 public static Connection getConnection(){ Connection conn null; try { conn DriverManager.getConnection(URL,USER,PWD); } catch (Exception e) { e.printStackTrace(); } return conn; } // 关闭资源 public static void close(Connection conn, PreparedStatement pstmt, ResultSet rs){ try { if(rs ! null) rs.close(); if(pstmt ! null) pstmt.close(); if(conn ! null) conn.close(); } catch (Exception e) { e.printStackTrace(); } } }3. 登录页面 login.jsp表单提交到 LoginServlet添加错误提示% page contentTypetext/html;charsetUTF-8 languagejava % html head title商城登录/title /head body h2商城系统 - 用户登录/h2 %-- 错误提示信息 --% div stylecolor: red${msg}/div form actionloginServlet methodpost p用户名input typetext nameusername placeholder请输入用户名/p p密 码input typepassword namepassword placeholder请输入密码/p pinput typesubmit value立即登录/p /form /body /html4. 商城首页 index.jsp登录成功后跳转页面jsp% page contentTypetext/html;charsetUTF-8 languagejava % html head title商城首页/title /head body h2欢迎来到商城系统/h2 h3当前登录用户${loginUser.username}/h3 hr a href#商品分类/a nbsp;nbsp; a href#我的订单/a nbsp;nbsp; a href#个人中心/a /body /html5. 核心登录 Servlet LoginServlet.javajava运行package com.shop.servlet; import com.shop.entity.User; import com.shop.util.JDBCUtil; 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 javax.servlet.http.HttpSession; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; WebServlet(/loginServlet) public class LoginServlet extends HttpServlet { Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 解决 POST 请求中文乱码 request.setCharacterEncoding(UTF-8); // 2. 获取表单参数 String username request.getParameter(username); String password request.getParameter(password); Connection conn null; PreparedStatement pstmt null; ResultSet rs null; User user null; try { // 3. 获取连接、编写查询 SQL conn JDBCUtil.getConnection(); String sql select id,username,password from shop_user where username? and password?; pstmt conn.prepareStatement(sql); pstmt.setString(1, username); pstmt.setString(2, password); // 4. 执行查询 rs pstmt.executeQuery(); if (rs.next()) { user new User(); user.setId(rs.getInt(id)); user.setUsername(rs.getString(username)); user.setPassword(rs.getString(password)); } } catch (Exception e) { e.printStackTrace(); } finally { // 5. 关闭资源 JDBCUtil.close(conn, pstmt, rs); } // 6. 登录逻辑判断 if (user ! null) { // 登录成功存入 Session转发到首页 HttpSession session request.getSession(); session.setAttribute(loginUser, user); request.getRequestDispatcher(index.jsp).forward(request, response); } else { // 登录失败带回提示转发回登录页 request.setAttribute(msg, 用户名或密码错误请重新输入); request.getRequestDispatcher(login.jsp).forward(request, response); } } Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }六、部署运行步骤把mysql-connector-java-8.x.jar放到WEB-INF/lib修改JDBCUtil里的 MySQL 账号密码为自己本地的Tomcat 配置项目启动服务器访问地址plaintexthttp://localhost:8080/项目名/login.jsp测试账号admin / 123456七、核心知识点总结POST 提交密码不在地址栏更安全适合登录表单乱码解决request.setCharacterEncoding(UTF-8);只对 POST 有效Session 作用保存登录用户整站共享做登录状态保持请求转发地址栏不变携带 request 数据跳转页面Servlet 单例不要在 Servlet 定义成员变量避免线程安全问题