1. Struts1 與 Struts2的區別
Struts2從字面上來看似乎是Struts1的升級,但實事上可以說Struts2與Struts1幾乎沒有什麼關係,除了名字相同外;說實在的,Struts2可以看作是WebWork的升級,因爲無論從編程風格的相似性還是所引用到的jar包,到處可以看到WebWork的身影。下面就來比較下Struts1與Struts2到底有哪些區別吧:
l Struts1的Action需要繼承ActionServlet是一種侵入式的編程,而Struts2的Action完全是一個普通的POJO對象;
l Struts1的Action是單例模式並且必須是線程安全的(因爲只有一個Action實例來處理所有的請求),而Struts2的Action會爲每一個請求創建一個實例,因而沒有線程安全性的問題;
l Struts1依賴於Servlet API,如Action方法execute方式中必須有HttpServletRequest和HttpServletResponse參數,而Struts2的Action不再需要這兩個參數;
l Struts1使用ActionForm來封裝用戶請求參數,且每個form必須繼承自ActionForm,Struts2直接使用Action來封裝用戶請求的參數;
l 在表達式方面,Struts1整合了JSTL,而Struts2不僅可以使用JSTL,還可以使用OGNL;
2.Struts2的核心控制器
Struts2的核心控制器爲FilterDispatcher,它是一個Filter,負責攔截所有的用戶請求。Struts2框架默認處理*.action的請求,當有請求到來時,Struts2框架將會根據*.action請求的前面部分決定調用相應的業務邏輯組件(用戶實現的Action類的實例)。
Struts2用於處理用戶請求的Action實例,並不是用戶實現的業務控制器,而是Action代理,而用戶實現的Action類僅僅是Struts2的Action代理的代理目標。
3.Struts2基本配置
(1). 配置web.xml
要使Struts2的核心控制器發揮作用,需在web.xml中配置FilterDispatcher:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
配置filter時可以指定初始化參數,其中有3個具有特殊意義:
l config:該值爲一系統以英文逗號隔開的字符串,每個字符串都是一個XML配置文件的位置;Struts2框架將自動加載該屬性指定的系列配置文件;
l actionPackages:該值也爲一系統以英文逗號隔開的字符串,每個字符串都是一個包空間,Struts2將掃描這些包空間下的Action類;
l configProviders:當自己實現ConfigurationProvider類後,可以在此配置;
(2). 標籤的配置
Struts2的標籤庫定義文件包含在struts2-core-xxx.jar文件META-INF下,文件名爲struts-tag.tld。
如果Web應用使用了Servlet2.3以前的規範,則必須在web.xml文件中配置加載Struts2標籤庫,如下:
<taglib>
<taglib-uri>/s</taglib-uri>
<taglib-location>/WEB-INF/struts-tags.tld</taglib-location>
</taglib>
如果Web應用使用了Servlet2.4,則會自動加載該標籤文件,故不需要手動加載。
(3). struts.xml配置文件
Struts2的核心配置文件爲struts.xml,它主要負責管理業務控制器Action。Struts2框架會自動加載放在WEB-INF/classes路徑下的struts.xml文件;
爲了避免struts.xml文件過大,可以將其分解成多個配置文件,然後在struts.xml文件中使用<include/>包含其他的配置文件,如下:
<struts>
<include file=”struts-part1.xml”/>
</struts>
struts-default.xml文件是Struts2框架的默認配置文件,Struts2框架每次都會自動加載該文件,它其中定義了Struts2內建的Result類型、攔截器以及攔截器棧等。
(4). Eclipse方式的擴展
Struts2還提供了一種“可插拔”的方式來安裝插件,如Struts2框架自帶的Spring/JSF等,都提供了一個類似struts2-xxx-plugin.jar的文件,將其解壓後可以看到其中包含struts-plugin.xml文件,該文件中配置了Struts2與Spring/JSF框架整合必需的常量、攔截器等。只需要將strtus2-xxx-plugin.jar文件放在WEB-INF/lib路徑下,Struts2框架將自動加載該框架。
故用戶自己開發屬於自己的Struts2插件,只要將對應的struts-plugin.xml文件放在JAR文件中,Struts2框架將會自動加載該文件。
(5). struts.properties文件
struts.properties文件用於配置Struts2框架的一些屬性值,它是一個標準的Properties文件,使用相應的key-value方式記錄;該文件只要放在Web應用的CLASSPATH路徑下,Struts2框架均可加載,但一般習慣將其放在WEB-INF/classes目錄下。
下面列舉一些常用到的屬性:
l struts.i18n.encoding:指定web應用的默認編碼集,如對於處理中文請求參數時,需要將其設置爲GBK或GB2312;
l struts.action.extension:指定由Struts2框架處理的請求後綴,該屬性默認值是action,如需指定多個值,使用英文逗號隔開;
l struts.enable.DynamicMethodInvocation:值爲true/false,用於指定Struts2是否支持動態方法調用,其默認值爲true;
l struts.tag.altSyntax:指定是否允許在Struts2標籤中使用表達式語法,默認爲true;
l struts.devMode:該屬性設置Struts2應用是否使用開發模式,如果設置爲true,則在應用出錯時會顯示更多的出錯提示,便於查找錯誤,默認值爲false;
l struts.i18n.reload:設置是否每次HTTP請求到達時,系統重新加載資源文件,屬性默認值爲false,在開發時建議將其設置爲true,這樣修改的資源文件後可以不用重啓應用;
l struts.configuration.xml.reload:該屬性設置當struts.xml文件改變後系統是否重啓加載,其默認值爲false;
l struts.custom.i18n.resources:該屬性指定Struts2應用所需要的國際化資源文件,如有多個資源文件,中間用英文逗號隔開;
l struts.configuration.files:指定Struts2默認加載的配置文件,如有多個文件,中間使用英文逗號隔開,該屬性默認值爲struts-default.xml, struts-plugin.xml,struts.xml;
除了在struts.properties文件中配置屬性外,Struts2也支持在struts.xml文件中用<constant>元素來定義屬性,如下:
struts.properties
struts.custom.i18n.resources = ApplicationResource
……
struts.xml
<struts>
<constant name=“struts.custom.i18n.resources” value=“ApplicationResource” />
……
</struts>
注意:如果在值多個配置文件中配置了相同的屬性,則後一個文件中的配置常量值會覆蓋前一個文件中的常量值。