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

Java Web MVC 設計模式詳解:從 Model 1 到 Model 2 實戰

     編輯:Java 綜合教學

Java Web MVC 設計模式詳解:從 Model 1 到 Model 2 實戰

一、MVC 核心分工

層次技術實現職責
視圖層JSP界面展示,HTML 渲染
模型層JavaBean數據封裝,業務邏輯/數據庫交互
控制層Servlet請求分發,流程控制,視圖跳轉

兩種 MVC 模式演進

Model 1:頁面中心架構(早期)

  • JSP 獨攬大權:同時承擔控制器(流程跳轉、請求參數處理)和視圖職責。
  • 大量 Java 腳本嵌入 JSP(<% ... %>),導致代碼耦合度極高。
  • 缺點:代碼重用性差、維護困難、前後端協作混亂、微小修改牽一髮動全身。
  • 優點:簡單直觀,適合極小型項目或原型驗證。

Model 2:Servlet 作為控制器(標準)

  • 分層清晰:Servlet 專注控制調度,JavaBean 處理業務/數據,JSP 純粹渲染視圖。
  • 流程:請求 → Servlet → 調用 JavaBean → 選擇 JSP → 響應。
  • 優點:職責分離,易擴展、易測試、易維護,符合「高內聚、低耦合」原則。
  • 所有現代 Web 框架(Struts 1/2, Spring MVC)本質都是 Model 2 的實現。

實戰案例:用戶登錄模塊

1. 視圖層

login.jsp - 登錄表單,提交到 /loginConf

<form action="../loginConf" method="post">
    <table>
        <tr><td>用戶名:</td><td><input name="uname"/></td></tr>
        <tr><td>密碼:</td><td><input type="password" name="password"/></td></tr>
        <tr><td colspan="2"><input type="submit" value="提交"/> <input type="reset" value="重置"/></td></tr>
    </table>
</form>

login_success.jsp - 登錄成功頁,檢查 Session 防止直接訪問

<% if(session.getAttribute("login")!=null && session.getAttribute("login").equals("true")) { %>
    <center><h2>登陸成功</h2></center>
<% } else { %>
    <jsp:forward page="login.jsp"/>
<% } %>

login_failure.jsp - 失敗提示頁

2. 控制層

LoginConf Servlet - 核心調度器

@WebServlet("/loginConf")
public class LoginConf extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        // 1. 編碼設置
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");
        
        // 2. 獲取參數
        String uname = request.getParameter("uname");
        String password = request.getParameter("password");
        
        // 3. 業務委派
        LoginCheck lc = new LoginCheck();
        HttpSession session = request.getSession();
        
        if (lc.isLogin(uname, password)) {
            session.setAttribute("login", "true");
            request.getRequestDispatcher("MVC/login_success.jsp").forward(request, response);
        } else {
            request.getRequestDispatcher("MVC/login_failure.jsp").forward(request, response);
        }
    }
    protected void doPost(...) { doGet(request, response); }
}

3. 模型層

LoginCheck JavaBean - 業務邏輯封裝

public class LoginCheck {
    public boolean isLogin(String uname, String password) {
        // 實際項目中應調用 Service -> DAO 查詢數據庫
        return "wei".equals(uname) && "123".equals(password);
    }
}

關鍵設計要點總結

  1. Servlet 只做調度:不包含具體業務邏輯,不直接操作數據庫。
  2. JSP 禁用腳本:使用 EL 表達式、JSTL 標簽替代 <% %>。
  3. JavaBean 封裝數據與業務:後續可拆分為 Service + DAO 進一步解耦。
  4. 請求轉發:使用 RequestDispatcher.forward() 保持請求域數據,地址欄不變。
  5. Session 管理狀態:登錄標識存入 Session,成功頁校驗防越權訪問。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved