框架是一組程序的集合,包含了一系列的最佳實踐,做用是解決某個領域的問題。本質上來說,框架只是一個jar包,其本質上是對jdk的擴展。java
最佳實踐:web
始終保證程序的可讀性、可維護性和可擴展性apache
Simple is Beauty編程
儘量使用面向對象的觀點進行編程json
減小依賴,消除耦合安全
struts2是一個mvc框架,提供了Controller和View模塊,能夠結合其餘技術提供Model。Struts2很是容易擴展,框架提供的每一個類是依賴於接口。若是有須要,很是容易添加適合本身的類和應用。mvc
將上面的框架圖進行簡單的抽象,可獲得下面簡單的運行示意流圖。
app
外部發送request請求框架
Filter Dispatcher檢查這個request,而後肯定相應的Actionjsp
Interceptor(攔截器)相應的進行運用功能,例如workflow,數據驗證,文件上傳等。
執行Action中的方法,默認執行execute方法
返回結果一樣會經過一系列攔截器,而後由指定的表現形式返回,好比HTML,jsp或字面值
struts利用xml配置文件初始化一系列的相關資源,這個底層實現技術屬於依賴注入。會經過xml配置文件初始化的資源包括:攔截器Interceptor,Action類及Results。
bean元素有一個必須的屬性class
,定義了某個Java class被建立或調用。
bean的功能:
1.對象注入:能夠經過框架的container建立,而後注入到內部框架對象裏,通常伴隨着type
屬性,告訴container這個對象實現implement了某個接口。
2.值注入:擁有value被注入到自身的靜態方法中,好讓不建立對象的容器接受框架參數。對象使用值注入必需要定義靜態方法。
屬性 | 必需 | 描述 |
---|---|---|
class | yes | bean class的名稱 |
type | no | class實現的主要的java接口 |
name | no | bean的惟一名字, 與其餘bean獨立 |
scope | no | bean的範圍,必許是【default、singleton、request、Session、thread】中一個 |
static | no | 是否注入static方法,當type指定後必定爲false |
optional | no | bean是不是強制可選的 |
示例
<struts> <bean type="com.opensymphony.xwork2.ObjectFactory" name="myfactory" class="com.company.myapp.MyObjectFactory" /> ... </struts>
constant經過定義關鍵的設置,提供一個簡單的方式去修改框架或定義行爲,來達到定製struts。
constant有兩個主要功能點:
1.用來重載設置,例如上傳文件的最大值,struts是否在「devMode」等。
2.指定哪個bean去實現。
constant能夠在多個文件中定義,默認的搜索順序以下:
1.struts-default.xml
2.struts-plugin.xml
3.struts.xml
4.struts.properties
5.web.xml
若是後面某個值已被定義,則前面的值會被覆蓋。
屬性 | 必需 | 描述 |
---|---|---|
value | yes | contant的值 |
name | yes | contatn的名字 |
Constant Example (struts.xml) <struts> <constant name="struts.devMode" value="true" /> ... </struts>
在 struts.properties文件中,每一條實例都會被初始化成constant。
Constant Example (struts.properties) struts.devMode = true
在web.xml中,FilterDispatcher的初始化參數會被當作constant載入。
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> <init-param> <param-name>struts.devMode</param-name> <param-value>true</param-value> </init-param> </filter> ... </web-app>
packages是一種把action,result,result types,Interceptor和Interceptor stack分紅一個邏輯配置單元,很是相似於對象,能夠被extend,並被重寫。
Packages有一個必須的屬性name
,對以後引用這個package是很是關鍵的。
<struts> <package name="employee" extends="struts-default, json-default" namespace="/employee"> <action name="list" method="list" class="org.apache.struts2.showcase.action.EmployeeAction" > <result>/empmanager/listEmployees.jsp</result> <result type="json"> <param name="root">employees</param> </result> </action> </package> </struts>
namespace避免action的名字衝突,將action的配置在細分紅邏輯模塊,每一個都有特色的前綴。默認的namespace爲「」,而root namespace爲「/」。namespace的工做方式:
/a/b/c.action
先在b下搜索c.action,若b中沒有,則回退到a下搜索,若a尚未,繼續向上回退。但回退只是單向性,不能向a、或b的兄弟目錄進行搜索。
爲了防止struts.xml配置文件過大,能夠進行拆分紅多個子文件,每一個都必須和struts.xml報錯相同的格式,包括DOCTYPE,而後利用include引用起來。
interceptor 容許開發者自定義代碼,而後能夠在action方法執行前或執行後運行。攔截器是很是強大的工具,能夠用來驗證數據,屬性封裝,安全處理,log及在運行時剖析代碼使用。
interceptor是由java class實現的,因此每一個interceptor都有相應的class name,爲了使用方便,每一個interceptor擁有一個簡單的惟一的名字,若是多個interceptor放在一塊兒,可使用stack。
<interceptors> <interceptor name="security" class="com.company.security.SecurityInterceptor"/> <interceptor-stack name="secureStack"> <interceptor-ref name="security"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors>
多數應用能夠定義默認的interceptor stack,以下:
<default-interceptor-ref name="secureStack"/>
對於每一個action也能夠定義本身的stack,可是默認的interceptor就沒法啓用,因此通常講struts-default.xml中默認的interceptor stack添加到自定義的interceptor中。
<action name="VelocityCounter" class="org.apache.struts2.example.counter.SimpleCounter"> <result name="success">...</result> <interceptor-ref name="defaultComponentStack"/> </action>
action映像是struts框架的最基本的工做單位,本質上講,action關聯了一個標識符和一個handle class。當request匹配action name的時候,框架會使利用mapping來決定如何處理這個請求。在action mapping中,能夠包含一系列exception處理,一個攔截器棧,一系列result types等,可是隻有name是必須的,其餘均可以在package的範圍內提供。
若是須要訪問時指定action name的後綴名,則須要在struts.xml文件中配置
<constant name="struts.enable.SlashesInActionNames" value="true"\>
默認的處理方法在Action接口中被定義
//Action interface public interface Action { public String execute() throws Exception; }
可是實現Action接口是可選的,若是Action中沒有實現execute,框架會經過反射也尋找一個execute方法。除此以外,能夠經過配置文件的method
,指定Action中的方法。
<action name="delete" class="example.CrudAction" method="delete">
若是既沒有execute 也沒有其餘指定的方法,框架會拋出異常。
攔截器與過濾器:一、攔截器是基於java反射機制的,而過濾器是基於函數回調的。二、過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。三、攔截器只能對Action請求起做用,而過濾器則能夠對幾乎全部請求起做用。四、攔截器能夠訪問Action上下文、值棧裏的對象,而過濾器不能。五、在Action的生命週期中,攔截器能夠屢次調用,而過濾器只能在容器初始化時被調用一次。