Struts2工作原理和框架扩展点
http://www.cnblogs.com/winstonyan/archive/2011/11/13/struts2_flow_and_extends.html
框架主要涉及技術:Spring + Struts2 + Hibernate + Freemarker
我們先看看Struts2 工作原理圖,這樣才方便考慮在設計開發框架時有那些擴展點:
在web.xml配置這些Filter在Struts自身的Filter之前。 包括全局缺省的ActionFilter、語言編碼LocaleFilter、重定向UrlRewriteFilter等等。
Struts的Action預處理過濾器。我的做法是寫一個子類繼承它,如CoreStrutsPrepareFilter,這樣我可以在子類中實現諸如
動態加載struts.xml和指定目錄指定規則的struts-xxx.xml等。
同樣是使用寫子類繼承它,如CoreStrutsExecuteFilter,寫根據條件(如Struts相關的配置文件改動了)重新生成ExecuteOperations
(即Dispatcher的高級封裝)。
攔截器是Struts2的精華。在這里處理包括異常統一處理、權限控制、參數設置、訪問歷史和某些特定功能的攔截式保存等處理。
放置若干處理請求的指定包路徑的方法,我設計了BaseAction和GenericAction,BaseAction處理全局的Action公共處理,包括繼承ActionSupport,
實現InitializingBean、ModelDriven(這樣可以做一些初始化操作以及得到Struts2模型驅動的相關功能)。
GenericAction是基于泛型來寫的,實現了增刪改查之類的公共方法。還有其它若干的項目相關的公共XXXAction,則根據需要設計。
在Action的Method中,可以調用若干個Manager方法來實現相關業務,事務是寫在Manager層的,用的Spring的聲明式事務。
由于系統用的是Freemarker模板技術,所以解析模板的方式有兩種:1)通過Struts自帶的FreemarkerManager;2)通過FreeMarkerTemplateUtils
來解析。為了方便擴展(比如寫一些自定義的Freemarker方法等),我對兩種方式都寫了子類進行擴展。
CoreFreemarkerManager在struts.xml中配置:
<constant name="struts.freemarker.manager.classname"? value="com.xxxx.framework.core.freemarker.CoreFreemarkerManager" />
CoreFreeMarkerTemplateUtils則就是一個工具類了。一般適用于CMS、郵件模板解析等。
AOP的點也就是before和after,而after時的操作一般就是寫日志了。
http://marshal.easymorse.com/index.html%3Fp=177.html
方便為Struts2擴展功能。
主要作用:
- 簡化開發,提高開發效率,有人寫插件,封裝技術細節,其他人使用;
- 代碼復用,封裝的插件,可以重復利用;
- 提高軟件開發的質量,插件被反復使用,bug應該較少。
Struts2 插件的文檔:http://struts.apache.org/2.0.11/docs/plugins.html
Struts2的插件機制,類似eclipse或者firefox的插件機制,和Struts1.x有很大區別。
Struts2插件由單一的jar文件組成,包括:類文件和配置文件(擴展、替代或者添加到已有的框架功能中)。
安裝插件:通過復制(并且復制依賴jar文件)到classpath。
配置插件:插件的jar文件中包含struts-plugin.xml,和struts.xml文件格式相同。
該配置文件可以:
- 定義新的package、result、interceptor、action
- 覆蓋框架的常量
- 引入新的擴展點實現類
框架中一些受歡迎,但是可選的屬性通過插件方式發布。應用程序發布時可以留下所有插件,也可以只包含其中使用到的。插件可以包含在原始代碼中,也可以是第三方發布的。
注意:插件的加載沒有特定次序。插件不能互相依賴。插件可以依賴struts2核心部分的類,但是不能依賴其他插件的類。
框架加載配置文件的次序:
- struts-default.xml (bundled in the Core JAR)
- struts-plugin.xml (as many as can be found in other JARs)
- struts.xml (provided by your application)
配置文件都加載完畢后,各個插件才可以使用這些配置。
擴展點:
- com.opensymphony.xwork2.ObjectFactory:單例的,用于創建action、result和interceptor,屬性是struts.objectFactory
- com.opensymphony.xwork2.ActionProxyFactory:創建Action的代理
- com.opensymphony.xwork2.util.ObjectTypeDeterminer:確定數據類型
- org.apache.struts2.dispatcher.mapper.ActionMapper:確定請求對應的action
- org.apache.struts2.dispatcher.multipart.MultiPartRequest:處理文件上傳的請求
- org.apache.struts2.views.freemarker.FreemarkerManager:加載和處理freemarker的模板
- org.apache.struts2.views.velocity.VelocityManager:加載和處理velocity的模板
總結
以上是生活随笔為你收集整理的Struts2工作原理和框架扩展点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阅读openjdk源代码
- 下一篇: Spring与Struts2整合的两种解