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

Struts1 起源探秘(一):從 Servlet 痛點到框架誕生的演進之路

     編輯:Java 相關知識

在正式學習 Struts 1 之前,我們先通過三個版本的 Servlet 迭代,親歷「頁面跳轉控制」的演進歷程,理解框架誕生的必然性。

第一版:傳統 Servlet —— 類爆炸與代碼冗餘

文件結構:

第一版文件樹

核心問題

  • 配置冗餘:每個功能需在 web.xml 註冊 Servlet 及映射
  • 類爆炸:增刪改查各自一個 Servlet,隨業務增長難以管理
  • 代碼重複:參數獲取、業務調用、頁面跳轉邏輯高度雷同

AddUserServlet 示例

public class AddUserServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String username = request.getParameter("username");
        UserManager userManager = new UserManager();
        userManager.add(username);
        request.getRequestDispatcher("/add_success.jsp").forward(request, response);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { doGet(request, response); }
}

第二版:單一 Servlet + URL 路由 —— 解決類爆炸,引入靈活性危機

文件結構:

第二版文件樹

核心改進

  • 單一 TestServlet 處理所有 *.do 請求
  • 通過 request.getRequestURI() 截取路徑作為路由鍵
  • web.xml 僅需一組 Servlet 映射

TestServlet 核心邏輯

String uri = request.getRequestURI();
String path = uri.substring(uri.indexOf("/", 1), uri.indexOf("."));
String username = request.getParameter("username");
UserManager userManager = new UserManager();

if ("/servlet/addUser".equals(path)) {
    userManager.add(username);
    request.getRequestDispatcher("/add_success.jsp").forward(request, response);
} else if ("/servlet/delUser".equals(path)) {
    userManager.del(username);
    request.getRequestDispatcher("/del_success.jsp").forward(request, response);
} // ... 其他分支

新問題

路由邏輯硬編碼在 Servlet 內部,新增功能需修改源碼並重新編譯部署,失去靈活性。

第三版:引入 Action 介面 —— 初步解耦,擴展性仍受限

文件結構:

第三版文件樹

關鍵抽象

public interface Action {
    String execute(HttpServletRequest request, HttpServletResponse response);
}

各業務實現介面:

public class AddUserAction implements Action {
    public String execute(HttpServletRequest request, HttpServletResponse response) {
        String username = request.getParameter("username");
        new UserManager().add(username);
        return "/add_success.jsp"; // 返回轉向路徑
    }
}

Servlet 精簡為調度器

Action action = null;
if ("/servlet/addUser".equals(path)) action = new AddUserAction();
// ... 其他分支
String forward = action.execute(request, response);
request.getRequestDispatcher(forward).forward(request, response);

殘留問題

  • 路由映射仍為硬編碼 if-else 鏈
  • 轉向路徑散落在各 Action 實現類中,無法集中管理
  • 缺乏表單數據自動封裝、驗證等通用能力

抽象總結:Struts 1 的雛形

從三版迭代中提煉出的核心需求:

  1. 請求攔截與路由:URL 截取 → 映射配置(而非硬編碼)
  2. 表單數據綁定:自動封裝、類型轉換、驗證
  3. 業務邏輯解耦:Action 介面統一契約
  4. 結果視圖配置化:轉向資訊外置至 XML

這正是 Struts 1 框架的基因密碼!

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