Java基于Servlet和JSP實(shí)現(xiàn)登錄功能
引言
在 Web 開發(fā)中,用戶登錄功能是非常常見的模塊之一。本文將通過使用 Java Servlet 和 JSP 實(shí)現(xiàn)一個簡單的用戶登錄功能,展示如何創(chuàng)建登錄頁面、處理用戶登錄請求,并使用數(shù)據(jù)庫驗證用戶信息。還將介紹如何在 IntelliJ IDEA 中創(chuàng)建 Servlet 項目,引入 MySQL 連接器,并將 login.jsp 設(shè)置為項目的默認(rèn)主頁。
一、開發(fā)目標(biāo)
1. 開發(fā)環(huán)境
- 開發(fā)工具: IntelliJ IDEA
- 開發(fā)語言: Java
- Web 容器: Apache Tomcat
- 數(shù)據(jù)庫: MySQL
- JDK 版本: JDK 8 或以上
- 依賴管理: Maven
2. 目標(biāo)功能
實(shí)現(xiàn)用戶在login.jsp輸入賬號密碼后跳轉(zhuǎn)到result.jsp的結(jié)果頁,并提示登錄是否成功。
3. 目標(biāo)項目結(jié)構(gòu)
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
二、創(chuàng)建 Servlet JSP 項目
1. 創(chuàng)建 Maven 項目
打開 IntelliJ IDEA,選擇 New Project,填寫項目名稱,選擇 Maven,點(diǎn)擊 Create。

File 菜單欄里選擇 Project Structure。

Project Settings 選擇 Modules,點(diǎn)擊上方加號,新增一個 Web 模塊。

點(diǎn)擊 OK。

創(chuàng)建結(jié)果如圖:

2. 配置 Tomcat 服務(wù)器
啟動按鈕旁邊,點(diǎn)擊 Edit Configurations。

添加 Tomcat Server > Local。

如果下方有紅色提示,請點(diǎn)擊 Fix。

Project Settings 選擇 Artifacts,添加 Web Application Exploded,選擇 From Modules。

后面全部點(diǎn)擊 OK。

回到 Deployment 配置,將 Application context 的路徑設(shè)置為 /。

3. 引入 MySQL 連接器依賴
在 pom.xml 中添加以下依賴:
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
</dependencies>
右鍵點(diǎn)擊項目根目錄,選擇 Maven > Reload Project 更新依賴。

安裝成功如圖:

三、配置數(shù)據(jù)庫連接與表結(jié)構(gòu)
1. 創(chuàng)建數(shù)據(jù)庫與用戶表
創(chuàng)建 servlet_study 數(shù)據(jù)庫,新建 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. 配置數(shù)據(jù)庫工具類 (DBUtil.java)
java 目錄下創(chuàng)建 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. 創(chuàng)建數(shù)據(jù)庫配置文件 (db.properties)
src > main > java > resources 目錄下創(chuàng)建數(shù)據(jù)庫配置文件 db.properties。

文件內(nèi)容:
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_username 和 your_password 替換為實(shí)際的數(shù)據(jù)庫賬號、密碼。

四、編寫登錄頁面與接口代碼
1. 創(chuàng)建登錄頁面 (login.jsp)
web 目錄下創(chuàng)建 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>
<label for="password">密碼:</label>
<input type="password" id="password" name="password" required>
<input type="submit" value="登錄">
</form>
</body>
</html>

2. 創(chuàng)建登錄結(jié)果頁面 (result.jsp)
web 目錄下創(chuàng)建 result.jsp 文件。
編寫代碼:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>登錄結(jié)果</title>
</head>
<body>
<h2>登錄結(jié)果</h2>
<%
String message = (String) request.getAttribute("message");
%>
<p><%= message %></p>
<a href="/login.jsp" rel="external nofollow" >返回登錄頁面</a>
</body>
</html>

3. 創(chuàng)建后端 Servlet 接口 (LoginServlet.java)
src/main/java 下創(chuàng)建新的 java 類 LoginServlet.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 文件,可以看到已經(jīng)沒有報錯了。

4. 編輯配置文件 (web.xml)
web.xml 里設(shè)置首頁為 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/
看到我們首頁自動跳轉(zhuǎn)的登錄頁。

輸入錯誤的賬號或密碼時,顯示 "賬號或密碼錯誤!"。

輸入正確的賬號密碼時,顯示 "登錄成功!"。

六、常見問題
1. jsp頁面報404錯誤
解決方法:
① 檢查路徑是否正確;
② Tomcat 的Deployment 配置里 Application context 的路徑設(shè)置為 /(參考文章里配置 Tomcat 的最后一步)
2. /Login接口報404錯誤
解決方法:
① 檢查接口上方注解內(nèi)url是否正確;
② web.xml 文件是否正確配置(參考第四章第4節(jié)配置文件)
3. 連接不上數(shù)據(jù)庫
解決方法:
① 檢查賬號、密碼、數(shù)據(jù)庫連接信息 (db.properties) 有沒有寫錯;
② Tomcat 運(yùn)行的 jar 包來自其自身的libs文件夾,需要把 mysql-connector-java.jar 拷貝到 Tomcat 的安裝路徑下的 lib 文件夾下面。
mysql-connector-java.jar 在 external libraries 目錄下,它是由 Maven 自動導(dǎo)入的。

復(fù)制到 Tomcat 的安裝路徑下的 lib 文件夾下面。

重新啟動項目,即可順利連接數(shù)據(jù)庫。
以上就是Java基于Servlet和JSP實(shí)現(xiàn)登錄功能的詳細(xì)內(nèi)容,更多關(guān)于Java Servlet和JSP登錄的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java實(shí)現(xiàn)發(fā)送email小案例
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)發(fā)送email小案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-02-02
SpringBoot+JSON+AJAX+ECharts+Fiddler實(shí)現(xiàn)前后端分離開發(fā)可視化
這篇文章主要介紹了SpringBoot+JSON+AJAX+ECharts+Fiddler實(shí)現(xiàn)前后端分離開發(fā)可視化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
SpringSecurity集成第三方登錄過程詳解(最新推薦)
在ThirdAuthenticationFilter 類的attemptAuthentication()方法中,我們通過authType類型,然后創(chuàng)建對應(yīng)的Authentication實(shí)現(xiàn)來實(shí)現(xiàn)不同方式的登錄,下面給大家分享SpringSecurity集成第三方登錄過程,感興趣的朋友一起看看吧2024-05-05
Java面試題 從源碼角度分析HashSet實(shí)現(xiàn)原理
這篇文章主要介紹了Java面試題 從源碼角度分析HashSet實(shí)現(xiàn)原理?,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07
java 字符串內(nèi)存分配的分析與總結(jié)(推薦)
下面小編就為大家?guī)硪黄猨ava 字符串內(nèi)存分配的分析與總結(jié)(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08
SPRINGBOOT讀取PROPERTIES配置文件數(shù)據(jù)過程詳解
這篇文章主要介紹了SPRINGBOOT讀取PROPERTIES配置文件數(shù)據(jù)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12

