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

在这里插入图片描述

File 菜单栏里选择 Project Structure

在这里插入图片描述

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

在这里插入图片描述
点击 OK
在这里插入图片描述
创建结果如图:

在这里插入图片描述

2. 配置 Tomcat 服务器

启动按钮旁边,点击 Edit Configurations

在这里插入图片描述

添加 Tomcat Server > Local

在这里插入图片描述

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

在这里插入图片描述
Project Settings 选择 Artifacts,添加 Web Application Exploded,选择 From Modules

在这里插入图片描述
后面全部点击 OK
在这里插入图片描述

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

在这里插入图片描述

3. 引入 MySQL 连接器依赖

pom.xml 中添加以下依赖:

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

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

在这里插入图片描述
安装成功如图:

在这里插入图片描述


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

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

在这里插入图片描述

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

java 目录下创建 com > example > utils 文件夹下工具类文件 DBUtil.java
在这里插入图片描述
在这里插入图片描述

编写 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

在这里插入图片描述

文件内容:

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 替换为实际的数据库账号、密码。

在这里插入图片描述



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

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

web 目录下创建 login.jsp 文件。
在这里插入图片描述
编写代码:

<%@ 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>

在这里插入图片描述

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>

在这里插入图片描述

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

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

在这里插入图片描述

在这里插入图片描述

编写 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>

在这里插入图片描述

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

在这里插入图片描述

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>

在这里插入图片描述


五、启动和测试

启动项目。
在这里插入图片描述

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

看到我们首页自动跳转的登录页。
在这里插入图片描述
输入错误的账号或密码时,显示 "账号或密码错误!"

在这里插入图片描述

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

在这里插入图片描述


六、常见问题

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 自动导入的。

在这里插入图片描述

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

在这里插入图片描述

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

在IntelliJ IDEA中创建一个基于Servlet登录页面通常涉及到以下几个步骤: 1. **设置项目结构**: 确保你的项目有一个合适的Web模块,如Spring MVC、Java Servlets等。如果你使用的是标准的Java Servlets,不需要额外配置。 2. **创建Servlet**: - 在IDEA中,导航到"New" -> "Other" -> "Java" -> "Servlet"。 - 输入Servlet的名称(例如LoginServlet),然后点击"Finish"。这会在对应的src/main/webapp/WEB-INF目录下生成一个名为LoginServlet.java的文件。 3. **编写Servlet代码**: 在`LoginServlet.java`中,你需要实现`HttpServlet`接口并覆盖`doGet()`` doPost()`方法。例如,你可以创建一个表单处理逻辑,接收用户输入的用户名密码,然后检查是否匹配预先设定的账户信息。 ```java import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class LoginServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 显示登录表单 response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<form method='post'>"); out.println("<input type='text' name='username'/><br>"); out.println("<input type='password' name='password'/><br>"); out.println("<input type='submit' value='Login'/></form>"); out.println("</body></html>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); // 这里只是一个示例,实际应用会连接数据库验证 if ("admin".equals(username) && "123456".equals(password)) { // 登录成功,跳转到其他页面或显示消息 response.sendRedirect("/success.html"); } else { // 登录失败,显示错误消息 response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<h1>Login failed.</h1>"); } } } ``` 4. **部署Servlet**: - 将`LoginServlet`添加到web.xml文件(如果还没有的话)的< servlet-mapping >标签中,指定URL映射。 5. **访问登录页面**: 通过浏览器访问`http://localhost:8080/your-app-context-path/LoginServlet`,可以看到登录表单。提交表单后,服务器会根据POST请求处理逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Damon小智

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值