struts2總結


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有什麼特色:

            一、支持對象方法調用,形式如:objName.methodName();   
  
            二、支持類靜態的方法調用和值訪問,表達式的格式爲@[類全名(包括包路)]@[方法名 | 值名],例如:   
  
                      @java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;   
  
            三、支持賦值操做和表達式串聯,例如:   
  
                      price=100, discount=0.8, calculatePrice(),這個表達式會返回80;   
   
            四、訪問OGNL上下文(OGNL context)和ActionContext;   
  
            五、操做集合對象。
 
 

13.OGNL表達式中’#’, ‘%’, ’$’ 三個符號有哪些做用?

      OGNL表達式很是強大~其中#、%、$這三個符號在OGNL表達式中常常出現,而這三種符號也是開發者不容易掌握和理解的部分,要認真區分。
     1.#符號的用途通常有三種。

   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的區別?

       在默認時, <result>標籤的type屬性值是「dispatcher」(實際上就是轉發,forward)。開發人員能夠根據本身的須要指定不一樣的類型,如redirect、stream等。以下面代碼所示: <result name="save" type="redirect"> /result.jsp </result>
這時result-type能夠在struts2-core-2.0.11.1.jar包或struts2源代碼中的 struts-default.xml文件中找到,在這個文件中找到<result-types>標籤,全部的result-type都在裏面定義了。
 
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
返回普通文本類容
    dispatcher:用於頁面轉發,頁面跳轉過程一直是同一個線程,Action中的數據一直保存在。
    redirect:可用於返回一個頁面、一個action、連接到一個網址
       缺點:redirect把一個http返回碼(SUCCESS)以及返回的頁面位置一塊兒從新發給web服務器,容納後由web服務器產生一個新的HTTP請求,就會產生一個新的線程,保存在原來Action執行的線程中的數據就沒法訪問。 因此,result須要包含Action的數據,那麼redirect不是一個可行的辦法。由於新的HTTP請求時在Servlet容器的新的線程中處理的,ActionContext中的全部狀態都不會存在。
chain:功能與redirect的action轉發相似,不過與redirectaction轉發功能不一樣的是它能夠將Action中的數據一直保存在同一個HTTP請求中。
 


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的區別?

1 simple主題是最簡單的主題,它是最底層的結構,主要用於構建附加的功能或者行爲(例如在此主題基礎上進行擴展),
使用simple主題時,每一個UI標籤只生成一個簡單的HTML元素,不會生成其餘額外的內容。
 
Struts2的xhtml, css_xhtml主題都是對simple主題的包裝和擴展。
 
2.xhtml主題是Struts2的默認主題,它對simple主題進行擴展,在該主題的基礎上增長了以下附加的特性:
 
1,針對HTML標籤(如textfield和select標籤)使用標準的兩列表格佈局。
 
2,每一個HTML標籤的Label,便可以出如今HTML元素的左邊,也能夠出如今上邊,這取決於labelposition屬性的設置。
 
3,自動輸出校驗錯誤信息。
 
4,輸出JavaScript的客戶端校驗。
 
3.css_xhtml主題則對原有的xhtml主題進行了擴展,在xhtml主題基礎上加入了CSS樣式控制。
 
ajax主題目對xhtml主題目進行了擴展,在xhtml主題上爲每一個標籤提供了額外的Ajax支持。
ajax主題的Ajax支持是以Dojo和DWR爲基礎的。
 
4.ajax主題在xhtml主題基礎上增長了以下特性:
 
1,支持Ajax方式的客戶端校驗。
 
2,支持遠程表單的異步提交(最好和submit標籤一塊兒使用)。
 
3,提供高級的div標籤,容許實現局部更新部分HTML的功能。
 
4,提供高級的a標籤,容許動態加載並執行遠端的javaScript代碼。
 
5,提供支持ajax的tabbedPanel。
 
6,提供"富客戶端"模型的pub-sub事件模型。
 
5,Struts2的表單標籤

 

23.FilterDispatcher(StrutsPrepareAndExecuteFilter)核心控制器的做用?

相關文章
相關標籤/搜索