Java进阶-基于Servlet和JSP的登录功能实现

在 Web 开发中,用户登录功能是非常常见的模块之一。本文将通过使用 Java Servlet 和 JSP 实现一个简单的用户登录功能,展示如何创建登录页面、处理用户登录请求,并使用数据库验证用户信息。还将介绍如何在 IntelliJ IDEA 中创建 Servlet 项目,引入 MySQL 连接器,并将 login.jsp 设置为项目的默认主页。

一、开发目标

1. 开发环境

  • 开发工具: IntelliJ IDEA
  • 开发语言: Java
  • Web 容器: Apache Tomcat
  • 数据库: MySQL
  • JDK 版本: JDK 8 或以上
  • 依赖管理: Maven

2. 目标功能

实现用户在login.jsp输入账号密码后跳转到result.jsp的结果页,并提示登录是否成功。

3. 目标项目结构

servlet-study/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   ├── com/example/LoginServlet.java
│   │   │   └── com/example/utils/DBUtil.java
│   │   └── resources/
│   │       └── db.properties
├── webapp/
│   ├── login.jsp
│   ├── result.jsp
│   └── WEB-INF/
│       └── web.xml
└── pom.xml

二、创建 Servlet JSP 项目

1. 创建 Maven 项目

打开 IntelliJ IDEA,选择 New Project,填写项目名称,选择 Maven,点击 Create

image

File 菜单栏里选择 Project Structure

image

Project Settings 选择 Modules,点击上方加号,新增一个 Web 模块。

image

点击 OK
image

创建结果如图:

image

2. 配置 Tomcat 服务器

启动按钮旁边,点击 Edit Configurations

image

添加 Tomcat Server > Local

image

如果下方有红色提示,请点击 Fix

image

Project Settings 选择 Artifacts,添加 Web Application Exploded,选择 From Modules

image

后面全部点击 OK
image

回到 Deployment 配置,将 Application context 的路径设置为 /

image

3. 引入 MySQL 连接器依赖

pom.xml 中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.28</version>
    </dependency>
</dependencies>

右键点击项目根目录,选择 Maven > Reload Project 更新依赖。

image

安装成功如图:

image


三、配置数据库连接与表结构

1. 创建数据库与用户表

创建 servlet_study 数据库,新建 users 表。

CREATE DATABASE IF NOT EXISTS servlet_study DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE servlet_study;

CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO users (username, password) VALUES ('admin', 'root');

image

2. 配置数据库工具类 (DBUtil.java)

java 目录下创建 com > example > utils 文件夹下工具类文件 DBUtil.java
image

image

编写 DBUtil.java 文件。

package com.example.utils;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class DBUtil {
    private static String url;
    private static String username;
    private static String password;
    private static String driverClassName;

    static {
        try (InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties")) {
            Properties properties = new Properties();
            properties.load(input);
            url = properties.getProperty("jdbc.url");
            username = properties.getProperty("jdbc.username");
            password = properties.getProperty("jdbc.password");
            driverClassName = properties.getProperty("jdbc.driverClassName");
            Class.forName(driverClassName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }
}

3. 创建数据库配置文件 (db.properties)

src > main > java > resources 目录下创建数据库配置文件 db.properties

image

文件内容:

jdbc.url=jdbc:mysql://localhost:3306/servlet_study?useSSL=false&serverTimezone=UTC
jdbc.username=your_username
jdbc.password=your_password
jdbc.driverClassName=com.mysql.cj.jdbc.Driver

提示: 请将 your_usernameyour_password 替换为实际的数据库账号、密码。

image



四、编写登录页面与接口代码

1. 创建登录页面 (login.jsp)

web 目录下创建 login.jsp 文件。
image

编写代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
</head>
<body>
    <h2>用户登录</h2>
    <form action="/Login" method="post">
        <label for="username">账号:</label>
        <input type="text" id="username" name="username" required><br><br>

        <label for="password">密码:</label>
        <input type="password" id="password" name="password" required><br><br>

        <input type="submit" value="登录">
    </form>
</body>
</html>

image

2. 创建登录结果页面 (result.jsp)

web 目录下创建 result.jsp 文件。

编写代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <meta charset="UTF-8">
  <title>登录结果</title>
</head>
<body>
<h2>登录结果</h2>
<%
  String message = (String) request.getAttribute("message");
%>
<p><%= message %></p>
<a href="/login.jsp">返回登录页面</a>
</body>
</html>

image

3. 创建后端 Servlet 接口 (LoginServlet.java)

src/main/java 下创建新的 javaLoginServlet.java

image

image

编写 LoginServlet.java 代码:

package com.example;

import com.example.utils.DBUtil;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.sql.*;

@WebServlet(name = "LoginServlet", urlPatterns = "/Login")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        if (validateUser(username, password)) {
            req.setAttribute("message", "登录成功!");
        } else {
            req.setAttribute("message", "账号或密码错误!");
        }
        req.getRequestDispatcher("/result.jsp").forward(req, resp);
    }

    private boolean validateUser(String username, String password) {
        String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
        try (Connection connection = DBUtil.getConnection();
             PreparedStatement ps = connection.prepareStatement(sql)) {
            ps.setString(1, username);
            ps.setString(2, password);
            ResultSet rs = ps.executeQuery();
            return rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    }
}

新建的代码会有报错,我们需要在 pom.xml 文件里引入 javax 的包。

pom.xml 中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.28</version>
    </dependency>
</dependencies>

image

回到 LoginServlet.java 文件,可以看到已经没有报错了。

image

4. 编辑配置文件 (web.xml)

web.xml 里设置首页为 login.jsp,将 LoginServlet 的接口url /Login 配置到路由里。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.example.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/Login</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>
</web-app>

image


五、启动和测试

启动项目。
image

在浏览器中访问项目根路径:http://localhost:8080/

看到我们首页自动跳转的登录页。
image

输入错误的账号或密码时,显示 "账号或密码错误!"

image

输入正确的账号密码时,显示 "登录成功!"

image


六、常见问题

1. jsp页面报404错误

解决方法:
① 检查路径是否正确;
TomcatDeployment 配置里 Application context 的路径设置为 /(参考文章里配置 Tomcat 的最后一步)

2. /Login接口报404错误

解决方法:
① 检查接口上方注解内url是否正确;
web.xml 文件是否正确配置(参考第四章第4节配置文件)

3. 连接不上数据库

解决方法:
① 检查账号、密码、数据库连接信息 (db.properties) 有没有写错;
Tomcat 运行的 jar 包来自其自身的libs文件夹,需要把 mysql-connector-java.jar 拷贝到 Tomcat 的安装路径下的 lib 文件夹下面。

mysql-connector-java.jarexternal libraries 目录下,它是由 Maven 自动导入的。

image

复制到 Tomcat 的安装路径下的 lib 文件夹下面。

image

重新启动项目,即可顺利连接数据库。

posted @ 2024-11-21 23:37  Damon小智  阅读(24)  评论(0编辑  收藏  举报