Struts2配置文件

1.Struts2簡介

框架是一組程序的集合,包含了一系列的最佳實踐,做用是解決某個領域的問題。本質上來說,框架只是一個jar包,其本質上是對jdk的擴展。java

最佳實踐:web

  • 始終保證程序的可讀性、可維護性和可擴展性apache

  • Simple is Beauty編程

  • 儘量使用面向對象的觀點進行編程json

  • 減小依賴,消除耦合安全

圖片描述

struts2是一個mvc框架,提供了Controller和View模塊,能夠結合其餘技術提供Model。Struts2很是容易擴展,框架提供的每一個類是依賴於接口。若是有須要,很是容易添加適合本身的類和應用。mvc

1.1.Struts2簡單運行圖

將上面的框架圖進行簡單的抽象,可獲得下面簡單的運行示意流圖。
圖片描述app

  1. 外部發送request請求框架

  2. Filter Dispatcher檢查這個request,而後肯定相應的Actionjsp

  3. Interceptor(攔截器)相應的進行運用功能,例如workflow,數據驗證,文件上傳等。

  4. 執行Action中的方法,默認執行execute方法

  5. 返回結果一樣會經過一系列攔截器,而後由指定的表現形式返回,好比HTML,jsp或字面值

2.配置文件

struts利用xml配置文件初始化一系列的相關資源,這個底層實現技術屬於依賴注入。會經過xml配置文件初始化的資源包括:攔截器Interceptor,Action類及Results。

2.1 管理元素

2.1.1 Bean配置

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>

2.1.2 Constant常量配置

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>

2.1.3 packages配置

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>

2.1.4 namespace配置

namespace避免action的名字衝突,將action的配置在細分紅邏輯模塊,每一個都有特色的前綴。默認的namespace爲「」,而root namespace爲「/」。namespace的工做方式:

/a/b/c.action
先在b下搜索c.action,若b中沒有,則回退到a下搜索,若a尚未,繼續向上回退。但回退只是單向性,不能向a、或b的兄弟目錄進行搜索。

2.1.5 include配置

爲了防止struts.xml配置文件過大,能夠進行拆分紅多個子文件,每一個都必須和struts.xml報錯相同的格式,包括DOCTYPE,而後利用include引用起來。

2.2 請求處理元素

2.2.1 Interceptor Configuration

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>

2.2.2 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的生命週期中,攔截器能夠屢次調用,而過濾器只能在容器初始化時被調用一次。

相關文章
相關標籤/搜索