StrutsPrepareAndExecuteFilter
<filter-name>Struts2</filter-name>
<filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<init-param>
<param-name>packages</param-name>
<param-value>
cn.cstp.org.static,cn.cstp.org.xxx
</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
StrutsPrepareAndExecuteFilter是對struts2較早版本的核心控制器FilterDispatcher(文檔建議,從struts2.1.3起不再使用該類)的替代,結合了StrutsPrepareFilter與StrutsExecuteFilter的功能
Struts.xml配置詳解
在web應用程序中我們都是使用部署描述符來初始化一些資源如servlet、過濾器、監聽器等等,這個部署描述符就是那廣爲人知的web.xml了。同樣的,框架也使用一個配置文件來初始化它自己的資源,這些資源主要包括:
1.攔截器(Interceptor):對請求進行預處理和後加工;
2.Action Classes:負責調用商業邏輯和數據訪問層;
3.Results:負責返回視圖(view),如JSP頁面等等;
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<!—常量配置-->
<constant name="struts.devMode" value="false" />
<include file=“example.xml”/><!—包含配置-->
<package name="default" namespace="/" extends="struts-default">
<!—包配置-->
<action name="index">
<result type="redirectAction">
<param name="actionName">HelloWorld</param>
<param name="namespace">/example</param>
</result>
</action>
</package>
<!-- Add packages here -->
</struts>
常量配置
struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml
前3個xml文件的格式是一樣的,因爲它們使用同一個DTD文件,在xml文件中Constant元素有兩個必須的屬性:name和value;在struts.properties文件中,每一個entry都被視爲一個常量;在web.xml文件中FilterDispatcher的初始化參數被載入爲常量
下面分別給出3中常量形式的例子。
struts.xml文件中常量
<struts>
<constant name="struts.devMode" value="true" />
</struts>
struts.properties文件中常量
struts.devMode = true
web.xml文件中常量
<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>
包含配置
<include file="struts-chat.xml" />
<include file="struts-hangman.xml" />
<include file="struts-continuations.xml"/>
<include file="struts-tags.xml"/>
<include file="struts-validation.xml" />
包的配置
在struts.xml文件中,與web應用相關的設置都在包中定義,每一個包中都包含了將要用到的action、result、攔截器和攔截器棧。
屬性名 |
是否必須 |
描述信息 |
name |
是 |
package的唯一標識,不允許同名 |
extends |
否 |
指定要擴展的包 |
namespace |
否 |
指定名稱空間 |
abstract |
否 |
聲明包爲抽象的,這個package中不需要定義action |
Struts-default.xml
這些攔截器是以key-value對的形式配置在struts-default.xml中,其中name是攔截器名字,就是後面使用該攔截器的引用點,value則指定攔截器的實現類。
<package name="struts-default" abstract="true">
<result-types>
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
<result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
<result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
</result-types>
<interceptors>
<interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
<interceptor name="autowiring"
命名空間
攔截器配置
<interceptors>
<interceptor-stack name="crudStack">
<interceptor-ref name="checkbox" />
<interceptor-ref name="params" />
<interceptor-ref name="staticParams" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
配置Result
在Struts2框架中,一個完整的結果視圖配置文件如以下所示:
<action name=“Action名稱” class=“Action類路徑” method=“方法名”>
<result name=“邏輯視圖名” type=“結果類型”>
<param name=“參數名”>參數值</param>
</result>
</action>
有很多時候一個<result>初很多<action>使用,這時可以使用<global-results>標籤來定義全局的<result>,代碼如下:
<struts>
<package name="demo" extends="struts-default">
<global-results>
<result name="error">/error.jsp</result>
</global-results>
</package>
</struts>
Struts2支持多種結果類型,核心包下的struts-default.xml文件中可以找到其所支持的類型。
Struts.xml配置詳解—Bean配置
Struts2是個可以擴展的框架,框架的核心組件都是可以配置的,這些組件可以通過Struts2自身的依賴注入容器來裝配。開發時可以自己編寫組件來擴展框架功能,然後通過bean元素來配置組件。
在Struts-default.xml文件定義了struts2框架中可配置的組件
bean元素屬性
屬性名稱 |
是否必須 |
描述 信息 |
class |
是 |
bean的類名 |
type |
否 |
bean實現的主要接口 |
name |
否 |
bean的名字,在具有相同Type屬性的bean中,該名字必須唯一 |
scope |
否 |
bean的作用域,是default,singleton,request,session,thread中的一個 |
static |
否 |
是否注入靜態方法,如果指定了type,static就不能爲true |
optional |
否 |
Bean是否可選 |
Bean的兩種配置方法
第一種做法可以稱爲對象注入,它通常要用到bean的type屬性,告訴容器這個對象實現了哪個接口
如果自己創建了ObjectFactory,則可以在struts-default.xml中作如下配置:
<struts>
<bean type="com.opensymphony.xwork2.ObjectFactory"
name="struts" class="org.apache.struts2.impl.StrutsObjectFactory" />
</struts>
第二種做法使用值注入,允許不創建bean,而讓bean接受框架的常量。Bean使用值注入,必須使用static屬性,並將該屬性設置爲true。
例如:struts-default.xml文件中可以作如下配置:
<bean class=“com.opensymphony.xwork2.ObjectFactory” static=“true”/>
注:在實際開發中,很少使用<bean>元素。原因是Struts2本身提供的功能已經足夠強大,因此沒有必要去擴展或者替換Struts2的核心組建,自然也就用不到配置<bean>元素。
Struts-plugin.xml
<struts>
<bean type="com.opensymphony.xwork2.ObjectFactory" name="spring"
class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
<constant name="struts.objectFactory" value="spring" />
<package name="spring-default">
<interceptors>
<interceptor name="autowiring"
class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
<interceptor name="sessionAutowiring"
class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>
</interceptors>
</package>
</struts>
ActionSupport類的使用
Action接口的使用
Action接口:
Action的傳值方式
直接在Action裏定義各種Java基本類型的字段(屬性),使這些字段與表單數據相對應,並利用這些字段進行數據傳遞。前面我們做的示例都屬於字段驅動模式。
模型驅動就是使用單獨的JavaBean模型進行數據傳遞。JavaBean所封裝的屬性與表單數據的屬性一一對應,JavaBean成爲數據傳遞的載體。
Action類通過get*()方法來獲取模型,*爲具體的模型對象。
示例:修改用戶登錄驗證。
(1)新增一用戶域模型對象:Person.java
(2)Action類定義一個Person類型的域模型,使用getPerson()方法獲取模型對象。
(3)對於JSP頁面,如果是負責取值的,則格式必須爲“模型對象名.屬性名”;如果是負責傳值的,則格式爲“模型對象名.屬性名”或直接是“屬性名”。
public class LoginAction implements Action,ModelDriven<Person> {
Person person=new Person();
public String execute(){
person.setName("tom");
person.setPassword("123");
return SUCCESS;
}
public Person getModel() {
return person;
}
在Action中訪問Servlet API
這種方式主要是利用了com.opensymphony.xwork2.ActionContext (當前Action的上下文對象)類以及org.apache.struts2.ServletActionContext類 通過這個類可以訪問Servlet API。
action類實現ServletRequestAware, SessionAware, ApplicationAware接口
public String checkLogin(){
ActionContext ac=ActionContext.getContext();//獲得ActionContext
Map app=ac.getApplication();
ac.getSession().put("login",this.name);//把登錄名稱放入session中
ac.getApplication().put("login",this.name);//把登錄名稱放入application中
return SUCCESS;
}