做 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 定义成员变量,避免线程安全问题
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐