從零建立最簡 Struts 2 應用,記錄關鍵差異點與核心組件:struts.xml 放置位置、FreeMarker 必備、FilterDispatcher 請求處理、<package> 節點、Session Map 操作、統一前綴標籤庫、國際化配置、XWork 驗證框架整合。
struts.xml 放置位置Struts 1 放 WEB-INF/,Struts 2 **必須放 WEB-INF/classes/**。否則報錯:There is no Action mapped for namespace / and action name Login。因未在 web.xml 指定,ClassLoader 從 classpath 載入。
最簡應用也需 freemarker-xxx.jar,UI 標籤依賴 FreeMarker ftl 模板。
FilterDispatcher 處理所有請求url-pattern: /*,自動將 *.action 轉給業務 Action。
<package> 節點包裹 <action>必須指定 name 屬性(自定義命名),與 Java 套件無關。
ActionContext.getContext().getSession() 返回 Map,直接當 HttpSession 用。Struts 2 攔截器自動完成 Map ↔ HttpSession 轉換。
屬性值存放於 ValueStack(名為 struts.valueStack),類型為 ValueStack。感覺資料與控制器混雜,受 Struts 1 ActionForm 影響。
s:JSP 頁面:<%@taglib prefix="s" uri="/struts-tags"%>。不再像 Struts 1 分 5 類命名空間,功能更強。
struts.properties 指定 struts.custom.i18n.resources=messageResource,classpath 下尋找 messageResource_語言_國家.properties。輸出:<s:text name="key"> 或 <s:property value='%{getText("key")}'/>。
支援 JSP 頁面臨時載入資源檔,也支援全域屬性載入(上條即全域方式)。
ActionSupport 實作 validate(),錯誤放入 fieldErrors,OGNL 輸出,轉向 input 邏輯視圖ActionSupport**無需實作 validate()**,寫 ActionName-validation.xml 放同目錄即可。本質使用 XWork 驗證框架<s:form> 預設具備輸出驗證錯誤能力