struts2在mvc中的體現。css
struts2的經常使用標籤有哪些: html
ui:form,textfiled,textarea,password,select,radio, checkbox...
非ui標籤: if,elseif, else, iterator, text, i18n, property....前端
action獲取請求傳遞的數據的方式:
一、經過request獲取
二、每一個屬性set、get獲取
三、別名.屬性,在action中對屬性bean進行set、get
四、實現ModelDrive接口;
struts2獲取servlet-api的方式:
一、ioc方式,實現接口;
二、非ioc方式, 使用類ServletActionContext類進行獲取; ??
struts2驗證:
一、js前端校驗;
二、業務方法中直接校驗;
三、validate方法或validateXXx方法進行校驗;
四、validation外部xml框架校驗;
struts2 國際化;
struts2文件上傳;java
struts2 攔截器, 自定義攔截器;web
總結:ajax
struts2
1.Struts2跟Struts1的區別?
action層對比: struts1必須繼承, struts2能夠繼承也能夠不繼承
線程方面對比: struts1單例模式(全部的請求共享同一個類的實例), struts2是原型模式(對每個的請求都建立一個新的實例)
依賴方面對比: struts1依賴servlet-api; struts2不依賴servlet-api;
測試方面對比: struts1的action單元測試很困難; strtus2單元測試很是容易;
封裝方面對比: strtus1使用ActionForm對象獲取jsp傳遞的參數; struts2有多種方式獲取請求的數據;
表達式的對比: struts1使用jstl表達式; struts2使用jstl,ognl等表達式;
類型轉換對比: struts1使用commons-beanutils進行類型轉換; struts2使用OGNL表達式進行類型轉換;apache
2.Struts2的運行原理(執行流程)?api
一、客戶端瀏覽器發出HTTP請求。瀏覽器
二、根據web.xml配置,該請求被FilterDispatcher接收。服務器
三、根據struts.xml配置,找到須要調用的Action類和方法, 並經過IoC方式,將值注入給Aciton。
四、Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。
五、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面。
六、返回HTTP響應到客戶端瀏覽器。
3.淺談struts2攔截器, 你使用過哪些內置攔截器?
攔截器的做用:每個Action請求都包裝在一系列的攔截器的內部。攔截器能夠在Action執行前作類似的操做也能夠在Action執行直後作回收操做。
1、params攔截器
params 攔截器提供了框架必不可少的功能,將請求中的數據設置到Action中的屬性上。
2、staticParams攔截器
staticParams攔截器是將配置文件經過action元素的子元素params設置的參數設置到對應的Action的屬性中。
3、servletConfig攔截器
servletConfig攔截器提供了一種將源於servlet API的各類對象注入Action當中的簡潔方法。Action必須實現相對應的接口,servletConfig攔截器才能將對應的servlet對象注入Action中。
4、fileUpload攔截器
ileUpload攔截器將文件和元數據從多重請求(multipart/from-data)轉換爲常規的請求數據,以便將他們設置在對應的Action屬性中。
5、validation攔截器
validation攔截器用於執行數據效驗。
6、workflow攔截器
workflow攔截器提供當數據效驗錯誤時終止執行流程的功能。
7、exception攔截器
exception攔截器捕獲異常,而且可以根據類型將捕獲的異常映射到用戶自定義的錯誤頁面。該攔截器應該位於所定義的全部攔截器中的一個。
struts2框架定義了許多有用的攔截器,這裏我就介紹了這七種,若是在實際開發中有須要,咱們就能夠查看struts-default.xml文件。去了解更多struts2自帶對的攔截器。
4.如何使用struts2中的validate方法驗證數據;
validate()方法是對全部的請求都執行
validateAdd()只對add()請求的方法執行.
5.struts2中validate的執行過程是怎麼樣的?
1.類型轉換器對請求參數執行類型轉換,並把轉換後的值賦給action中的屬性
2.若是在執行類型轉換的過程當中出現異常,系統會將異常信息保存到ActionContext,conversionError攔截器將異常信息添加到fieldErrors裏。無論類型轉換是否出現異常,都將進入第三步。
3.系統經過反射技術先調用action中的validateXxx()方法
4.再調用action中的validate()方法
5.通過上面4步,若是系統中的fieldErrors存在錯誤信息(即存放錯誤信息的集合的size大於0),系統自動將請求轉發到名稱爲input的視圖。若是系統中的fieldErrors沒有任何錯誤信息,系統將執行action中的處理方法
注:如發送請求後進入input視圖,並不必定是驗證失敗,若是類型轉換出現異常,也將進入input視圖
fieldError 有值的問題, input指明的頁面
6.如何在Action中使用request,response,session等對象? 有哪些方式? (2種方式)
方法一:使用import org.apache.struts2.interceptor包下的ServletResponseAware和ServletRequestAware方法,須要Action類實現該方法!
public class TestAction implements ServletRequestAware,ServletResponseAware { private HttpServletRequest request; private HttpServletResponse response; @Override public void setServletResponse(HttpServletResponse response) { this.response=response; } @Override public void setServletRequest(HttpServletRequest request) { this.request=request; } }
方法二:使用org.apache.struts2.ActionContext類的get方法獲得request和response還有session對象
import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.opensymphony.xwork2.ActionContext; public class TestAction { public String getObject() { HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST); HttpServletResponse response = (HttpServletResponse) ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE); Map<String, Object> session = ActionContext.getContext().getSession(); return null; } }
方法三:Struts2爲咱們提供了最簡單的方式,使用org.apache.struts2.ServletActionContext類,能夠直接獲得request,response和session方法
public class TestAction { public String getObject() { HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); HttpSession session = ServletActionContext.getRequest().getSession(); return null; } }
7.Struts2上傳文件,如何設置上傳文件格式和上傳文件大小? 如何修改Struts默認的上傳文件大小?
<action name="fileupload" class="uploasAction"> <interceptor-ref name="defaultStack"> <param name="fileUpload.allowedTypes"> image/png,image/gif,image/jpeg,image/jpg,image/x-png </param> <param name="fileUpload.maximumSize">102400000</param>
</interceptor-ref>
</action>
原來上網查了一下,還要加入這個東西
在struts.xml中加入 <constant name="struts.multipart.maxSize" value="10000000"/> ,大約10M
才能使攔截器起到做用
struts.multipart.maxSize掌控整個項目所上傳文件的最大的Size
struts.multipart.maxSize和fileUpload攔截器的maximumSize屬性分工不一樣,總結以下:
1.struts.multipart.maxSize掌控整個項目所上傳文件的最大的Size。超過了這個size,後臺報錯,程序處理不了如此大的文件。fielderror裏面會有以下的提示:
the request was rejected because its size (16272982) exceeds the configured maximum (9000000)
2.fileUpload攔截器的maximumSize屬性必須小於struts.multipart.maxSize的值。
struts.multipart.maxSize默認2M,當maximumSize大於2M時,必須設置struts.multipart.maxSize的值大於maximumSize。
3.當上傳的文件大於struts.multipart.maxSize時,系統報錯
當上傳的文件在struts.multipart.maxSize和maximumSize之間時,系統提示:
File too large: file "MSF的概念.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
當上傳的文件小於maximumSize,上傳成功。
8.如何實現Struts2自定義攔截器;
1.實現Interceptor 接口, 實現接口裏面的方法
2.繼承AbstractInterceptor 抽象類, 重寫裏面的方法
須要在struts.xml文件中配置interceptor 標籤及 interceptor-stack攔截器鏈(棧)標籤;
而後在每一個action標籤中引用便可.
9.Struts2 如何實現國際化
須要struts.xml文件中定義<constant name="struts.custom.i18n.resources" value="message" />
須要給不一樣的語言地區配置不一樣的資源文件; message_zh_CN.properties, message_en_US.properties, zh_TW, zh_HK, en_UK,
在jsp頁面使用s:text標籤實現獲取國際化中的數據;
在action中使用getText方法實現獲取國際化中的數據(前提是action必須繼承ActionSupport);
在jsp頁面中使用i18n標籤獲取國際化中的數據。
10.struts-default.xml 文件的做用
struts-default.xml文件是struts2框架默認加載的配置文件。它定義struts2一些核心的bean和攔截器。
這些攔截器是以 key-value 對的形式配置在struts-default.xml中,
其中 name 是攔截器名字,就是後面使用該攔截器的引用點,value則指定攔截器的實現類。
11.Struts 有哪些標籤; 你使用過哪些?
12.Struts支持哪些表達式? OGNL有什麼特色?
el、jstl表達式
OGNL有什麼特色:
13.OGNL表達式中’#’, ‘%’, ’$’ 三個符號有哪些做用?
1)訪問非根對象屬性,例如示例中的#session.msg表達式,因爲Struts 2中值棧被視爲根對象,因此訪問其餘非根對象時,須要加#前綴。實際上,#至關於ActionContext. getContext();#session.msg表達式至關於ActionContext.getContext().getSession(). getAttribute(」msg」) 。
2)用於過濾和投影(projecting)集合,如示例中的persons.{?#this.age>20}。
3)用來構造Map,例如示例中的#{’foo1′:’bar1′, ’foo2′:’bar2′}。
2.%符號%符號的用途是在標誌的屬性爲字符串類型時,計算OGNL表達式的值。以下面的代碼所示: 構造Map <s:set name=」foobar」 value=」#{’foo1′:’bar1′, ‘foo2′:’bar2′}」 />
The value of key 「foo1″ is <s:property value=」#foobar['foo1']」 />
不使用%:<s:url value=」#foobar['foo1']」 />
使用%:<s:url value=」%{#foobar['foo1']}」 />
3.$符號$符號主要有兩個方面的用途。
在國際化資源文件中,引用OGNL表達式,例如國際化資源文件中的代碼:reg.agerange=國際化資源信息:年齡必須在${min}同${max}之間。
在Struts 2框架的配置文件中引用OGNL表達式,例以下面的代碼片段所示:
<validators>
<field name=」intb」>
<field-validator type=」int」>
<param name=」min」>10</param>
<param name=」max」>100</param>
<message>BAction-test校驗:數字必須爲${min}爲${max}之間!</message>
</field-validator>
</field>
</validators>
14.Struts2中返回結果類型(struts-default.xml)中的dispatcher, redirect,stream 和redirect-action的區別?
dispatcher | org.apache.struts2.dispatcher. ServletDispatcherResult |
默認結果類型,用來呈現JSP頁面 |
chain | com.opensymphony.xwork2. ActionChainResult |
將action和另一個action連接起來 |
freemarker | org.apache.struts2.views.freemarker. FreemarkerResult |
呈現Freemarker模板 |
httpheader | org.apache.struts2.dispatcher. HttpHeaderResult |
返回一個已配置好的HTTP頭信息響應 |
redirect | org.apache.struts2.dispatcher. ServletRedirectResult |
將用戶重定向到一個已配置好的URL |
redirectAction | org.apache.struts2.dispatcher. ServletActionRedirectResult |
將用戶重定向到一個已定義好的action |
stream | org.apache.struts2.dispatcher. StreamResult |
將原始數據做爲流傳遞迴瀏覽器端, 該結果類型對下載的內容和圖片很是有用 |
velocity | org.apache.struts2.dispatcher. VelocityResult |
呈現Velocity模板 |
xslt | org.apache.struts2.views.xslt. XSLTResult |
呈現XML到瀏覽器, 該XML能夠經過XSL模板進行轉換 |
plaintext | org.apache.struts2.dispatcher. PlainTextResult |
返回普通文本類容 |
15.ActionSupport類的做用?
驗證, 獲取資源文件的數據, action
16.Struts2 攔截器有哪些用處? 你在項目中是如何使用的?
在調用action方法前執行,通常用在權限控制
攔截器(interceptor)是Struts2最強大的特性之一,也能夠說是struts2的核心,攔截器可讓你在Action和result被執行以前或以後進行一些處理。同時,攔截器也可讓你將通用的代碼模塊化並做爲可重用的類。
Struts2中的不少特性都是由攔截器來完成的。攔截是AOP的一種實現策略。攔截器是動態攔截Action調用的對象。它提供了一種機制可使開發者能夠定義在一個action執行的先後執行的代碼,也能夠在一個action執行前阻止其執行。同時也是提供了一種能夠提取action中可重用的部分的方式。
20.Struts2中解決重複提交的token 思想是什麼?
須要在jsp的頁面使用s:token標籤;
須要在struts.xml文件的action中配置<interceptor-ref name="token" />
須要配置一個返回invalid.token結果對應的頁面 <result name="invalid.token">/reg.jsp</result>
22.struts2的四個主題simple,xhtml(默認主題),css_xhtml和ajax的區別?
23.FilterDispatcher(StrutsPrepareAndExecuteFilter)核心控制器的做用?