Struts 是什么?

Struts 2 是一個(gè)雅致的,可擴(kuò)展的,用來(lái)建立企業(yè)級(jí)Java Web應(yīng)用程序的框架。
Struts 2 不但注重程序的開(kāi)發(fā)過(guò)程,更注重部署和后期維護(hù)。
Struts 2 來(lái)源于WebWork 2。
Struts 2 融合了Struts 和 WebWork的社區(qū)力量,是這兩個(gè)社區(qū)努力的結(jié)果。
Struts 2 非常容易使用。
Struts 2 最大可能的保留了和Strut 1.x的相似行。

Struts2 的特性有那些?

上面提到,Struts 2 關(guān)注開(kāi)發(fā),部署和后期維護(hù)三個(gè)方面。我們就從這三個(gè)方面說(shuō)明Struts 2 的新特性。

構(gòu)建
    上手非常容易,可以使用起步教程,模板工程或者M(jìn)aven原型建立Struts 2工程。(起步簡(jiǎn)單)
       Struts 2 的官方站點(diǎn)上有很多關(guān)于Struts 2入門(mén)的資料,
       Struts 2 的下載目錄中包含空白的模板工程(struts2-blank-2.x.war)和示例工程(struts2-showcase-2.x.war)可以參考。
       Maven 2 中有Struts 2 的項(xiàng)目模板,可以使用Maven 2 直接建立Struts 2 工程

    更好的設(shè)計(jì),Struts 2 中不想要要在在處理和HTTP相關(guān)的操作,自需要使用框架的接口即可。
       在Strut 2 中不再會(huì)涉及到諸如 HttpServletRequest, HttpServletResponse, HttpSession等Http相關(guān)的Servlet接口類,取而代之的是Struts 2 的接口,例如RequestAware,SessionAware等。

    強(qiáng)大的標(biāo)簽庫(kù),Struts 2 的標(biāo)簽基于 CSS,標(biāo)簽可以提供自己需要的HTML支持。
        Struts 2 的標(biāo)簽利用了CSS和模板,使用起來(lái)會(huì)非常方便,在Struts 1.x中我們需要使用Table來(lái)組織表單,但是在Struts 2中所有的標(biāo)簽自帶了Table內(nèi)容,可以方便的處理格式。例如<s:textfield> 標(biāo)簽自動(dòng)添加了 <tr> <td> 等標(biāo)簽。

    有狀態(tài)的Checkbox,可以以一種統(tǒng)一的方式記錄checkbox狀態(tài)的變化。
       在Struts 2中即使沒(méi)有被選中的checkbox其內(nèi)容仍然存在于Struts 2 框架中,不必像在Struts 1.x中那樣需要做特殊的存在性判斷。

    靈活的取消按鈕,在取消按鈕點(diǎn)擊的時(shí)候可以指向一個(gè)不同的action。
       @TODO
       可以在制定Form的action的同時(shí),制定cancel按鈕的action,當(dāng)點(diǎn)擊submit和cancel的時(shí)候出現(xiàn)完全按不同的功能。

    第一等級(jí)的AJAX的支持,在普通struts 標(biāo)簽的基礎(chǔ)上,使用AJAX增加了交互性和靈活性。
       Struts 2 的標(biāo)簽內(nèi)置了Ajax的支持。Struts 2 的標(biāo)簽使用了Dojotoolkit Ajax框架,不但能夠使用Ajax特性,而且能夠使用非常豐富和強(qiáng)大的瀏覽器小控件,例如日期選擇控件

    見(jiàn)到那集成Spring框架,非常簡(jiǎn)單的使用Spring框架提供的依賴注入功能。
       可以方便的使用Spring管理Struts 2 的action的創(chuàng)建,通過(guò)使用Spring可以充分的利用Spring的依賴諸如功能,并且能夠很好的集成其他的框架,例如Hibernate,iBatis等。

    更多的返回形式,除了JSP還支持,JasperReports,JFreeChart, Action鏈,文件下載等。
       除了支持JSP的表現(xiàn)形式,還支持JasperResports報(bào)表, JFreechart圖標(biāo),Action鏈,文件下載等。

    POJO表單,不再需要ActionForms,使用Javabean獲得客戶的收入或者將屬性表示出來(lái),
    完全消除了ActionForm組建,可以使用任意合適的類型來(lái)接受頁(yè)面?zhèn)鱽?lái)的數(shù)據(jù)或者將數(shù)據(jù)表現(xiàn)出來(lái)。ActionFrom可以使用POJO的 JavaBean來(lái)替代,JavaBean中的屬性可以使用String,也可以使用具體的類型,例如Date,Int等。

    POJO Action,使用任意的類作為Action類,甚至可以使用接口。
       任何類都可以作為Action類,只要接口滿足一些簡(jiǎn)單的定義,不需要在使用Action類似的基類,你可以完全自由的發(fā)揮。

部署
    插件結(jié)構(gòu),使用jar文件擴(kuò)展框架功能,不需要在做手動(dòng)的配置,內(nèi)置了JavaServer Faces, JasperResports, JFreeChart, Tiles等插件。
       擴(kuò)展一個(gè)功能只需要添加一個(gè)插件,插件甚至可以熱插拔,在你的應(yīng)用不停止的情況下追加新的功能。

    集成了分析功能,可以方便的找到程序性能的問(wèn)題點(diǎn)。
       可以不借助外力發(fā)現(xiàn)程序的熱點(diǎn),找到問(wèn)題的所在,

    準(zhǔn)確的報(bào)告錯(cuò)誤,可以非常準(zhǔn)確的指出程序的問(wèn)題點(diǎn)。
       準(zhǔn)確的報(bào)告運(yùn)行時(shí)的錯(cuò)誤,方便解決問(wèn)題。

維護(hù)
    Action容易測(cè)試,直接測(cè)試Struts 2的Action,不需要使用Mock Http對(duì)象來(lái)測(cè)試。
       Action是普通的類,不需要特殊的環(huán)境,所以Struts 2 的Action 特別容易測(cè)試。

    聰明的默認(rèn)值,不需要配置不必要的配置,大部分的框架配置元素的都有非常合適的默認(rèn)值,基本上你不需要在做任何配置。
       Struts 2 有很多的配置項(xiàng),但是每一個(gè)都有默認(rèn)值,基本額上不需要更改默認(rèn)的選項(xiàng)即可保證最佳

    容易定制的控制器,可以定制每一個(gè)Action的處理過(guò)程。
       可以使用Intercepter來(lái)過(guò)濾每一個(gè)Action,在Action執(zhí)行前后追加自定義的操作。

    集成了Debugging,可以使用內(nèi)容之的debugging工具找到問(wèn)題。
      
     靈活的標(biāo)簽庫(kù),可以通過(guò)修改FreeMarker模板來(lái)定制標(biāo)簽的輸出,不需要在操作像天書(shū)異樣的JSP Taglib API,模板語(yǔ)言支持,F(xiàn)reemarker和Velocity     
       可以自定義模板庫(kù),或者修改已有模板的內(nèi)容來(lái)定制頁(yè)面的顯示。

Struts 2 中使用的模式
Command
Chain of responsibility

Struts2 處理流程概要

上圖來(lái)源于Struts2官方站點(diǎn),是Struts 2 的整體結(jié)構(gòu)。
一個(gè)請(qǐng)求在Struts2框架中的處理大概分為以下幾個(gè)步驟
1 客戶端初始化一個(gè)指向Servlet容器(例如Tomcat)的請(qǐng)求
2 這個(gè)請(qǐng)求經(jīng)過(guò)一系列的過(guò)濾器(Filter)(這些過(guò)濾器中有一個(gè)叫做ActionContextCleanUp的可選過(guò)濾器,這個(gè)過(guò)濾器對(duì)于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin)
3 接著FilterDispatcher被調(diào)用,F(xiàn)ilterDispatcher詢問(wèn)ActionMapper來(lái)決定這個(gè)請(qǐng)是否需要調(diào)用某個(gè)Action
4 如果ActionMapper決定需要調(diào)用某個(gè)Action,F(xiàn)ilterDispatcher把請(qǐng)求的處理交給ActionProxy
5 ActionProxy通過(guò)Configuration Manager詢問(wèn)框架的配置文件,找到需要調(diào)用的Action類
6 ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例。
7 ActionInvocation實(shí)例使用命名模式來(lái)調(diào)用,在調(diào)用Action的過(guò)程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。
8 一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。返回結(jié)果通常是(但不總是,也可 能是另外的一個(gè)Action鏈)一個(gè)需要被表示的JSP或者FreeMarker的模版。在表示的過(guò)程中可以使用Struts2 框架中繼承的標(biāo)簽。在這個(gè)過(guò)程中需要涉及到ActionMapper
 
在上述過(guò)程中所有的對(duì)象(Action,Results,Interceptors,等)都是通過(guò)ObjectFactory來(lái)創(chuàng)建的。

ExtJS教程- Hibernate教程-Struts2 教程-Lucene教程