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

JSP + JavaBean + Servlet 經典三層架構實戰:用戶認證系統

     編輯:Java 綜合教學

專案概覽

項目技術棧
開發工具MyEclipse 10 / JDK 1.6 / Tomcat 7.0 (32位) / MySQL 5.7.13
運行環境Windows 10
核心功能用戶登錄、註冊、退出登錄
架構模式Model 2 (JSP 視圖 + Servlet 控制器 + JavaBean 模型 + JDBC 持久層)

系統架構設計

圖一:系統整體架構

系統架構圖 (原文圖片缺失,建議補全:瀏覽器 → JSP → Servlet → JavaBean → JDBC → MySQL)

圖二:邏輯層交互關系

邏輯關系圖 JSP 僅負責展示與收集參數,Servlet 接收請求分發業務,JavaBean 封裝數據訪問邏輯

核心代碼實現

1. 控制層:UserServlet 統一入口

@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getParameter("method");
        if ("login".equals(method))       login(req, resp);
        else if ("logout".equals(method)) logout(req, resp);
        else if ("register".equals(method)) register(req, resp);
        else resp.getWriter().println("invalid request!");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

    private void login(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if (username == null || password == null) {
            resp.sendRedirect("login.jsp"); return;
        }
        UserBean ub = new UserBean();
        if (ub.valid(username, password)) {
            req.getSession().setAttribute("username", username);
            resp.sendRedirect("welcome.jsp");
        } else {
            resp.sendRedirect("login.jsp");
        }
    }

    private void logout(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        req.getSession().removeAttribute("username");
        resp.sendRedirect("login.jsp");
    }

    private void register(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String username = req.getParameter("username");
        String pwd1 = req.getParameter("password1");
        String pwd2 = req.getParameter("password2");
        String email = req.getParameter("email");
        if (username == null || pwd1 == null || pwd2 == null || !pwd1.equals(pwd2)) {
            resp.sendRedirect("register.jsp"); return;
        }
        UserBean ub = new UserBean();
        if (!ub.isExist(username)) {
            ub.add(username, pwd1, email);
            resp.sendRedirect("login.jsp");
        } else {
            resp.sendRedirect("register.jsp");
        }
    }
}

2. web.xml 關鍵映射(避坑指南)

<servlet-mapping>
    <servlet-name>UserServlet</servlet-name>
    <url-pattern>/UserServlet</url-pattern>  <!-- 關鍵:去掉 /servlet 前綴 -->
</servlet-mapping>

血淚教訓:默認生成 /servlet/UserServlet 會導致轉發時 URL 變為 /servlet/welcome.jsp,Tomcat 找不到編譯類報 404。**務必手動移除 `/servlet` 前綴**。

3. 模型層:UserBean 封裝業務邏輯

public class UserBean {
    public boolean valid(String username, String password) {
        DBAccess db = new DBAccess();
        if (db.createConn()) {
            String sql = "SELECT * FROM userInfo WHERE username=? AND password=?";
            // 使用 PreparedStatement 防注入
            boolean valid = db.query(sql, username, password);
            db.closeAll(); return valid;
        }
        return false;
    }
    // isExist(), add() 同理...
}

4. 數據訪問層:DBAccess 封裝 JDBC 樣板

  • 連接管理:createConn()/closeConn()
  • 增刪改:update(sql)
  • 查詢:query(sql)/next()/getValue(field)
  • 資源釋放:Connection/Statement/ResultSet 逐級關閉

項目資源下載

避坑總結與進階建議

問題解決方案
URL 映射含 /servlet 導致轉發 404web.xml 中 去掉 /servlet 前綴
SQL 拼接注入風險全面改用 PreparedStatement + 參數綁定
資源未關閉洩漏連接finally 塊分別關閉 rs/stmt/conn,或用 try-with-resources (JDK7+)
密碼明文存儲引入 BCrypt/SCrypt 加鹽哈希
無驗證碼/限流防暴力破解登錄接口加圖形驗證碼 + IP 限流

架構演進方向

  1. 引入 Spring:IoC 管理 Bean、AOP 事務、統一異常處理
  2. ORM 升級:MyBatis/Hibernate 替換手寫 JDBC
  3. 前後端分離:JSP → Vue/React + RESTful API
  4. 安全框架:Shiro/Spring Security 替換手寫 Session 校驗

這個 Demo 雖簡陋,但完整展示了 Java Web 經典 MVC 的骨架與血肉。理解它,才能看清現代框架解決了什麼問題、怎麼解決的。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved