1.b/s框架css
browser-servlet請求-響應的處理過程的集合體html
2.MVC模式(持久層,表示層,業務邏輯層)前端
M 數據模型(模型):做爲程序的核心載體,用於傳輸數據(bean hibernate) java
V 對外交互(視圖):完成後對結果的展示(jsp struts2 )程序員
C 程序的執行和控制(控制器):接受請求數據和處理請求(servlet spring)web
3. model1模式和model2模式ajax
Model1模式:整個web應用幾乎所有是由jsp頁面接受處理客戶端請求的,對請求直接的做出響應 ,用少許的javabean來處理數據庫鏈接,數據庫訪問等操做,Model1模式的實現較爲簡單,適用於快速開發小規模的項目,可是從工程化的角度看 它的侷限性較爲明顯,jsp頁面自己兼V和C兩種角色,將表示層和業務邏輯層混雜在一塊兒,從而致使代碼的複用性較差,增長了拓展和維護的難度spring
Model2模式:MVC模式,servlet做爲前端的控制器,負責接收客戶端發送的請求 ,在servlet中只包含控制邏輯和簡單的前端處理 ,而後調用後端的javabean來處理實際的邏輯,最後轉發到相應的jsp頁面處理顯示邏輯 ,在model2下jsp不在承擔業務邏輯,它僅僅是表現層角色,jsp頁面的請求與servlet交互,而servlet負責與後臺的javabean通訊,在model2下模型由javabean充當,而業務邏輯由servlet承擔數據庫
4 .http與java數據類型的區別express
http屬於弱數據類型,數據類型屬於string,string【】類型,java屬於強類型
5.web與struts2在線程安全方面的區別
Web容器是一個單實例的多線程環境,對於每一個http請求,都會從線程池中分配一個線程,那麼涉及到線程安全的併發問題(dopost方法,struts2也是一個單實例的多線程環境,可是經過threadlocal保證線程的安全
<filter>
<filter-name>action2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- END SNIPPET: filter -->
<filter-mapping>
<filter-name>action2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
6.struts2的運行環境
struts2是以web環境爲依賴,遵循servlet標準,經過實現filter接口進行http請求的處理,支持struts2的最低servlet版本是2.4相應的jsp最低版本是2.0版本,必須運行在jdk1.5版本上同樣
7.struts2的運行原理
Struts2的核心模塊分爲兩個部分 struts和xwork,struts只須要接受請求參數,而後交給xwork完成處理,當xwork執行完之後,返回相應的視圖,xwork是struts2的執行核心, struts階段是針對http請求預處理,這個階段爲業務邏輯執行必要的數據環境和運行環境作準備,經過dispatcher解耦,而後將程序執行的控制器移交給xwork,將http請求的數據封裝成普通的java對象,而且由xwork負責執行具體的業務邏輯,這一階段再也不依賴於web容器,徹底由xwork框架驅動整個執行的過程,其中Dispatcher起着關鍵的做用,http預處理以及儘量的消除對web容器的依賴,將web容器與mvc分離 ,其中struts2的入口程序是filter攔截器(web.xml裏面的filter配置),而Actionproxy是xwork框架的執行入口(配置文件的導入,dispatcher的處理),主要做用是屏蔽整個控制流元素的執行過程,對內的action等提供一個無干擾的執行環境(由threadlocal實現),而Actioninvocation 調度執行次序,他被封裝在actionproxy的內部,而後經過Actioninvocation的對interceptor,action,result等調度執行,同時由actionproxy驅動執行,在這其中Interceptor與action的關係是一層包裹關係,一組interceptor環繞在action對象的執行切面,在action以前或者以後執行,從而實現對action的攔截做用,struts2僅初始化一次
8.在 ValueStack 對象的內部有兩個邏輯部分:
ObjectStack: Struts 把 Action 和相關對象壓入 ObjectStack 中
ContextMap: Struts 把各類各樣的映射關係(一些 Map 類型的對象) 壓入 ContextMap 中.實際上就是對 ActionContext 的一個引用
Struts 會把下面這些映射壓入 ContextMap 中
#parameters: 該 Map 中包含當前請求的請求參數
#request: 該 Map 中包含當前 request 對象中的全部屬性
#session: 該 Map 中包含當前 session 對象中的全部屬性
#application:該 Map 中包含當前 application 對象中的全部屬性
#attr: 該 Map 按以下順序來檢索某個屬性: request, session, application
9.默認加載的xml配置文件及加載順序
struts2-defalut.xml ,struts.xml,struts-plugin.xml
struts.xml用戶自定義配置文件,
struts-default.xml 自帶的配置文件,
struts-plugin.xml是struts2默認的插件配置文件
struts2配置文件的加載順序 struts-default.xml---struts-plugin.xml---struts.xml
10. strus.xml配置文件介紹
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="id" extends="struts-default" >
<action name="login" >
<result>/success.jsp</result>
</action>
</package>
</struts>
Include節點:並無在struts-default.xml中出現,能夠寫在struts.xml中,將整個應用配置根據必定的邏輯劃分紅若干獨立的配置文件<include file=「...」/>
Version:版本
Encoding:編碼
!doctype: xml文件的書寫規範約束
Constant:默認配置在/org/apache/struts2/default.properties 下 說明見備註
Package:包
Package的包屬性:
Name:包稱
extends:繼承的配置文件(一般都必須之間或者間接的繼承struts-default)
11. package繼承struts-defaul的簡要說明
Namespace : 可選 默認爲「/」 根命名空間
Action屬性
name :處理的攔截的地址
class: 可選 攔截處理類,默認爲 actionsupport類
method: 可選 相應處理類方法名(默認execute)
result 屬性
Type 可選 默認爲dispatcher(轉發) 詳情見備註
Name:可選 換回值,默認success,根據返回值肯定轉發頁面
Result的子標籤param(見結果處理):指定邏輯視圖對應的實際視圖資源
<default-interceptor-ref name="defaultStack"/> 默認使用的攔截器棧爲defaultStack
<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
說明:默認使用的action爲com.opensymphony.xwork2.ActionSupport(書寫時action沒有寫繼承actionsupport會默認的繼承actionsupport)
<global-allowed-methods> execute ,input ,back ,cancel,browse ,save,delete,list,index </global-allowed-methods>
說明:默認可以接受的方法爲execute , input , back , cancel, browse , save, delete, list, index(不然須要相應的添加)
interceptor-stack說明見備註
均可以在Struts中更改
12. 以pojo做爲載體的優勢(javabean)
Javabean做爲一個強類型(javabean:對象的產生主要是爲了強調對象內在的特性和狀態,同時構造一個數據存儲和數據傳輸的載體)
2)Pojo不依賴任何框架,能夠運行在程序的任何一個層次
3)Pojo突破了formbean(struts1中的數據載體)對頁面元素惟一對應的限制,咱們能夠將一個頁面中的元素自由映射到多個pojo中去
13. web與strust2的交互關係
1)對應關係
Httpservletrequest對應requestmap
Httpsession對應sessionmap
Servletcontext對應applicationmap
web原生的httpsession等不是線程安全的,struts2是線程安全的,這是因爲threadloacl致使的
2)訪問servlet的方式
方式1 採用Actioncontext類間接的獲取
Getcontext方法 :靜態方法,獲取相應的對象實例 (new Actioncontext(). getcontext())
Get方法:返回object類型,該方法相似調用httpservletrequest的getattribute方法
Getapplication :返回map集合,模擬了servletcontext
Getparameters :返回map集合,相應的調用httpservletrequest的getparametermap方法
Getsession:返回map集合,模擬了httpsession方法
Setapplication:將一個map實例的key-value對轉換成application的屬性值和屬性名
Setsession:與上相似
方式2 採用接口的方式直接的獲取
Servletcontextaware 直接訪問web應用的servletcontext實例,實現接口後須要重寫setxxx方法,會自動調用,
Servletrequestaware獲取相應的httpservletrequest實例
Servletresponseaware獲取相應的httpservletresponse實例
其中相應的set方法中的參數指的是web應用對客戶端的響應
方式3 採用Servletactioncontext的工具類獲取相對較爲簡單
14. objectfactory類
容許程序員在程序的運行期動態的添加一個新的對象,而且爲新的對象實施依賴注入,使執行對象都受到xwork容器的管理,也是bean與struts2的內置對象進行對話的接口
其中的工具方法能夠分爲兩類
1)有用構建內部對象的action,interceptor(aop),result,validator的快捷方法
2)另外一類是用於構建一個普通bean的核心方法buildbean(ioc),buildbean包含了對象的建立和依賴注入兩個核心的過程
15. Objectfactory與Container區別
Container:在初始化的時候被建立出來,主要保證運行期對已知定義好的內置對象的需求,因此以取爲主
Objectfactory:偏重於程序運行的過程當中對象的構建,以建爲主
16. Valuestack與actioncontext關係
Actioncontext:是一個map集合,經過鍵和值來存儲關係,數據共享,因爲threadlocal不會致使線程安全問題
Valuestack是xwork用以對ognl的計算拓展的一個特殊的數據結構,是一個棧的數據結構,而且具有表達式計算的數據結構
Valuestack與actioncontext的關係:Actioncontext沒法脫離valuestack而單獨存在,不然pojo數據沒法相應的傳輸,Valuestack離開actioncontext只有pojo數據的傳輸而沒有pojo數據,valuestack的數據是從屬於Actioncontext的
Valuestack又分爲兩個部分
Map棧:實際上ognlcontext類型,同時也是一個map,也是對actioncontext的一個引用 裏面保存着各類map(Requestmap sessionmap applicationmap parametersmap ,attr)
對象棧:其實是compoundroot類型,使用arraylist定義的棧(加入了相應的peek,push,pop方法),裏面保存着當前action實例相關的對象,是一個數據結構意義的棧,將對象的棧放入相應的對象棧中
備註:採用ActionContext.getContext().getValueStack(),能夠獲取值棧的map,而且能夠在其上加入數據放入棧頂,假如在棧頂沒有找到相應的屬性,那麼會讀取下一個棧的屬性, <s:property value="【0】.name" />
17. actionsupport類
Action的一個默認的實現類,該方法已經提供了許多默認的方法,包含國際化信息方法,數據校驗的方法等等,從而大大的簡化了action的開發,作驗證等時繼承便可
Gettext(「key」,args)方法 能夠訪問本地化消息, <action name="login" class="test1.Person" >中假如沒有使用class,那麼默認使用的是actionsupport類處理的
18. action的動態方法調用Struts.xml
<struts>
<!--設置是否容許使用!-->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="id" extends="struts-default" >
<action name="login" class="test1.Person" >
<result>/success.jsp</result>
<!—添加能處理的method方法-->
<allowed-methods>error,success</allowed-methods>
</action>
</package>
</struts>
Action類
public class Person extends ActionSupport{
private static final long serialVersionUID = 1L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String success() throws Exception {
System.out.println(1111);
return "success";
}
public String error() throws Exception {
System.out.println(222);
return "success";
}
@Override
public String execute() throws Exception {
System.out.println(333);
return "success";
}
}
Jsp
<form action="login.action" method="post">
user:<input type="text" name="name" >
<input type="submit" value="提交">
</form>
使用方法 在瀏覽器中輸入http://localhost:8080/test1/login!error.action
注意:在struts2.3.4如下若是設了默認Action,再進行動態調用Action,會出現錯誤,在struts2.3.4以上就不會發生錯誤。
19.action的通配
<action name=」*_*」 class=」test.{1}」 method=」{2}」>
<result name=」{2}」>
{1}.jsp
</result>
</action>
{1}表明第一個* {2}表明第二個* 其餘同理
匹配的優先級:沒有使用通配的action名優先於有使用通配的action名,有使用通配的action名,沒有前後順序依次向下運行
20. 結果的處理
<global-results..>和<result..> 前者爲全局 後者爲局部
屬性
Name:屬性指定所配置的邏輯視圖名
Type:屬性指定的結果類型
經常使用的類型以下
Dispatcher和direct:上述已說明
Dispatcher和direct的子標籤param容許的值爲
location:指定邏輯視圖對應的實際視圖資源
parse:指定是否容許在實際視圖中使用ognl表達式,默認值爲true
<action name="login" class="test1.Person" >
<result type="dispatcher">
<param name="location">/success.jsp</param>
<param name="parse">true</param>
</result>
</action>
能夠簡寫爲
<action name="login" class="test1.Person" >
<result>/success.jsp</result>
</action>
說明:
redirectaction和chain的子標籤param的容許的值爲
actionname:重定向的action的全類名
namespace:重定向須要指定的action所在的命名空間
<result name="input" type="chain">
<param name="actionName">login</param>
<param name="namespace">/test</param>
</result>
上述能夠相應的簡寫爲
<result name="input" type="chain">login</result>
<package name="test" namespace="/test " extends="struts-default">
<action name="login"
class="test.TestAction">
<result>/success.jsp</result>
</action>
</package>
參數的讀取
#attr 例如<s:property value="#attr.name" />
21. Preresultlistener監聽器
在action處理完以後轉入實際視圖以前被回調
public String execute() throws Exception {
//獲取任務調度器
ActionInvocation invocation = ActionContext.getContext().getActionInvocation();
//調度addPreResultListener方法
invocation.addPreResultListener(new PreResultListener() {
// resultCode ;相似execute的return的值
@Override
public void beforeResult(ActionInvocation invocation, String resultCode) {
System.out.println(resultCode);
invocation.getInvocationContext().put("extra", resultCode);
}
});
return "success";
}
22. 異常處理機制1)異常的捕捉
方式1 try…catch…這種方法不便於維護
public String execute() throws Exception {
try {
} catch (Exception e) {
return "結果1";
}
return "結果n";
}
}
方式2 :在默認的攔截器棧中包含exception,進行異常攔截處理,只須要在相應的action中配置<exception-mapping result="…" exception="……"></exception-mapping>
或者在全局中配置便可
<global-exception-mappings >
<exception-mapping result="" exception=""></exception-mapping>//exception異常的全類名
</global-exception-mappings>
Exception:指定該異常映射所設置的異常類型
Result:指定的action異常出現時,異常映射對應的邏輯視圖
2)異常視圖的輸出
能夠用ognl表達式
<s:property value=」exception」/> 顯示異常對象
<s:property value=」exception.message」/>顯示異常的message信息
<s:property value=」exceptionStack」/>輸出異常堆棧信息
也能夠用el表達式
${ exception } ${ exception.message } ${ exceptionStack }
23. convention插件(約定大於配置)
1)說明
convention插件支持0配置,不須要使用struts.xml文件進行配置,也不須要使用annocatation進行配置,而是由struts2根據約定來指定配置
2)convention插件須要導入的包:
struts2-convention-plugin包
3)搜索範圍
convention會搜索位於action,actions,struts,struts2包下的java類,同時convention產檢會把全部實現了action接口的java類和類名以Action結尾的java類當成action處理
4)convention插件容許設置的三個常量
struts.convention.package.locators:convention插件使用該常量指定的包做爲搜尋的action的根包。例如actions.test.LoginAction 本來須要映射到/test/ LoginAction,可是指定爲test,那麼action將會映射到/login
struts.convention.exclude.packages:指定不掃描哪些包下的java類
struts.convention.action.packages:指定掃描的包,能夠指定多個包
說明:在找到合適的action類以後,那麼這些包下的子包則會相應的生成對應的命名空間
5)Action的name屬性規則
1. 若是該action類名包含action後綴,將該action類名的action去掉,不然不作任何處理
2. 將駝峯命名法轉換中劃線寫法
例如actions.test.LoginAction將映射到以下的url :/test/login 後綴的action被去掉了,如/test/login提交表單時,會交給actions.test.LoginAction處理
6)映射到相應的result
語法:actionname+resultcode+suffix
例如 action的url爲/login 返回的邏輯視圖名爲success 結果類型爲dispatcher 對應的視圖爲…\login-success.jsp/html 或者是…\login.jsp/html;
Action的url爲/test/get-book 返回的邏輯視圖名爲success,結果類型爲freemarker,對應的視圖爲…\test\get-book-error.flt velocity對應的suffix是.vm
7)利用config-browser插件查看應用中部署的action
config-browser插件的首地址爲web_context/config-browser/index.action;
咱們單機的爲將web_context改成http://localhost:8888/convention便可
這個產電對struts和convention均有效,也就是說不是爲convention的配置的
8)Action鏈的約定
1. 第一個action返回的邏輯視圖字符串沒有對應的資源
2. 第二個action須要在第一個action的同一個包下
3. 第二個action映射的url爲firstactionname+resultcode
4. 例如第一個類名爲firstAction 返回的邏輯視圖爲second,那麼第二個類的類名爲firstSecondAction
9)Convention的動態刷新
Convention在action或者jsp頁面改變時,都是要動態的刷新頁面,因此須要進行相應的配置<constant name=」 struts.devMode」 value=「true」/> <constant name=」struts.classes.reload」 value=」true」/> 不大建議使用,會相應的下降運行效率
還有一些其餘的配置常量因爲較少
註解方式:
略
24. 國際化
1)構建
1》全局須要設置的配置常量<constant name="struts.custom.i18n.resources" value="名稱"></constant> 局部指定能夠採用<s:i18n…/>標籤,指定相應的國際化資源文件
2》須要的文件 名稱.properties,能夠設置相應系列的國家的語言 名稱_en_US.properties, 名稱_zh_CN.properties等,底層基於web的國際化(見web國際化的resourcebundle),放置於src下
2)國際化資源的訪問
能夠採用相應屬性key讀取 例如:<s:>中的key ,-validation.xml中的message中的key
<s:textfield name="username" key="username"></s:textfield>//經過key獲取相應的值
3)不一樣語言的設置方式
1》改變瀏覽器的語言
2》添加參數request_locale=語言_國家 例如request_locale=en_US
<a href="testin8n.action?request_locale=en_US">English</a>
3》局部指定能夠在採用<s:i18n…/>標籤,在其中指定相應的request_locale=語言_國家
<form action="login.action" method="post">
user:<input type="text" name="name" >
<s:i18n name="i18n_en_US" >
<s:textfield key="age"></s:textfield>
<s:text name="@@min(1,2)" ></s:text>
<s:property value="@@min(1,2)"/> //若是省略class默認爲java.lang.math
<s:property value="@test1.Person@str()"/>//完整語法,靜態字段或者方法
</s:i18n>
<input type="submit" value="提交">
</form>
5)錯誤消息的國際化設置
方法1:
在相應的action中添加gettext方法,當不符合條件是在採用addfielderror中添加相應的錯誤消息
方法2:
採用繼承FieldValidatorSupport的方式,且在同包下書寫classname-validate.xml,及在i18n中寫相應的消息,見自定義攔截器
說明:struts2的攔截i18n實現
使用鏈接的方式設置
<a href="testin8n.action?request_locale=en_US">English</a>
<a href="testin8n.action?request_locale=zh_CN">中文</a>
以上爲自動注入的方式,有相應的攔截器注入i18n
25. 類型轉換
1)內置類型轉換器
boolean char int long float double date 數組 集合
2)自定義類型轉換器
1》須要繼承或者實現的接口
備註:當轉換爲null時,那麼會自動轉爲Objectfactory類
自定義轉換類必須實現的接口是typeconverter接口,可是typeconverter接口過於複雜,因此實現類defaluttypeconverter的子類StrutsTypeConverter來實現自定義轉換器
2》StrutsTypeConverter類
方法
convertFromString(Map arg0, String[] arg1, Class arg2):轉換爲對象,自動支持級聯,也就是屬性類.屬性
convertToString:對象轉爲string
定義全局類型的轉換器
全局起做用須要提供一個xwork-converter.properties文件中,書寫方式如java.util.Date=struts.DateConverter(不是單實例),放在同類的包下,局部類型轉換器同包下無需寫類名,classname-conversion.properties,書寫方式如birthday= struts.DateConverter(單實例)
3》類型轉換錯誤處理
Conversionerror攔截處理轉換類型錯誤,當轉換錯誤,strurts2會將請求導向到input結果代碼映射的視圖
4》錯誤信息的設置
一般錯誤消息放在i18n中,消息鍵爲xwork.default.invalid.字段名=錯誤消息的方式書寫消息錯誤,在消息中能夠相應占位符使用字段名來填充,國際化須要指定constant,若是是局部的那麼須要在同包下創建同類名的properties文件,書寫方式如invalid.fieldvalue.user=\u9519\u8BEF\u7684\u8F93\u5165\u683C\u5F0F.錯誤消息的顯示須要繼承validateaware(actionsuport已經繼承了該類,假如沒有實現該接口那麼當沒有發生任何的事情,實現了後就會拋出一個異常),假如將ognl標籤的theme設置爲simple(默認並非simple模板,因此在錯誤的時候轉發到input結果的頁面時(開始頁面)會顯示相應的錯誤消息),那麼將再也不本身顯示錯誤消息,而是將錯誤消息放入值棧中,能夠經過fielderrors獲取,輸出格式的改變能夠經過修改模板文件去除span來進行更改(採用創建同包同文件名的方式來覆蓋修改)
5》自定義轉換器須要的文件,src下xwork-converter.properties或者同類包下classname-conversion.properties 繼承StrutsTypeConverter的類
6》類型轉換註解
略見struts2深刻詳解-323頁(盤多多有下載)
類型的轉換爲了簡潔通常繼承actionsupport類
26.validatexxx方法和validate方法
1)可使用validatexxx方法,xxx第一個字符大寫的方式驗證,這個方法由框架自動調用,這個方法不須要有返回值,若是驗證錯誤,會直接將它添加到action的字段錯誤中,具體是由com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor攔截器的DefaultWorkflowInterceptor類的dointercept方法中對其調用的,
public void validateExecute(){
ActionContext context = ActionContext.getContext();
HttpParameters parameters = context.getParameters();
Parameter parameter = parameters.get("customer.name");
System.out.println(parameter);
}
2)當多個action的執行方法的validatexxx方法相同了,那麼能夠採用validate方法,Validate也是由DefaultWorkflowInterceptor類調用的,無需實現validatable接口由於這個actionsupport已經實現,使用時參數已經注入
27 自定義驗證器
1)創建src下validators的2種方式
一種是經過實現com.opensymphony.xwork.validator.validatorfactory接口的方法registervalidator,完成映射,鍵值對的方式(基本不用)
另外一種是在src路徑下添加一個名爲validators.xml的文件
<validators>
<validator name="idcard" class="struts.IDCardValidator"/>//經過調用IDCardValidator(須要實現FieldValidatorSupport)的validate方法來實現驗證的目的
</validators>
2)攔截原理
開啓驗證是經過validation攔截來調用的,位於conversionerror以後,worflow以前,默認的struts-default中也包含默認自動調用該攔截器
3)非字段驗證器和字段驗證器(自定義的驗證器的消息能夠寫在這其中,非自定義的(內置的驗證器)直接寫在其中便可運行,這個能夠查看官方文檔,複製使用便可)
非字段驗證器不須要針對特定的驗證規則,例如兩次的密碼是否一致
<validator type="expression">//內置的
<param name="expression"> <![CDATA[password==password2]]></param>
<message key="error"></message>//error表示國際化中的error字段的值,做爲錯誤消息返回
</validator>
對於字段類型的驗證器,在聲明時既能夠用field聲明也能夠用validator聲明
屬性type表示驗證器的名稱,name驗證得出字段名
<validators>//自定義的
<field name="idcard">
<field-validator type="idcard">
<message key=「errorInfo」> </message>//errorInfo表示國際化中的errorInfo字段的值,做爲錯誤消息返回,也能夠這麼寫<message>身份證不正確</message>
</field-validator>
</field>
</validators>//內置的
<field name="age">
<field-validator type="conversion" >
<message>123</message>
</field-validator>
<field-validator type="int">
<param name="min">20</param>
<param name="max">50</param>
<!-- 錯誤信息 -->
<message>bar must be between ${min} and ${max}.</message>
</field-validator>
<!-- short-circuit="ture"版本錯誤 -->
<!-- <field-validator type="conversion" short-circuit="ture"> <param name="age">true</param>
<message>Conversion Error (Integer Wanted)</message> </field-validator> -->
</field>
備註:對於驗證規則在相應的類的同一個包下,創建名稱爲classname-validator.xml或者classname-alias-validator.xml
4)自定義驗證器須要繼承FieldValidatorSupport類
重寫validate方法
public void validate(Object arg0) throws ValidationException {
//獲取屬性名
//arg0
String fieldName = getFieldName();
//獲取屬性值
Object value = this.getFieldValue(fieldName, arg0);
IDCard idCard = new IDCard();
if(!idCard.Verify((String)value)){
//錯誤信息加入錯誤字段
addFieldError(fieldName, arg0);
}
}
5)內置驗證器
內置的13個驗證器在com.opensymphony.xwork2.validator.validators下的default.xml中
用法見struts-2.5.14.1-all.zip\struts-2.5.14.1\docs\docs\core-developers其下的validation
6)自定義字段驗證器須要的文件:src下的validators.xml,繼承FieldValidatorSupport類的類,同驗證類的包下的classname-validator.xml或者classname-alias-validator.xml文件,可在i18n下寫入錯誤消息
7)自定義非字段驗證器須要的文件如上,以及strus.xml中指定
28 自定義攔截器
1) AbstractInterceptor的繼承,重寫intercept方法
public String intercept(ActionInvocation arg0) throws Exception {
//調用下一個攔截器
String invoke = arg0.invoke();
return invoke;
}
2) struts.xml中添加
<interceptor name="testintercept" class="struts.myintercept"></interceptor>
3) 使用
一種是加入棧中,而後使用棧
<package name="product1" extends="struts-default" namespace="/">
<!-- 在doc中指定的param須要在interceptors中指定 -->
<interceptors>
<!-- 添加攔截器名稱和支撐類 聲明 攔截器-->
<interceptor name="testintercept" class="struts.myintercept"></interceptor>
<interceptor-stack name="adsd">
<!-- 添加攔截器至攔截器棧 -->
<interceptor-ref name="testintercept"></interceptor-ref>
<interceptor-ref name="defaultStack">
<!-- 查看的方式 是在攔截器指定的棧的類中的類能夠查看doc文檔裏面有相應的介紹 -->
<!-- 單個文件的大小 字節爲單位 -->
<param name="fileUpload.maximumSize">2000</param>
<!-- 容許文件的類型 -->
<param name="fileUpload.allowedTypes">text/html</param>
<!-- 容許文件的拓展名 -->
<param name="fileUpload.allowedExtensions">.dtd,.xml,.txt</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 使用攔截棧 -->
<default-interceptor-ref name="adsd" />
一種是直接在action中使用
<action name="testtoken">
<interceptor-ref name="tokenSession"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result>/success.jsp</result>
<result name="invalid.token">/error.jsp</result>//鍵29. 避免表單的重複提交
</action>
29. 避免表單的重複提交
1)原理
Token標籤:其中有兩個hidden 第一個是固定的,第二個是隨機生成的加密令牌值,避免表單的重複提交須要添加tokeninterceptor或者tokensessionstoreinterceptor攔截器,須要手動添加,和web防止重複提交表單的原理相同,當重複提交是會轉到invalid.token,當沒有寫相應的頁面的時候那麼不會轉發到相應的頁面,action不會運行,當什麼也沒美髮生
<interceptor-ref name="tokenSession"></interceptor-ref>
public static final String INVALID_TOKEN_CODE = "invalid.token";
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
<interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
2)什麼算表單的重複提交
刷新不算重複提交 主要值返回後頁面提交 提交的過程當中再次點提交 按f5刷新 這些算表單的重複提交,轉發算重複提交 重定向不算重複提交
3)Executeandwaitinterceptor
Executeandwaitinterceptor攔截器在用戶提交表單後向用戶輸出一個等待的頁面,等待頁面定時向服務器提交請求,以肯定服務器的操做是否完成,若是請求處理完畢,則會導向結果頁面,當一個action的執行時間超過5或者10分鐘時,他能夠防止http請求超時
4)Execandwait
Execandwait攔截器在默認值的xml文件中有,可是在默認的攔截器棧中沒有添加,這個只能放在最後,不然會中止後續的操做,用於設置響應時間,threadpriority:可選參數,優先級
delay:可選 等待響應時間
delaysleepinterval:可選和delay只能用一個
30 文件的上傳和下載
1) 上傳下載的環境
須要導包fileupload和io包,對於文件的上傳文件實行攔截的是org.Apache.struts2.interceptor.fileuploadinterceptor
上傳文件的時候須要使用enctype屬性,enctype=」multipart/from-data」
2) 上傳攔截器提供的參數
Maximumsize:攔截器action可接收單個文件的長度 默認2m
Allowedtypes:以逗號隔開,表示文件的類型
相應的錯誤信息i18n中:
struts.messages.error.uploading:文件不能上傳的通用錯誤信息
Struts.messages.error.file.too.large上傳的文件長度太大的錯誤信息
Struts.messages.error.content.type.not.allowed當上傳文件不匹配指定的內容類型的錯誤信息
3)上傳Struts2中有3個屬性與文件有關,在struts.properties中,經過constant設置
Struts.multipart.parser 可選值pell cos Jakarta(默認)既使用asf的commons-fileupload
Struts.multipart.savedir 保存臨時文件的存儲路徑 默認爲 javax.servlet.context.tempdir
Struts.multipart.maxsize:最大字節數 默認爲2097152
4)上傳默認參數
List<String> nameContentType; 默認爲name+ContentType
List<String> nameFileName; 默認爲name+FileName
參數的配置
<interceptor-ref name="defaultStack">
<!-- 查看的方式 是在攔截器指定的棧的類中的類能夠查看doc文檔裏面有相應的介紹 -->
<!-- 單個文件的大小 字節爲單位 -->
<param name="fileUpload.maximumSize">2000</param>
<!-- 容許文件的類型 -->
<param name="fileUpload.allowedTypes">text/html</param>
<!-- 容許文件的拓展名 -->
<param name="fileUpload.allowedExtensions">.dtd,.xml,.txt</param>
</interceptor-ref>
5)下載
須要繼承actionsupport
Strust2.dispatcher.streamresult類型支持文件的下載
Streamresul結果類型利用httpservletresponse對象返回的servletoutputstream向對象輸出下載文件的二進制數據,他的參數以下
contentLength: 下載的文件的長度
contentDisposition: 設定
Content-Dispositoin 響應頭. 該響應頭指定接應是一個文件下載類型, 通常取值爲 attachment;filename="document.pdf".,filename指定文件的下載名,inline表示下載文件在本頁面內部打開
inputName: 指定文件輸入流的 getter 定義的那個屬性的名字. 默認爲 inputStream
bufferSize: 緩存的大小. 默認爲 1024
allowCaching: 是否容許使用緩存
contentCharSet: 指定下載的字符集
private String contentType;
private long contentLength;
private String contentDisposition;
private InputStream inputStream;
public String execute() throws Exception {
contentType="text/html";
contentDisposition="attachment;filename=i18n.properties";
ServletContext context=ServletActionContext.getServletContext();
String fileName=context.getRealPath("/i18n.properties");
inputStream=new FileInputStream(fileName);
contentLength=inputStream.available();
return SUCCESS;
}
<!—type需改成stream-->
<result type="stream">
<param name="bufferSize">2048</param>
</result>
上傳
public class UploadAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private List<File> ppt;
private List<String> pptContentType;
private List<String> pptFileName;
private List<String> pptDesc;
public List<File> getPpt() {
return ppt;
}
public void setPpt(List<File> ppt) {
this.ppt = ppt;
}
public List<String> getPptContentType() {
return pptContentType;
}
public void setPptContentType(List<String> pptContentType) {
this.pptContentType = pptContentType;
}
public List<String> getPptFileName() {
return pptFileName;
}
public void setPptFileName(List<String> pptFileName) {
this.pptFileName = pptFileName;
}
public List<String> getPptDesc() {
return pptDesc;
}
public void setPptDesc(List<String> pptDesc) {
this.pptDesc = pptDesc;
}
@Override
public String toString() {
return "UploadAction [ppt=" + ppt + ", pptContentType=" + pptContentType + ", pptFileName=" + pptFileName
+ ", pptDesc=" + pptDesc + "]";
}
public UploadAction(List<File> ppt, List<String> pptContentType, List<String> pptFileName, List<String> pptDesc) {
super();
this.ppt = ppt;
this.pptContentType = pptContentType;
this.pptFileName = pptFileName;
this.pptDesc = pptDesc;
}
public UploadAction() {
super();
}
@Override
public String execute() throws Exception {
System.out.println(ppt);
System.out.println(pptContentType);
System.out.println(pptFileName);
System.out.println(pptDesc);
return SUCCESS;
}
}
31. 實現modledriven接口
Getmodle方法在action的execute方法以前執行
modledriven對象裏面的對象具備的名稱會被優先注入
這個方法是在validatexxx後續執行
由於只依賴注入一次
假如想前面的也依賴注入那麼須要使用paramsPrepareParamsStack攔截器
32. Preparable
用法與validatexxx相似,preparexxx主要爲調用數據庫作準備,相應的方法運行時採用調用,實現Preparable也會須要實現prepare方法,因此這個方法,而validatexxx不須要實現接口,由dointercept調用,不想執行和繼承prepare方法,能夠添加參數以下
<interceptor-ref name="paramsPrepareParamsStack">
<!-- 修改方法值 將prepare.alwaysInvokePrepare改成false那麼就不會再執行prepare方法-->
<param name="prepare.alwaysInvokePrepare">false</param>
</interceptor-ref>
在使用默認的攔截器棧時,參數沒有注入,在使用paramsPrepareParamsStack參數已經注入,詳細看
33.Spring整合struts2
備註:struts由攔截器攔截到用戶請求,而後將請求轉發給對應的action,在此過程當中,struts負責建立action實例,調用execute方法,假如把action實例交給spring容器來管理,不是由struts2產生,這個工做是由struts2提供的spring插件完成的,struts2-spring-plugin插件,這個包將struts2和spring整合。結果是當使用spring容器關聯繫統的action時,在struts.xml文件中的配置該action時,class屬性並非指向action的實現類,而是指向spring容器中action的id
在web.xml中建立spring容器
/*Spring提供了一個contextloaderlistener監聽器,該監聽器實現了servletcontextlistener接口(監聽web的開啓和關閉,contextInitialized方法和contextDestroyed方法詳情見web核心總結),xml配置監聽器以下*/
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
/*Spring的配置文件的默認值爲 /WEB-INF/applicationContext.xml,沒有指定文件會自動的尋找,假如不是默認值,那麼須要用contextconfiglocation來指定配置文件,若是沒有找到合適的配置文件那麼會報異常,以下*/
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
/*Spring會根據配置文件建立webapplicationcontext對象,並保存在servletcontext中,相應的獲取方法,webapplicationcontext ctx= webapplicationcontextutils.getwebapplicationcontext(servletcontext),也可使用servletcontext的getattribute方法獲取,可是不方便,須要記住屬性名,而後 ctx.getbean方法獲取相應的類,在applicationcontext.xml文件中的配置以下*/
<bean id="personService" class="services.PersonService"></bean> <bean id="personAction" class="actions.PersonAction" scope="prototype"> <!-- 依賴注入業務邏輯組件--> <property name="personService" ref="personService"></property> </bean>
public class PersonAction { private PersonService personService; public void setPersonService(PersonService personService) { this.personService = personService; } public String execute(){ System.out.println("execute...."); personService.save(); return "success"; } }
備註:在 IOC 容器中配置 Struts2 的 Action 時, 須要配置 scope 屬性, 其值必須爲 prototype,當使用spring容器關聯繫統的action時,在struts.xml文件中的配置該action時,class屬性並非指向action的實現類,而是指向spring容器中action的id
自動裝配
讓spring自動管理bean與bean之間的關係,減小xml文件的配置量,可是會相應的下降依賴關係的透明性和清晰性
@autowired
屬性
Name:屬性名自動裝配
Type:根據屬性的類型自動裝配,沒有bean什麼都不會發生,多個相同類型報出異常
Auto:spring插件會自動檢查須要哪一種自動裝配的類型
Constructor:與type類似,卻別是使用構造器來構造注入須要的參數
備註:struts2的配置文件仍是會寫,與applicationContext.xml沒有太多的影響
34. ognl
ognl表達式的三要素及參數的出處
表達式 root對象 上下文環境
Ognl的運行參數都屬於struts2/xwork須要定義的內置變量,
Ognl
ognl支持的常量
字符串常量,須要用單引號, 數值常量 布爾常量 null常量
操做符
,分隔表達式
{} 用於建立集合列表
In not in 是否包含在集合中
方法和屬性的調用
調用普通方法
能夠訪問值棧中對象的方法,相應獲取返回值
調用靜態方法和靜態屬性
使用註解的方式 @class@method @class@field 若是省略class默認爲java.lang.math
須要設置<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>但是非值棧中的屬性
調用構造方法
New 全類名 例如new java.util.ArrayList()
索引的訪問
數組和list訪問 array【index】 list【index】
建立集和數組
建立列表 {「a」,「b」…….}
建立map集合#{「A:a」,「B:b」………}
建立數組同java
說明:這些集合不能調用java中的方法,由於這些不符合訪問器方法的命名要求,在不涉及這些參數的方法都能用
List能用的方法:size isempty iterator
Set 能用的方法: size isempty iterator
Map 能用的方法:size isempty keys values
Iterator 能用的方法 next hasnext
Enumeration 能用的方法 next hasnext nextelement hasmoreelement
投影
在一個集合中對每個元素調用相同的方法,或者抽取相同的屬性,將結果保存爲一張新的表
語法: 集合.{相應的表達式} 使用例如:#employees.{? name==null}
相應表達式中3個特殊的符號
? 取出全部符合邏輯的元素
^ 取出符合邏輯的第一個元素
$ 取出符合邏輯的最後一個元素
Struts在ognl上的加強
獲取對象棧的值:語法 【n】.xxxx 棧頂【0】.默承認以不寫 例如【1】.name
Top關鍵字:top關鍵字至關於棧頂對象 例如value=「top」等於獲取棧頂對象
訪問靜態變量的加強:訪問值棧中對象的靜態變量和靜態方法語法@vs@字段名或者方法名//vs表示全類名 ,默認vs表示棧頂 vs表示棧頂的下一個對象
獲取保存在actioncontext中的map類型的值須要使用#,包含parameters,request,session,application,attr 用法例如value=」#attr.name」
說明在jsp2.1中使用#可能會出現問題,對此一種修復的方式是在web.xml中添加jsp-config元素配置,忽略在jsp中使用el表達式
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</ url-pattern >
<el-ignored>true</ el-ignored >
</jsp-config>
Struts2標籤語法
動態數據的訪問
對於字符串類型的屬性,假如須要動態的訪問數據,須要使用%{},例如<s:include value=「%{url}」>
對於非字符串類型的ognl屬性能夠直接求值
直接指定字符串一般須要單引號括起來,若是是非字符串屬性那麼%{}會被忽略,
通用標籤
數據標籤
Property set push param bean action include url a i18n text date debug
property:輸出某個屬性
default:可選 若是輸出屬性值爲空 則顯示defalut屬性指定的值
escape:可選 默認值爲true
value: 可選 指向輸出的屬性值,沒有則輸出棧頂的值
Set:設置一個新的變量,放入指定的範圍內
Scope:可選 範圍 application session request page action 默認值action
Value:可選 默認棧頂對象
name:必選,指定該屬性後會被放入值棧中
Push:用於將某個值放入值棧中
Value:必選 指定須要放入值棧棧頂的值
Param:用於設置一個參數,一般是用作bean標籤,url標籤的子標籤
Name:可選,指定須要設置的參數名
Value:可選;指定須要設置的參數值
兩種寫法
<param name=」qqq」>aaa</param>
<param name=」qqq」 value=」aaa」/>
Bean:該標籤用於建立一個javabean實例
屬性
Name:必選 須要實例化的類
id:可選 指定用於引入值棧
Action:在jsp頁面直接調用一個action,經過指定的executeresult參數還能夠將該action的處理結果包含到本頁面中來
屬性:
id:可選,引用的名稱
Name:必選,用於指向action的name,也就是調用action
Namespace:可選,指定標籤所在的namespace
Executeresult:可選,是否將action處理結果包含到本頁面,默認值爲false
Ignorecontextparams:可選,指定該頁面中的請求參數是否須要傳入調用的action,默認值爲false,即不會將本頁面的參數傳入
Flush 可選 默認值true 在action標籤結束時,輸出結果是否應該被刷新
Include:用於頁面包含jsp或者servlet資源
Value 必選,該屬性指定被包含的jsp頁面或者servlet
在其中還可使用param子標籤來傳遞參數
url:用於生成一個url地址
action:可選 指定url的地址爲那個action,若是沒有指定value做爲url
achor:可選 錨點
encode:可選 是否須要對參數進行編碼 默認爲true
Param:用於設置一個參數,一般是用作bean標籤,url標籤的子標籤
Name:可選,指定須要設置的參數名
Value:可選;指定須要設置的參數值
兩種寫法
<param name=」qqq」>aaa</param>
<param name=」qqq」 value=」aaa」/>
Push:用於將某個值放入值棧中
Value:必選屬性 指定須要放入值棧棧頂的值
escapeamp:可選是否須要對&符號進行編碼 默認爲true
forceaddschemehostandport:可選 指定是否再url對應的地址裏強制添加scheme,主機和端口
includecontext:可選,是否須要當前上下文包含在url地址中
includeparams:可選 指定是否包含請求產生,只有none,get或者all,默認爲get
method:可選 指定action的方法 若是指定了該屬性,則url鏈接到指定action的相應方法
portetmode:可選,指定結果頁面的protlet模式
namespace:可選,若是指定,那麼url將鏈接到此namespace的指定action處
scheme:可選,用於設置scheme屬性
value:若是不提供action就是url地址
var:放入值棧中保存
windowstate:可選,指定portlet的窗口狀態
上述若是沒有指定value和action那麼該頁面做爲url的地址的值
I18n:用於指定國家化資源文件的basename
Date:用於格式化輸出一個日期
Format:可選屬性,解析格式
Nice:可選屬性 指定是否輸出指定日期與當前的時間差 默認值爲false
Name:必選屬性,指定要格式化的日期
Var:指定是否放入值棧的棧頂 也能夠用id,可是建議使用var
其中nice和format不能同時指定 若是沒有指定nice和format則會尋找key爲struts.date.format的消息,若是沒有就輸出dateformat.medium的消息
Debug:生成一個調試鏈接能夠看到值棧的內容
控制標籤
If/elseif/else iterator append merge generator subset sort
If:選擇 test 必選 Boolean
Elseif test 必選 Boolean
Else
Iterator:迭代器
Value:可選屬性,value屬性指定的被迭代的集合,若是沒有value屬性,這迭代棧頂元素
Id:可選屬性 指定集合裏元素的id,例如後續的輸出就須要指定這個值,相應的輸出
Status:可選屬性 判斷當前迭代元素的信息,例如是不是最後一個元素,
Status包含如下方法
Int getcount():返回當前迭代的第幾個元素
Int getindex(): 返回當前迭代元素的索引
Boolean iseven():返回當前被迭代元素的索引是不是偶數
Boolean isfrist():返回當前被迭代元素是不是第一個元素
Boolean islast():返回當前被迭代元素是不是最後一個元素
Boolean isodd():返回當前被迭代元素的索引是不是奇數
Append:將多個集合合成一個新的集合
Id 必選 該屬性肯定拼接成的新的集合的名字,append標籤中能夠放置多個param標籤使得合成一個和解
Merge:也是將多個集合合成一個集合,可是於append的拼接方式有所不一樣
這個拼接的順序與append不一樣,append是第一個集合的第一個元素到最後一個元素,再到第二個元素,以此類推,而merge是第一個集合的第一個元素,而後是第二個集合的第一個元素,到最後一個集合的第一個元素,而後是第一個元素的第二個元素,依次類推
使用與append的大體相同
Generator:將一個字符串解析成一個集合
能夠將字符串按指定分割符分割成多個子串,而後轉化爲一個集合,這個臨時生成的集合位於棧頂,標籤結束移出棧頂
Count:該屬性是一個可選值,指定生成集合中元素的總數
Separate:必選屬性,指定分隔符
Val:必選屬性,指向解析的字符串
Converter:可選屬性,一個轉換器,將集合中的每個元素轉換成對象,該屬性值必須是一個相應的converter對象
id:可選屬性:若是指定該屬性,則生成的迭代對象會放入值棧中
Subset:截取結合的部分元素造成新的集合
Count:可選屬性,指定元素的格式,不指定,則是所有元素
Source:可選屬性,指定須要被截取的集合,不指定,默認爲棧頂的集合
Start:可選屬性,指定從第幾個元素開始
Decider:可選屬性,
id:可選屬性,指定該屬性,則生成迭代對象設置爲page範圍
Sort:對集合進行排序
Comparator:必選屬性,指定須要進行排序的comparator實例
Source:可選屬性,指定須要排序的集合,沒有指定默認爲棧頂集合
id:可選屬性,指定後迭代對象設置爲page範圍
ui標籤
struts2支持的模板
模板:ftl文件是freemarker模板文件,struts2使用freemarker技術來定義因此模板文件
Flt:默認模板,freemarker的模板技術
Vm:基於velocity的模板技術
Jsp:基於jsp的模板技術
加載模板的方式 在struts.properties文件中的struts.ui.templatedir屬性來配置,該屬性的默認值是theme ,加載模板時首先搜索web應用程序下的template目錄,而後搜索classpath下的template目錄,能夠經過ui標籤的templatedir指定模板路徑
例如:<s:form action="input.action" theme="模板主題" templateDir="path">
模板的主題:
Simple xhtml css_xhtml ajax
Xhtml:是struts2默認的主體,是對simple主體的拓展
1) 會進行客戶端驗證
2) 自動輸出驗證錯誤
css_xhtml 與上相似
ajax主題是對xhtml的拓展,增長ajax特性,使用流行的dojo工具包
1) 客戶端驗證
2) 支持遠程異步提交
3) 高級div模塊
4) 交互的autocomplete等
經常使用表單標籤(除了密碼以外(能夠設置)都默認是能夠回顯的)
Form textfield password radio checkbox checkboxlist select
Doubleselect combobox optiontransferselect optgroup updownselect
Textarea hidden file label reset submit token head
下面相似html中經常使用的標籤屬性有省略
Form:
Enctype 可選 上傳文件是須要指定爲multipart/form-data
Validate 可選 默認值false 是否執行客戶端驗證 只有xthml或者ajax纔有效
Textfiled
Maxlength:可選 可輸入文本的最大長度
Readonly 不能輸入文本只能讀
Size 可選 設置能夠看見的尺寸
Textarea
Wrap:可選指定文本輸入框是否能夠換行
Select標籤 下拉框
List:指定集合,能夠是list集合
Listkey:指定集合元素中的對象的某個屬性做爲鍵
Listvalue:指定集合元素中的對象的某個屬性做爲值
Multiple:是否容許多選
Headerkey headervalue 相似listkey和listvalue ,不一樣在於這個現實在第一行,默承認見行
Checkboxlist複選框
略
Doubleselect級聯列表框
List:指定集合
Listkey:
Listvalue
Doublelist:第二個集合
Doublelistkey:
Doublelistvalue
Doublename’:第二的name屬性
Radio標籤 單選按鈕
略
Optgroup標籤 在select下的標籤
List:指定集合 ,須要是鍵值對
Listkey:
Listvalue
Token標籤 防止重複提交 原理用了一個隱藏值,也相似web防止表單的重複提交
Submit 標籤
Type 可選 默認input 能夠是input button image
Input 等價於<input type=「submit」>
Image 等價於<input type=「image」>
Button 等價於<button type=「submit」>
Method 可選 指定action方法
Method前綴:能夠改變默認的execute方法的執行
<s:submit value=」註冊「 name=」method:login」>
Action前綴 導向到另一個action處理 相似chain
<s:submit value=」註冊「 name=」action:login」>
Redirect前綴 重定向到其餘url
<s:submit value=」註冊「 name=」redirectn:path」>
Redirect-action前綴:重定向到其餘的action
等等 其他基本相似
Actionerror actionmassage fielderror標籤
Actionerror:action的錯誤消息 Actionerrors屬性保存的的
Actionmassage:通常性消息 Actionmassages屬性保存
Fielderror錯誤消息 Fielderrors屬性保存的
3個輸出都依賴主體
備註:
Constant經常使用的配置
struts.local 指定web應用的默認的locale 默認的locale爲en_US
struts.configuration 該常量指定加載struts配置文件的配置管理器 默認爲org.apache.struts2.config.DefaultConfiguration 也能夠指定 可是須要實現configuration類
struts.ObjectFactory :指定struts2默認的ObjectFactory bean
struts.ObjectFactory.autoWare:指定spring框架的自動裝配模式,默認值爲name (即根據bean的name自動裝配)
struts.enable.dynamicMethodInvocation:該常量設置struts2是否支持動態方法調用,默認值爲false
struts.devMode 該常量設置struts2應用使用開發模式 默認值爲false
struts. Enable.SlasheslnActionNames:該常量設置struts是否有容許在action名中使用/ 默認值爲false
struts.reload 該常量設置是否每次http請求到達時,系統都從新加載資源文件,默認值爲false,可是一般在開發階段設置爲true,在發佈階段設置爲false
struts.ognl.allowStaticMethodAccess:該常量設置是否容許在ognl表達式中調用靜態方法,默認爲false
struts.mutipart.maxsize 該常量指定struts2文件上傳中整個請求內容容許的最大字節數
struts.action.extension: 指定struts2處理的請求後綴,該常量的默認值爲action,須要別的類型的後綴則須要相應的添加
struts.i18n.encodin:指定web應用的默認編碼集 默認值爲utf-8
struts.custom.i18n.resources:該常量指定struts2應用所須要的國際資源問價
等等 詳情見路徑下的默認配置
使用方式以下
<constant name="struts.action.extension" value="action,do"></constant>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
<constant name="struts.custom.i18n.resources" value="i18n"></constant>
其它相似如上
default-interceptor-ref說明
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/> 將異常和action返回的result相應射
<interceptor-ref name="alias"/> 對http包含的參數設置別名
<interceptor-ref name="servletConfig"/> 該攔截器提供訪問包含HttpServletResquest和HttpServletResponse對象的Map的方法。
<interceptor-ref name="i18n"/> 支持國際化的攔截器
<interceptor-ref name="prepare"/> 假如action繼承了preparable接口會調用prepare方法(prepare方法能夠爲action的execute作相應的準備工做)
<interceptor-ref name="chain"/> 該攔截器讓前一個action的參數能夠在現有action中使用
<interceptor-ref name="scopedModelDriven"/> 執行該攔截器時 它能夠從一個scope範圍檢索和存儲model值 經過調用setmodek方法區設置model值
<interceptor-ref name="modelDriven"/> action執行該攔截器時 能夠將getmodel方法獲得的result值放入值棧中
<interceptor-ref name="fileUpload"/> 支持文件上傳功能的攔截器
<interceptor-ref name="checkbox"/>視圖中若是有checkbox存在的狀況,該攔截器自動將unchecked的checkbox看成一個參數(一般值爲「false」)記錄下來。 這樣能夠用一個隱藏的表單值來記錄全部未提交的checkbox,並且缺省unchecked的checkbox值是布爾類型的, 若是視圖中checkbox的值設置的不是布爾類型,它就會被覆蓋成布爾類型的值。
<interceptor-ref name="datetime"/>
<interceptor-ref name="multiselect"/>多選攔截器,若是找到帶有多選前綴的參數,則會相應的插入一個值,若是不存在的話那麼插入默認值(空字符串數組)
<interceptor-ref name="staticParams"/>對於在struts.xml文件中Action中設置的參數設置到對應的Action中
<interceptor-ref name="actionMappingParams"/>使用ActionMapping使其映射到值棧上
<interceptor-ref name="params"/>將http請求中包含的參數設置到action中
<interceptor-ref name="conversionError"/> 從actioncontext中轉化類型是發生的錯誤添加到action值域錯誤中
<interceptor-ref name="validation">定義的校驗規則
<param name="excludeMethods"> input, back, cancel, browse </param>
</interceptor-ref>
<interceptor-ref name="workflow">調用Action的validate方法,一旦有錯誤返回,從新定位到INPUT
<param name="excludeMethods"> input,back ,cancel, browse </param>
</interceptor-ref>
<interceptor-ref name="debugging"/>用來對在視圖間傳遞的數據進行調試
</interceptor-stack>
Result類型結果說明
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/> 轉發到一個action而不是頁面(從一個action處理完後轉發到另一個action)
<result-type name="dispatcher" class="org.apache.struts2.result.ServletDispatcherResult" default="true"/> 轉發到一個頁面
當一個請求到來,服務器直接轉發到另外一個頁面,不能是另外一個action。因爲這個過程在服務器內部完成,客戶端(瀏覽器)並不知道,因此在地址欄不會顯示真實訪問的頁面,而顯示都是所請求的action的地址。在servlet中至關與forword轉發。
<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/> 使用freemark模板
<result-type name="httpheader" class="org.apache.struts2.result.HttpHeaderResult"/> 用於控制特殊的http行爲
<result-type name="redirect" class="org.apache.struts2.result.ServletRedirectResult"/> 重定向到一個頁面
當一個請求到來,服務端將實際地址response給瀏覽器,而後瀏覽器從新發起請求,這個過程,瀏覽器是知道訪問的頁面的實際地址的,因此在瀏覽器的地址欄顯示的是實際訪問的jsp頁面地址。可是這種類型不能重定向到一個action.
<result-type name="redirectAction" class="org.apache.struts2.result.ServletActionRedirectResult"/> 重定向到一個action而不是頁面(從一個action處理完後重定向到另一個action)
<result-type name="stream" class="org.apache.struts2.result.StreamResult"/>向瀏覽器換回一個inputstream
<result-type name="velocity" class="org.apache.struts2.result.VelocityResult"/> 使用velocity模板
<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/> 用於xml/xslt整合
<result-type name="plainText" class="org.apache.struts2.result.PlainTextResult" /> 顯示某個頁面的源代碼
<result-type name="postback" class="org.apache.struts2.result.PostbackResult" />