標籤:java面試 struts2 攔截器 面試 值棧
1 Struts2工作原理
一個請求在Struts2架構中的處理大概分為以下幾個步驟:
1、用戶端初始化一個指向Servlet容器(例如Tomcat)的請求;
2、這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他架構的整合很有協助,例如:SiteMeshPlugin);
3、接著FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請是否需要調用某個Action。
4、如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy。
5、ActionProxy通過ConfigurationManager詢問架構的設定檔,找到需要調用的Action類。
6、ActionProxy建立一個ActionInvocation的執行個體。
7、ActionInvocation執行個體使用命名模式來調用,在調用Action的過程前後,涉及到相關攔截器(Intercepter)的調用。
8、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2架構中繼承的標籤。在這個過程中需要涉及到ActionMapper。
2 Struts的設計模式
MVC模式:web應用程式啟動時就會載入並初始化ActionServlet。使用者提交表單時,一個配置好的ActionForm對象被建立,並被填入表單相應的資料,ActionServlet根據Struts-config.xml檔案配置好的設定決定是否需要表單驗證,如果需要就調用ActionForm的Validate()驗證後選擇將請求發送到哪個Action,如果Action不存在,ActionServlet會先建立這個對象,然後調用Action的execute()方法。Execute()從ActionForm對象中擷取資料,完成商務邏輯,返回一個ActionForward對象,ActionServlet再把客戶請求轉寄給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp產生動態網頁,返回給客戶。
3 Struts2 的特點
Struts2 是一個相當強大的Java Web開源架構,是一個基於POJO的Action的MVC Web架構。它基於當年的Webwork和XWork架構,繼承其優點,同時做了相當的改進。
1、Struts2基於MVC架構,架構結構清晰,開發流程一目瞭然,開發人員可以很好的掌控開發的過程。
2、使用OGNL進行參數傳遞。OGNL提供了在Struts2裡訪問各種範圍中的資料的簡單方式,你可以方便的擷取Request,Attribute,Application,Session,Parameters中的資料。大大簡化了開發人員在擷取這些資料時的代碼量。
3、強大的攔截器 。Struts2 的攔截器是一個Action層級的AOP,Struts2中的許多特性都是通過攔截器來實現的,例如異常處理,檔案上傳,驗證等。攔截器是可配置與重用的,可以將一些通用的功能如:登入驗證,許可權驗證等置於攔截器中以完成一些Java Web項目中比較通用的功能。在我實現的的一Web項目中,就是使用Struts2的攔截器來完成了系統中的許可權驗證功能。
4、易於測試 。Struts2的Action都是簡單的POJO,這樣可以方便的對Struts2的Action編寫測試案例,大大方便了Java Web項目的測試。
5、易於擴充的外掛程式機制。在Struts2添加擴充是一件愉快而輕鬆的事情,只需要將所需要的Jar包放到WEB-INF/lib檔案夾中,在struts.xml中作一些簡單的設定就可以實現擴充。
6、模組化管理。Struts2已經把模組化作為了體系架構中的基本思想,可以通過三種方法來將應用程式模組化:將配置資訊拆分成多個檔案把自包含的應用模組建立為外掛程式建立新的架構特性,即將與特定應用無關的新功能組織成外掛程式,以添加到多個應用中去。
7、全域結果與聲明式異常 。為應用程式添加全域的Result,和在設定檔中對異常進行處理,這樣當處理過程中出現指定異常時,可以跳轉到特定頁面。
3 Struts2攔截器原理
Struts2的攔截器實現相對簡單。當請求到達Struts 2的ServletDispatcher時,Struts2會尋找設定檔,並根據其配置執行個體化相對的攔截器對象,然後串成一個列表(list),最後一個一個地調用列表中的攔截器。事實上,我們之所以能夠如此靈活地使用攔截器,完全歸功於“動態代理”的使用。
http://blog.csdn.net/csh624366188/article/details/7543342
4 Struts2攔截器類型
內建攔截器:struts2的資料校正、國際化等功能都是在內建攔截器中實現的。如下所示:
自訂攔截器:
1、實現攔截器類:com.opensymphony.xwork2.interceptor.Interceptor。
2、註冊自訂攔截器:需要在<interceptors>中註冊。
3、可以將攔截器放入攔截器棧<interceptor-stack>。
4、在action中應用攔截器。
5、也可以設定預設的攔截器。<default-interceptor-refname="myInterceptor"/>
http://blog.csdn.net/csh624366188/article/details/7545677
5 攔截器和過濾器的差異
攔截器和過濾器之間有很多相同之處,但是兩者之間存在根本的差別。其主要區別為以下幾點:
1)攔截器是基於JAVA反射機制的,而過濾器是基於函數回調的。
2)過濾器依賴於Servlet容器,而攔截器不依賴於Servlet容器。
3)攔截器只能對Action請求起作用,而過濾器可以對幾乎所有的請求起作用。
4)攔截器可以訪問Action上下文、值棧裡的對象,而過濾器不能
5)在Action的生命週期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次(init方法)。
6 Struts2核心控制器的作用
StrutsPrepareAndExecuteFilter的作用:
負責攔截由<url-pattern>/*</url-pattern>指定的所有使用者請求,當使用者請求到達時,該Filter會過濾使用者的請求。預設情況下,如果使用者請求的路徑不帶尾碼或者尾碼以.action結尾,這時請求將被轉入struts2架構處理,否則struts2架構將略過該請求的處理。
可以通過常量"struts.action.extension"修改action的尾碼,如:
<constant name="struts.action.extension" value="do"/>
7 Struts2擷取HttpServletRequest、HttpSession、ServletContext對象
通過ServletActionContext的相應的靜態方法即可擷取。
8 Struts2管理action的方式及優點
Struts2架構中使用包來管理Action,包的作用和java中的類包是非常類似的。主要用於管理一組業務功能相關的action。在實際應用中,我們應該把一組業務功能相關的Action放在同一個包下。
9 Struts2的預設包struts-default的作用
1)struts-default包是由struts內建的,它定義了struts2內部的眾多攔截器和Result類型,而Struts2很多核心的功能都是通過這些內建的攔截器實現,如:從請求中把請求參數封裝到action、檔案上傳和資料驗證等等都是通過攔截器實現的。當包繼承了struts-default包才能使用struts2為我們提供的這些功能。
2)struts-default包是在struts-default.xml中定義,struts-default.xml也是Struts2預設設定檔。 Struts2每次都會自動載入 struts-default.xml檔案。
3)通常每個包都應該繼承struts-default包。
10 Struts2對指定的方法進行驗證
1)validate()方法會校正action中所有與execute方法簽名相同的方法;
2)要校正指定的方法通過重寫validateXxx()方法實現,validateXxx()只會校正action中方法名為Xxx的方法。其中Xxx的第一個字母要大寫;
3)當某個資料校正失敗時,調用addFieldError()方法往系統的fieldErrors添加校正失敗資訊(為了使用addFieldError()方法,action可以繼承ActionSupport), 如果系統 的fieldErrors包含失敗資訊,struts2會將請求轉寄到名為input的result;
4)在input視圖中可以通過<s:fielderror/>顯示失敗資訊。
5)先執行validateXxxx()->validate()->如果出錯了,會轉寄<result name="input"/>所指定的頁面,如果不出錯,會直接進行Action::execute()方法。
http://wenku.baidu.com/link?url=i9cPHN8n7qGp0WpK78nqFiEzcbo5hYF1sBscY19jGKBDwcUyrmOgyIbZeGPj1SfeVr3rGHGUk_2aviSfVjsZTLUTzykkhDNcIMZV1MPu0oq
11 struts2預設攔截器
fileUpload:提供檔案上傳功能
i18n:記錄使用者選擇的locale
cookies:使用配置的name,value來是指cookiescheckbox添加了checkbox自動處理代碼,將沒有選中的checkbox的內容設定為false,而html預設情況下不提交沒有選中的checkbox。
chain:讓前一個Action的屬性可以被後一個Action訪問,現在和chain類型的result()結合使用。
alias:在不同請求之間將請求參數在不同名字件轉換,請求內容不變
12 ValueStack的原理與生命週期
1)ValueStack貫穿整個Action的生命週期,儲存在request域中,所以ValueStack和request的生命週期一樣。當Struts2接受一個請求時,會迅速建立ActionContext,ValueStack,action。然後把action存放進ValueStack,所以action的執行個體變數可以被OGNL訪問。請求來的時候,action、ValueStack的生命開始,請求結束,action、ValueStack的生命結束;
2)action是多例的,和Servlet不一樣,Servelt是單例的;
3)每個action的都有一個對應的值棧,值棧存放的資料類型是該action的執行個體,以及該action中的執行個體變數,Action對象預設儲存在棧頂;
4)ValueStack本質上就是一個ArrayList;
5)關於ContextMap,Struts會把下面這些映射壓入ContextMap中,parameters:該Map中包含當前請求的請求參數;request:該Map中包含當前request對象中的所有屬性;session:該Map中包含當前session對象中的所有屬性;application:該Map中包含當前application對象中的所有屬性;attr:該Map按如下順序來檢索某個屬性:request,session, application。
6)使用OGNL訪問值棧的內容時,不需要#號,而訪問request、session、application、attr時,需要加#號;
7)OGNL運算式需要配合Struts標籤才可以使用。如:<s:propertyvalue="name"/>
8)Struts2設定檔中引用OGNL運算式,引用值棧的值,此時使用的"$",而不是#或者%。
http://blog.csdn.net/wyply115/article/details/8257140
13 ActionContext、ServletContext、pageContext的區別
1)ActionContext是當前的Action的上下文環境,通過ActionContext可以擷取到request、session、ServletContext等與Action有關的對象的引用;
2)ServletContext是域對象,一個web應用中只有一個ServletContext,生命週期伴隨整個web應用;
3)pageContext是JSP中的最重要的一個內建對象,可以通過pageContext擷取其他域對象的應用,同時它是一個域對象,作用範圍只針對當前頁面,當前頁面結束時,pageContext銷毀,生命週期是JSP四個域對象中最小的。
14 result的type有幾種類型
10種
dispatcher:struts預設的結果類型,把控制權轉寄給應用程式裡的某個資源。不能把控制權轉寄給一個外部資源,若需要把控制權重新導向到一個外部資源,應該使用redirect。
redirect:把響應重新導向到另一個資源(包括一個外部資源)。
redirectAction:把響應重新導向到另一個Action。
freemarker、velocity、chain、httpheader、xslt、plainText、stream
15 攔截器的生命週期與工作過程
1)每個攔截器都是實現了Interceptor介面的 Java 類;
2)init():該方法將在攔截器被建立後立即被調用,它在攔截器的生命週期內只被調用一次。可以在該方法中對相關資源進行必要的初始化;
3)intercept(ActionInvocation invocation):每攔截一個動作請求,該方法就會被調用一次;
4)destroy:該方法將在攔截器被銷毀之前被調用,它在攔截器的生命週期內也只被調用一次;
5)Struts2中有內建了18個攔截器。
16 Struts2檔案的上傳
1、JSP頁面:
1)JSP頁面的上傳檔案的組件:<s: file name=”upload” />,如果需要一次上傳多個檔案,就必須使用多個 file 標籤,但它們的名字必須是相同的,即:name=“xxx”的值必須一樣;
2)必須把表單的enctype屬性設定為:multipart/form-data;
3)表單的方法必須為post,因為post提交的資料在訊息體中,而無大小限制。
2、對應的action:
1)在 Action 中新添加 3 個和檔案上傳相關的屬性;
2)如果是上傳單個檔案,uploadImage屬性的類型就是 java.io.File,它代表被上傳的檔案,第二個和第三個屬性的類型是 String,它們分別代表上傳檔案的檔案名稱和檔案類型,定義方式是分別是:jsp頁面file組件的名稱+ContentType,jsp頁面file組件的名稱+FileName.
3)如果上傳多個檔案,可以使用數組或 List。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Java面試-Struts2