ActionHandler 是一個輕量級的 Web 應用編程框架,旨在簡化 Servlet/JSP 開發中「請求分發、參數綁定、業務調用、視圖轉發」的樣板代碼。它不依賴重型容器,可直接部署在任何 Servlet 2.3+ 容器(Tomcat、JBoss、WebLogic 等)中。
Client Request
↓
GeneralHandleSvt (核心 Servlet,單例)
↓
解析 action 參數 → 查找 ActionHandler 實現類
↓
ActionHandler.execute(request, response) ← 開發者實現業務邏輯
↓
返回 Forward / Redirect / Stream 結果
↓
GeneralHandleSvt 執行轉發/重定向/流輸出
↓
Client Response
| 組件 | 職責 | 配置方式 |
|---|---|---|
GeneralHandleSvt |
統一入口,生命週期管理、異常捕獲、編碼過濾、Session 檢查 | web.xml 映射 *.do 或 /handler/* |
ActionHandler (接口) |
定義 execute(HttpServletRequest, HttpServletResponse) : ActionResult |
開發者實現,配置於 actionhandler.xml |
ActionResult |
封裝轉發路徑、重定向 URL、二進制流、JSON 等輸出類型 | 框架內置類型:ForwardResult、RedirectResult、StreamResult、JsonResult |
ActionHandlerFactory |
單例工廠,緩存 Handler 實例,支持熱加載 | 啟動時掃描 actionhandler.xml |
<?xml version="1.0" encoding="UTF-8"?>
<action-handlers>
<handler name="userLogin" class="com.example.handler.UserLoginHandler"/>
<handler name="userList" class="com.example.handler.UserListHandler">
<property name="pageSize" value="20"/>
</handler>
<handler name="fileDownload" class="com.example.handler.FileDownloadHandler"/>
</action-handlers>
public class UserLoginHandler implements ActionHandler {
@Override
public ActionResult execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
String username = req.getParameter("username");
String password = req.getParameter("password");
User user = userService.authenticate(username, password);
if (user != null) {
req.getSession().setAttribute("currentUser", user);
return new ForwardResult("/main.jsp");
} else {
req.setAttribute("error", "Invalid credentials");
return new ForwardResult("/login.jsp");
}
}
}
public interface ActionHandler {
ActionResult execute(HttpServletRequest request, HttpServletResponse response)
throws Exception;
}
| 方法 | 說明 |
|---|---|
init(ServletConfig) | 載入 actionhandler.xml,初始化工廠,註冊全局過濾器 |
service(req, resp) | 核心分發邏輯:提取 action 名 → 工廠獲取 Handler → 執行 → 處理 Result |
destroy() | 釋放工廠資源,關閉數據源連接池等 |
getHandler(String actionName) | 從工廠獲取 Handler 實例,支持別名映射 |
ForwardResult(String path):RequestDispatcher.forwardRedirectResult(String url):response.sendRedirectStreamResult(InputStream, String contentType, String fileName):文件下載JsonResult(Object data):自動序列化為 JSON(內置 JSON-lib/Gson)NullResult():Handler 已自行完成響應(如直接寫 OutputStream)actionhandler.xml 定義 <interceptor>,支持 Pre/Post 處理(登錄檢查、事務邊界、日誌、權限)。<exception-mapping> 將異常類型映射到錯誤頁/JSON 錯誤碼。ResourceBundle,ActionHandler 基類提供 getMessage(key, args...) 便捷方法。actionhandler.jar、依賴包放入 WEB-INF/lib。web.xml 註冊 GeneralHandleSvt,映射 *.do。actionhandler.xml 放入 WEB-INF/classes。ActionHandler 類,編譯部署。https://host:port/app/userLogin.do 驗證。ActionHandler 以「單 Servlet 入口 + 配置驅動 + 接口編程」三板斧,為中小型 Web 專案提供了比 Struts 1.x 更輕量、比裸 Servlet 更結構化的開發體驗。其核心優勢在於零侵入業務代碼、學習曲線平緩、易於單元測試(Mock Request/Response 即可)。對於存量維護專案,可作為 Struts 遷移 Spring MVC 的過渡層;對於新專案,建議直接採用 Spring Boot + WebFlux/MVC 獲得生態紅利。