三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

用 Servlet 实现商城系统用户登录

用 Servlet 实现商城系统用户登录

做 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

二、功能整体流程

  1. 用户访问登录页面login.jsp,输入用户名、密码
  2. 点击提交表单,以 POST 方式提交到 LoginServlet
  3. Servlet 获取表单参数,解决中文乱码
  4. 通过 JDBC 连接 MySQL,查询用户表是否存在该账号密码
  5. 校验成功:将用户信息存入 Session,请求转发跳转到商城首页
  6. 校验失败:转发回登录页,提示账号或密码错误

三、数据库准备

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');

四、项目结构

plaintext

JavaWeb-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?useSSL=false&serverTimezone=UTC"; 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 contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>商城登录</title> </head> <body> <h2>商城系统 - 用户登录</h2> <%-- 错误提示信息 --%> <div style="color: red">${msg}</div> <form action="loginServlet" method="post"> <p>用户名:<input type="text" name="username" placeholder="请输入用户名"></p> <p>密 码:<input type="password" name="password" placeholder="请输入密码"></p> <p><input type="submit" value="立即登录"></p> </form> </body> </html>

4. 商城首页 index.jsp

登录成功后跳转页面

jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <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> </html>

5. 核心登录 Servlet LoginServlet.java

java

运行

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); } }

六、部署运行步骤

  1. mysql-connector-java-8.x.jar放到WEB-INF/lib
  2. 修改JDBCUtil里的 MySQL 账号密码为自己本地的
  3. Tomcat 配置项目,启动服务器
  4. 访问地址:

plaintext

http://localhost:8080/项目名/login.jsp
  1. 测试账号:admin / 123456

七、核心知识点总结

  1. POST 提交:密码不在地址栏,更安全,适合登录表单
  2. 乱码解决request.setCharacterEncoding("UTF-8");只对 POST 有效
  3. Session 作用:保存登录用户,整站共享,做登录状态保持
  4. 请求转发:地址栏不变,携带 request 数据跳转页面
  5. Servlet 单例:不要在 Servlet 定义成员变量,避免线程安全问题
← 返回列表