abstract public class SafeAction extends Action {
protected Log log = LogFactory.getLog(this.getClass());
private static final String CONTENT_TYPE = "text/html; charset=GBK";
private TblConTxnLog tblConTxnLog = null;
// 核心關注點:這是什麼?
abstract public ActionForward safeExecute(
ActionMapping actionMapping,
ActionForm actionForm,
HttpServletRequest request,
HttpServletResponse response
) throws DomainException, IOException;
......
}
答案:是方法聲明,具體說是「抽象方法」聲明。
abstract 修飾符明確表示:此方法無方法體,強制子類實現public ActionForward 是返回類型,表示調用該方法後返回 ActionForward 類型的對象ActionMapping、ActionForm、HttpServletRequest、HttpServletResponsethrows DomainException, IOException 聲明拋出的受檢異常對比理解:
// 普通方法:有方法體 {}
public ActionForward execute(...) { return null; }
// 抽象方法:無方法體,以分號結束
abstract public ActionForward safeExecute(...);
Java 中方法返回類型可以是任意引用類型(類、接口、數組)或基本類型。
ActionForward 是一個類(Struts 1 框架核心類)return "hello"(返回 String 對象)、return new User()(返回 User 對象)本質相同子類實現時必須返回 ActionForward 實例或 null:
public class MyAction extends SafeAction {
@Override
public ActionForward safeExecute(ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse resp)
throws DomainException, IOException {
// 業務邏輯...
return mapping.findForward("success"); // 返回 ActionForward 實例
}
}
雖然代碼片段未直接展示匿名內部類,但 Struts 1 時代常見用法:
// 動態創建 Action 實例(罕見,通常配置在 struts-config.xml)
Action action = new SafeAction() {
@Override
public ActionForward safeExecute(ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse resp)
throws DomainException, IOException {
// 內聯實現邏輯
return mapping.findForward("success");
}
};
此時匿名內部類繼承 SafeAction 並實現抽象方法 safeExecute。
| 步驟 | 工具/動作 | 目標 |
|---|---|---|
| 1. 拆解語法元素 | IDE 高亮、Java 語法規範 | 識別修飾符、返回類型、方法名、參數列表、異常聲明 |
| 2. 查找類型定義 | Ctrl+點擊、Javadoc、源碼 | 確認 ActionForward、ActionMapping 等類的職責 |
| 3. 搜索實現類 | IDE「Find Implementations」 | 看子類怎麼實現該方法,理解業務流程 |
| 4. 閱讀框架文檔 | Struts 1 用戶指南 | 理解 Action 執行鏈路、ActionForward 轉發機制 |
| 5. 寫最小 Demo 驗證 | 新建類繼承 SafeAction 實現方法 | 通過編譯運行確認理解正確 |
RequestProcessor.process()
→ RequestProcessor.processActionPerform()
→ Action.execute() [模板方法]
→ SafeAction.execute() [最終調用 safeExecute()]
→ 子類 safeExecute() 實現
SafeAction 充當模板方法模式的中間層:在 execute() 中處理通用邏輯(日誌、編碼、事務、異常捕獲),將核心業務委託給抽象方法 safeExecute(),由具體 Action 實現。
safeExecute 是 抽象方法聲明,返回 ActionForward 類型對象引用