Struts2深入探索及雜項
- 缺省參數的配置:在classes/struts.properties中覆蓋,其中如果需要struts支持中文,需要覆寫struts.i18n.encoding=GBK;也可以在struts.xml中使用<constant>來指定。兩種方式最好始終只使用一種。
- 團隊開發:
- 名字空間:在package中可以定義namespace,便于團隊分模塊開發,form提交的時候需要提交到namespaceName/actionName中,如果在名稱空間下面不存在指定的action,則程序會嘗試在根目錄下去尋找同名的action。
- struts.xml的內容分離:在struts.xml中使用<include file="filename" />來引入子文件,在項目比較大的情況下這種配置文件的部署方式條理比較清晰。
- 國際化:message.properties中定義了全局的信息鍵值對,國際化中支持中文的文件應該命名為message_zh_CN.properties,同時還存在包級別的message和類級別的message,分別命名為package_zh_CN.properties和className_zh_CN.properties,優先級別依次遞增。
使用這些鍵值對的方法:
- Action中直接使用String getText(String key,String[] param)
- validation.xml中<message key="keyname" />
- jsp頁面中也通過<s:textfield key="keyname" />來指定
- 防止重復提交表單-tokenfilter,token需要顯式包含在filter-stack中。同時在form中增加<s:token>控件。如果表單被重復提交,則Action返回一個"invalid.token"的result
- 模型驅動和屬性驅動:使用頁面控件和Action屬性直接關聯注入的方式是屬性驅動,使用純業務類,并通過Action取得前臺輸入數據則稱之為模型驅動。模型驅動能提供更好的解耦。在struts中是使用了一個名為modelDrivenFilter的過濾器來實現的,Action需要實現com.opensymphony.xwork2.ModelDriven<T>接口,覆寫getModel()方法并返回一個T類型的實例。不過遺憾的是,這個模型似乎不能和spring,hibernate等框架很好的結合。
- com.opensymphony.xwork2.Preparable接口提供了一種在進入Action之前執行業務邏輯的可能性。實現了該接口的Action會在所有該Action的邏輯之前執行覆蓋上述接口的prepare()方法內的邏輯。
- <s:fielderror><s:param>name可以指定到底是哪個控件的錯誤.
- struts中訪問servlet容器底層內容:
- ActionContext類能獲取HttpServletRequest對象,進而獲得session內容
- ServletActionContext類提供了一些靜態函數,能獲得Request及Response對象,從而可以設置目標頁面的request內容及cookie內容
- ServletRequestAware、ServletResponseAware、ServletContextAware接口可以獲取注入的響應容器對象
- 動態方法調用:
- 頁面指定:在頁面form的action中寫ActionName!MethodName.action的話,就會調用相應Action對應類中的名為MethodName的方法,而不調用Execute()方法。
- 通配符:在struts.xml中配置Action可以使用通配符<Action name="*Login" class="LoginAction" method={1}>,則在頁面上如果提交到"helloLogin"的話,會執行LoginAction中的hello方法。這種方法看起來比較靈活,一次配置可以解析多個Action,但是用起來容易出錯,而且過度使用可能會有多個Action被匹配的情況,需要慎用。
- 全局異常配置:在struts.xml中配置全局異常可以對流程中拋出的異常進行統一入口的處理??梢越Y合用戶權限驗證的過濾器使用。
posted on 2009-02-13 08:34 bacon 閱讀(1725) 評論(0) 編輯 收藏 所屬分類: J2EE