首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JavaWeb 入門實戰:從零構建簡單登錄註冊系統(JSP + Servlet + MySQL)

     編輯:Java 綜合教學

專案概覽

本文演示一個極簡的 JavaWeb 登錄/註冊流程,涵蓋:

  • 資料庫設計(MySQL)
  • 分層架構:Model / DAO / Service / Servlet / JSP
  • 連接池與工具類封裝
  • 前後端交互與編碼處理

資料庫準備

CREATE DATABASE bookstore CHARSET utf8mb4;
USE bookstore;
CREATE TABLE student (
    name VARCHAR(50) PRIMARY KEY,
    password VARCHAR(50) NOT NULL
);
INSERT INTO student VALUES ('admin','123456'),('test','abcdef');

分層代碼結構

cn.edu.hpu
├── model.Student           // 實體類,對應表字段
├── dao.DBUtil              // 連接工具:載入驅動、獲取連接、關閉資源
├── dao.StudentDAO          // 介面:add(), checkLogin()
├── dao.impl.StudentDAOImpl // 實現:PreparedStatement 防注入
├── service.UserService     // 介面
├── service.impl.UserServiceImpl // 業務邏輯,調用 DAO
├── servlet.RegisterServlet // 處理註冊 POST
├── servlet.LoginServlet    // 處理登錄 POST
└── web/*.jsp               // 頁面:register.jsp, login.jsp, success.jsp

關鍵代碼片段

DAO 實現(核心邏輯)

public boolean add(Student s) {
    String sql = "INSERT INTO student(name,password) VALUES(?,?)";
    try (Connection c = DBUtil.getConn(); PreparedStatement ps = c.prepareStatement(sql)) {
        ps.setString(1, s.getName()); ps.setString(2, s.getPassword());
        return ps.executeUpdate() > 0;
    } catch (SQLException e) { throw new RuntimeException(e); }
}

public boolean checkLogin(String name, String pwd) {
    String sql = "SELECT 1 FROM student WHERE name=? AND password=?";
    try (Connection c = DBUtil.getConn(); PreparedStatement ps = c.prepareStatement(sql)) {
        ps.setString(1, name); ps.setString(2, pwd);
        return ps.executeQuery().next();
    } catch (SQLException e) { throw new RuntimeException(e); }
}

Servlet 處理請求

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        req.setCharacterEncoding("UTF-8");
        String name = req.getParameter("username");
        String pwd  = req.getParameter("password");
        boolean ok = new UserServiceImpl().login(name, pwd);
        if (ok) {
            req.getSession().setAttribute("user", name);
            resp.sendRedirect("success.jsp");
        } else {
            req.setAttribute("msg", "用戶名或密碼錯誤");
            req.getRequestDispatcher("login.jsp").forward(req, resp);
        }
    }
}

JSP 頁面要點

  • 頁面指令:<%@ page contentType="text/html;charset=UTF-8" %> 防亂碼。
  • 表單 method="post",action 指向 Servlet 路徑。
  • 使用 EL 表達式 ${msg} 顯示錯誤提示。

常見坑與最佳實踐

問題解決
中文亂碼全鏈路 UTF-8:DB、連接 URL 加 characterEncoding=utf8、JSP pageEncoding、Servlet req.setCharacterEncoding
SQL 注入全程使用 PreparedStatement 佔位符
資源洩漏try-with-resources 自動關閉 Connection/Statement/ResultSet
密碼明文實戰務必用 BCrypt/Argon2 加鹽哈希存儲
路徑大小寫Linux 區分大小寫,包名、文件名、web.xml 映射保持一致

擴展方向

  • 引入連接池(Druid/HikariCP)替換簡易 DBUtil。
  • 加入驗證碼、Token 防重複提交。
  • 使用 Filter 統一登錄攔截、編碼過濾。
  • 遷移至 Spring Boot + MyBatis/ JPA 簡化樣板代碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved