用 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
二、功能整体流程
- 用户访问登录页面
login.jsp,输入用户名、密码 - 点击提交表单,以 POST 方式提交到 LoginServlet
- Servlet 获取表单参数,解决中文乱码
- 通过 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');
四、项目结构
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>
<a href="#">我的订单</a>
<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);
}
}
六、部署运行步骤
- 把
mysql-connector-java-8.x.jar放到WEB-INF/lib - 修改
JDBCUtil里的 MySQL 账号密码为自己本地的 - Tomcat 配置项目,启动服务器
- 访问地址:
plaintext
http://localhost:8080/项目名/login.jsp
- 测试账号:
admin / 123456
七、核心知识点总结
- POST 提交:密码不在地址栏,更安全,适合登录表单
- 乱码解决:
request.setCharacterEncoding("UTF-8");只对 POST 有效 - Session 作用:保存登录用户,整站共享,做登录状态保持
- 请求转发:地址栏不变,携带 request 数据跳转页面
- Servlet 单例:不要在 Servlet 定义成员变量,避免线程安全问题
更多推荐




所有评论(0)