当前位置: 首页 > news >正文

用 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 定义成员变量,避免线程安全问题
http://www.jsqmd.com/news/823788/

相关文章:

  • 南昌考点 SCMP 证书关于(含金量和通过率及费用)详细解读 - 众智商学院课程中心
  • Arduino SAMD/M4开发板Bootloader详解:UF2与BOSSA原理、烧录与排错指南
  • 免缝LED腕带:用导电布胶带轻松入门电子织物制作
  • 基于ESP32与3D打印的48km/h开源遥控赛车全栈开发指南
  • 个人冲刺第一阶段 培训管理子系统——课程管理与培训管理模块典型用户与场景分析
  • FModel终极指南:免费快速提取虚幻引擎游戏资源的完整解决方案
  • 基于 Simulink 的载波移相(PS-SPWM)级联 H 桥(CHB)双向 DC/AC 逆变器实战教程
  • ENS160气体传感器:从MOX原理到物联网空气质量监测实战
  • 论文初稿完成后才是真正的开始
  • 在VS Code中结合Taotoken API快速构建AI代码助手插件
  • 开源GPT-4 API客户端深度解析:架构、实现与生产实践
  • STM32智能小车开发实战:从硬件设计到PID算法与物联网控制
  • 2026年05月锦州豆制品热销榜:口碑五香豆制品经销推荐,豆干/豆腐/绢豆腐/内酯豆腐/五香豆干/千张,豆制品公司推荐 - 品牌推荐师
  • 安克创新:从‘浅海’到‘深海’,多元化发展背后的挑战与机遇
  • 搞可靠性就是浪费钱?
  • 思源宋体CN完整指南:7种字重免费字体如何快速提升你的中文设计质量
  • 基于MCP协议构建AI驱动的SEO智能分析工作流
  • 革命性金融图表库架构升级:Lightweight Charts实现企业级性能飞跃与模块化设计突破
  • PlayAI多语种翻译引擎深度拆解(支持中英日韩法西德俄阿葡意西语,含离线模式)
  • 半夜三点线上崩了,AI替我背了锅——用AI排错,五分钟定位三年老bug
  • Cerebras上市首日暴涨68.15%,3C基金早期投资获数十倍回报!
  • 3步实战:GroundingDINO配置优化全攻略
  • 3分钟实战手册:用BilibiliDown打造你的B站离线媒体库
  • 2026年|论文党必备!8款好用的降AI工具,AI率降低80% - 降AI实验室
  • 通过HermesAgent自定义提供商接入Taotoken大模型服务
  • BBDown深度解析:B站视频下载的终极方案与技术实践
  • STM32串口通信全解析:从理论到蓝桥杯竞赛实战
  • 基于树莓派与PiTFT打造3D打印无线控制中心:OctoPrint部署与触摸屏集成
  • Vue项目集成海康威视NVR多通道视频预览:从环境配置到流畅播放的实战指南
  • 2026年网文创作效率实战:我的AI辅助写作工具链搭建与踩坑记录