1. 程式人生 > >史上最全的 struts2 面試題

史上最全的 struts2 面試題

1 Struts2與Struts1的聯絡與區別 為什麼要用Struts2
struts1與struts2都是mvc框架的經典實現模式。
Struts2不是從Struts1升級而來,而是有WebWork改名而來,而WebWork只是Xwork加了很多WEB攔截器而已.

區別:

1.核心控制器改成了過濾器(過濾器比Servlet的級別要高,因為程式執行時是先進入過濾器再進入Servlet)
2.struts1要求業務類必須繼承Action或dispatchAction,struts2不強制這麼做,只需要提供一個pojo類。
3.繫結值到業務類時struts1是通過ActionForm,struts2是通過模型或屬性驅動直接繫結到Action屬性。

4.struts1嚴重依賴於Servlet(因為太過於依賴於api的HttpServletRequest與HttpServletResponse的兩個引數),struts2就則脫離了Servlet的API。
5.管理Action時struts1是單例模式,struts2是每個請求產生一個例項。
6.在表示式的支援上struts2不僅有jstl,還有功能更加強大的ognl表示式。
7.struts1的型別轉換是單向的(頁面到ActionForm),struts2是雙向的(頁面到Action再到頁面回顯)
8.校驗,struts1沒有針對具體方法的校驗,struts2提供了指定某個方法進行效驗,還有框架校驗。

9.struts2提供了攔截器,利用攔截器可以在訪問Action之前或之後增加如許可權攔截等功能。
10.struts2提供了全域性範圍,包範圍,Action範圍的國際化資原始檔管理實現。
11.struts2支援多種檢視型別,如:jsp,freemaker,velocity,原始碼等。

2.Struts2的核心是什麼,體現了什麼思想

Struts2的核心是攔截器,基本上核心功能都是由攔截器完成,攔截器的實現體現了AOP(面向切面程式設計)思想

3 為何繼承ActionSupport
因為ActionSupport實現了Action介面,提供了國際化,校驗功能。
ActionSupport實現了國際化功能:因為它提供了一個getText(String key)方法實現國際化,該方法從資原始檔上獲取國際化資訊。

Action介面提供了五個常量(success,error,login,input,none)。

4 Struts2 如何定位action中的方法
1 感嘆號定位方法(動態方法)。
2 在xml配置檔案中通過配置多個action,使用action的method指定方法。

3 使用萬用字元(*)匹配方法。

5 模型驅動與屬性驅動是什麼 模型驅動使用時注意什麼問題

答:模型驅動與屬性驅動都是用來封裝資料的。
1.模型驅動:在實現類中實現ModelDriven<T>介面使用泛型把屬性類封裝起來,重寫getModel()方法,然後在實現類裡建立一個屬性類的例項,
通過這個例項拿到封裝進來的值,拿返回值的時候使用工具進行值拷貝。
2.屬性驅動:在實現類裡定義屬性,生成get與set方法,通過屬性來拿值。
注意:模型驅動使用時注意的是在使用前先把屬性類例項化,否則會出現空指標錯誤,拿返回物件的值需要用拷貝記憶體因為地址發生改變。
模型驅動不可以使用區域性型別轉換器。

3.Struts2是怎樣進行值封裝的?

struts2的值封裝實際上是採用了ognl表示式.
struts2的攔截器經過模型驅動時會先判斷action是否實現了ModelDriven,如果是則拿到模型的例項放在了棧的頂部,
到屬性驅動的時候會從棧裡面把棧頂的例項給取出來,從頁面傳進來的值放在一個map集合當中,
通過map集合進行迭代會通過ognl技術把值封裝到例項中。

6 Struts2如何進行校驗

程式設計校驗
1 繼承ActionSupport,重寫validate方法(針對所有方法)(伺服器端程式設計,不推薦)。
2 validateXxx方法(Xxx代表的是方法名,針對某個方法進行效驗)。
3 如果有錯誤就把錯誤資訊放在FieldError中,並且跳轉到指定的錯誤業務類,沒有就會進行action方法的呼叫。
2 校驗框架
每個Action類有一個校驗檔案,命名 Action類名-validation.xml,且與Action類同目錄,這是對action裡面所有的方法進行校驗。
對Action裡面的指定方法做校驗使用Action的類名-訪問路徑_方法名-validation.xml。
如:StudentAction-student_add-validation.xml
在效驗檔案裡又分為兩種:
欄位校驗:欄位用什麼校驗器來校驗。
非欄位校驗:是用校驗器校驗什麼欄位。
通俗點講:欄位校驗:校驗誰,用什麼方法。
非欄位校驗:用什麼校驗,校驗誰 。

7 談談Struts2 的國際化
答:
在struts2中是使用了攔截器來實現國際化。
struts2的國際化分為三部分:
1.Action範圍,這種範圍是用Action的實現類的類名來作為字首__語言名稱_國家地區名(大寫).properties.
2.包範圍,包範圍是用package作為字首__語言名稱_國家地區名(大寫).properties。
3.全域性範圍,全域性範圍的字首預設的是application,可以通過xml配置檔案配置常量(使用constant標籤註冊i18l攔截器)來指定字首,
字首__語言名稱_國家地區名(大寫).properties。
國際化實現的原理:通過i18n攔截器獲得請求引數request——locale的值(zh或者是en)並把當前的值轉化為locale物件,
把locale物件存在ww_trans_i18n_locale的session作用域中,根據struts2的請求處理流程,
攔截器只會在進入action的時候才會呼叫,所有我們一般把對jsp的訪問轉化為對action的訪問。

8 OGNL是什麼你在專案中如何使用它

OGNL是:物件圖形導航語言。
原ognl是單個物件的,在struts2的應用是多個物件的,struts2的型別轉換也是通過ognl來實現的。
Struts2中預設的表示式語言就是ognl,struts2的取值設值都是通過ognl來實現的,struts2要依靠它的標籤才可以使用ognl。
相對於jstl或者其他表示式語言,它有如下優勢:
1 能夠呼叫物件例項的方法
2 能夠呼叫類的靜態方法
3 操作集合物件
4 訪問Ognl上下文
取值時ognl有三個引數:1 表示式,2 ognl的上下文(map),3 物件例項(值棧)。
如果表示式帶#號是從上下文中(map)拿值,否則是從值棧中拿值。
設值時有四個引數:1 表示式,2 ognl的上下文(map),3 物件例項,4 設入的值
如果表示式帶#號是把值設入上下文中(map),否則是把值設入值棧中。
在struts2中 ognl的實現關係:ActionConetxt。
ognl 3個常用的符號 # $ %
# 1 構造map,list集合。
2 取ognl上下文的值。
3 用來過濾集合。
$ 1 在校驗框架中取資原始檔中的值。
2 可以在配置檔案中傳遞引數。
% 使用百分號可以進行轉義。

9 Strust2如何訪問Servlet API

答:
1:通過ActionContext可以獲得request,application,session三個作用域(struts2實際上是通過介面卡來把servlet的api轉換為一個map,
並把這些map放在ActionContext裡面)。
2:通過ActionContext的子類ServletActionContext去獲取原滋原味的API。
3:可以通過實現ServletRequestAware介面,重寫裡面的setServletRequest方法可以獲得request,實際上是通過set的依賴注入。

10 什麼是攔截器 說說Struts2用攔截器來幹什麼 說出6個攔截器來

答:
在訪問類的某個方法或者屬性之前執行,攔截的是Action的請求,進行攔截然後在方法的執行前或者之後加入某些操作,
如:國際化,許可權,效驗等與原始碼無關的操作。
國際化,表單重複提交,型別轉換,自動裝配,資料封裝,異常處理,模型驅動,請求引數,處理型別轉換錯誤,日誌攔截器。

如何實現自定義攔截器?

答:可以繼承MethodFilterInterceptor重寫doIntercept方法指定某個方法進行攔截,或者繼承AbstractInterceptor,重寫intercept方法,
在xml配置檔案中定義自定義攔截器,然後注入到攔截器棧中,再把攔截器引用到action中。
在把攔截器注入攔截器棧時配置<param>標籤,使用name屬性配置excludeMethods表示不攔截指定方法。
在配置檔案中配置includeMethods指定攔截某個方法。
可以配置到某個action單獨使用,也可以配置到包下面的所有action使用。
需要注意什麼?
答:注意要把預設的攔截器棧重新引用,否則會被覆蓋。

11 專案中遇到什麼問題

答:
1.表單重複提交。
在頁面使用標籤<s:token/>(令牌機制),使用檢驗表單從復提交的攔截器tokenSession。。
2.國際化必須經過Action
原因:因為國際化是通過i18攔截器來實現的,而攔截器是在訪問Action的時候才執行。
解決方式:在對jsp的訪問之前進行對action的訪問。
3.使用模型驅動拿返回值的時候地址記憶體不一樣,會拿不到值。
原因:因為struts2最開始是把建立action的例項放到ActionContext的棧頂,後來把建立模型驅動的例項放到棧頂,
而通過struts2的標籤去取值會取棧頂的例項,而此時拿到的還是最開始的建立的那個例項,所以為空。
解決方式:利用原型進行物件拷貝,使用拷貝工具,BeanUtils或者是propertyUtils。
4.在頁面使用轉發會報404錯。
原因:struts2使用的是filter機制,<jsp:forward/>的機制是servlet。
解決方式:可以通過過濾器改變請求地址,
5.用字串的時候需要用雙引號而不是單引號,單引號在外,雙引號在內。
7.當效驗出錯時,要跳轉到相應的頁面。
解決方式:使用萬用字元來解決。
...... 這些問題都可以自己根據實際情況總結

12 ActionContext是用來幹什麼的

答:ActionContext是Action的上下文。
通過ActionContext這個類來可以獲得:request,application,session,Locale、ValueStack,ConversionErrors
1 可以獲得servlet的api:request,application,session。
2 進行國際化:獲得語言環境 Locale。
3 收集錯誤資訊:ConversionErrors。
4 有個值棧來裝action例項與建立的模型驅動的例項:ValueStack。
5 ActionContext是執行緒安全的-用本地執行緒實現的。

13 Struts2是如何實現mvc的:struts2的底層檢視預設是freemaker。什麼mvc?

M:模型,V:檢視,C:控制器
在struts2中分別對應什麼?
M(模型):除核心控制器外都屬於模型,實現業務的類(service層與dao層)。
V(檢視):result,type,dispatcher預設的(jsp,freemaker,velocity,原始碼等)。
C(控制器):核心控制器與業務控制器。
mvc解決什麼問題?
解決了資料封裝,型別轉換,資料效驗,國際化,異常處理等問題。

14.為什麼要繼承預設的包?

因為在Strtus2裡面預設有很多的常量,攔截器,還有一些bean,如果繼承預設的包,這些預設值和常量就會繼承過來,?

15 .常見的有那些有十幾種結果集型別,

常見的結果集型別有dispatcher,redirect,redirectAction,stream等
預設的是dispatcher,值得是轉發
redirect指重定向,
redirectAction是重定向到一個Action
stream是返回一個流,一般用在檔案下載上面

16 開發專案時struts2在頁面怎樣拿值?

從值棧中或者是ognl的上下文

17.怎麼樣用Struts2進行檔案的上傳或者下載

Struts2裡面已經提供了預設的攔截器來處理上傳,只要在jsp用了s:file標籤,把s:from的enctype 屬性設定為 multipart/form-data,然後在action裡面定義三個欄位 File file ,String [file]ContentType,String [file]?FileName即可,如果有多個檔案上傳,那麼就用List<File>來接受,然後把接受到的File構建成FileInputStream,轉化成硬碟上面的檔案即可(用輸出流)
下載用了resust為stream的型別,然後在action定義四個屬性,預設的有個是InputStream 的型別叫inputStream的,從硬碟上面讀取檔案到這個流賦值即可.

18.簡單講下struts裡面的標籤,說不少於5個

s:iterater ?s:property s:form s:url s:if 等等

19.預設struts2裡面的標籤取值都是從那裡取值的

預設都是從OGNL值棧裡面取值的?

21.ValueStack分為那兩部分,組成部分是什麼,分別怎麼訪問

分為物件棧和ContextMap ,物件棧裡面放入的是Action及其使用者定義的物件,在前臺可以直接訪問,在contextMap裡面放入的是Servlet物件轉化後map,譬如requestMap,sessionMap,訪問的時候前面加#即可.?

22.標籤<s:property>和el表示式有什麼區別,

它們都可以從值棧裡面取值,但是el表示式只能取屬性有get set方法的簡單資料型別,如果要取得陣列的一些方法等複雜資料物件型別,那麼就要用s:property標籤

23 struts2的請求處理流程

答:
1.客戶端傳送請求。
2.經過一系列的過濾器(如:ActionContextCleanUp、SiteMesh等)到達核心控制器(FilterDispatcher)。
3.核心控制器通過ActionMapper決定呼叫哪個Action,如果不是呼叫Action就直接跳轉到jsp頁面。
4.如果ActionMapper決定呼叫了某個Action,核心控制器就把請求的處理交給一個代理類(ActionProxy)。
5.代理類通過配置管理器(Configuration Manager)找到配置檔案(struts.xml)找到需要呼叫的Action類。
6.代理類還要建立一個Action的排程器(ActionInvocation)。
7.由排程器去呼叫Action,當然這裡還涉及到一些相關的攔截器的呼叫。
8.Action執行完後,這個排程器還會建立一個Result返回結果集,返回結果前還可以做一些操作(結果集前的監聽器)。

21.struts2原始碼與設計模式

答:
命令模式(發生.do請求封裝成action呼叫execute方法),代理模式(訪問action時核心控制器把請求交給代理類(ActionProxy)去訪問Action就是代理模式),
責任鏈模式(訪問action時經過一系列的攔截器就使用了責任鏈模式),介面卡(把Servlet的API通過介面卡轉換成Map,把Map放入ActionContext中),
組合模式(攔截器棧和攔截器就使用到組和模式)。
原始碼:
伺服器啟動的時候容器會建立FilterDispatcher例項,進入dispatcher.init()方法,在init方法裡面會初始化sturts2的一系列的配置檔案,
然後向伺服器傳送請求,進入doFilter方法,在裡面通過呼叫dispatcher.serviceAction方法,進入到Dispatcher裡面的serviceAction方法,
在這裡就會把servlet的api轉換為map,並把它一個個的放在ActionContext中,在這裡還會建立ActionProxy的例項去呼叫execute方法,
到StrutsActionProxy的execute方法,通過DefaultActionInvocation的例項去呼叫invoke方法,在invoke方法裡面會進行判斷攔截器是否存在,
如果存在就會呼叫intercept方法,在攔截器類(Intercept)中會通過DefaultActionInvocation例項呼叫裡面的invock方法,它們會形成遞迴呼叫,
當攔截器不存在的時候就會進入invokeActionOnly方法,判斷有沒有返回結果前的監聽器preResultListener如果有則進去一個個執行,

最後呼叫 executeResult()方法,建立result返回,執行execute方法,並返回檢視。

---------------------------------------------------------------------------------------------------

一、struts2工作流程
1、Struts 2框架本身大致可以分為3個部分:核心控制器FilterDispatcher、業務控制器Action和使用者實現的企業業務邏輯元件。
1)核心控制器FilterDispatcher是Struts 2框架的基礎,包含了框架內部的控制流程和處理機制。
2)業務控制器Action和業務邏輯元件是需要使用者來自己實現的。使用者在開發Action和業務邏輯元件的同時,還需要編寫相關的配置檔案,供核心控制器FilterDispatcher來使用。
        Struts 2的工作流程相對於Struts 1要簡單,與WebWork框架基本相同,所以說Struts 2是WebWork的升級版本。
2、基本簡要流程如下:
1)客戶端初始化一個指向Servlet容器的請求;
2)這個請求經過一系列的過濾器(Filter)
       (這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他框架的整合很有幫助,例如:SiteMesh Plugin)
3)接著FilterDispatcher被呼叫,
         FilterDispatcher詢問ActionMapper來決定這個請是否需要呼叫某個Action
4)如果ActionMapper決定需要呼叫某個Action,
         FilterDispatcher把請求的處理交給ActionProxy
5)ActionProxy通過Configuration Manager詢問框架的配置檔案,找到需要呼叫的Action類
6)ActionProxy建立一個ActionInvocation的例項。
7)ActionInvocation例項使用命名模式來呼叫,
         在呼叫Action的過程前後,涉及到相關攔截器(Intercepter)的呼叫。
8)一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標籤。       在這個過程中需要涉及到ActionMapper
9)響應的返回是通過我們在web.xml中配置的過濾器
10)如果ActionContextCleanUp是當前使用的,則FilterDispatecher將不會清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,則將會去清理sreadlocals。 
 

二、說下Struts的設計模式
MVC模式:
1、web應用程式啟動時就會載入並初始化ActionServler。
2、使用者提交表單時,一個配置好的ActionForm物件被建立,並被填入表單相應的資料,ActionServler根據Struts-config.xml檔案配置好的設定決定是否需要表單驗證,如果需要就呼叫ActionForm的Validate()驗證後選擇將請求傳送到哪個Action,如果Action不存在,ActionServlet會先建立這個物件,然後呼叫Action的execute()方法.
3、Execute()從ActionForm物件中獲取資料,完成業務邏輯,返回一個ActionForward物件,ActionServlet再把客戶請求轉發給ActionForward物件指定的jsp元件,ActionForward物件指定的jsp生成動態的網頁,返回給客戶。

三、攔截器和過濾器的區別
1、攔截器是基於Java反射機制的,而過濾器是基於函式回撥的。
2、過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。
3、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。
4、攔截器可以訪問Action上下文、值棧裡的物件,而過濾器不能。
5、在Action的生命週期中,攔截器可以多次呼叫,而過濾器只能在容器初始化時被呼叫一次。
 

四、struts1於struts2的比較
1、Action   類: 

    Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類程式設計而不是介面。
  Struts   2   Action類可以實現一個Action介面,也可實現其他介面,使可選和定製的服務成為可能。Struts2提供一個ActionSupport基類去 實現常用的介面。Action介面不是必須的,任何有execute標識的POJO物件都可以用作Struts2的Action物件。
2、執行緒模式: 
    Struts1   Action是單例模式並且必須是執行緒安全的,因為僅有Action的一個例項來處理所有的請求。單例策略限制了Struts1   Action能作的事,並且要在開發時特別小心。Action資源必須是執行緒安全的或同步的。
Struts2   Action物件為每一個請求產生一個例項,因此沒有執行緒安全問題。(實際上,servlet容器給每個請求產生許多可丟棄的物件,並且不會導致效能和垃圾回收問題)
3、Servlet   依賴: 
    Struts1   Action   依賴於Servlet   API   ,因為當一個Action被呼叫時HttpServletRequest   和   HttpServletResponse   被傳遞給execute方法。
Struts   2   Action不依賴於容器,允許Action脫離容器單獨被測試。如果需要,Struts2   Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問HttpServetRequest   和   HttpServletResponse的必要性。
4、可測性: 
   測試Struts1   Action的一個主要問題是execute方法暴露了servlet   API(這使得測試要依賴於容器)。一個第三方擴充套件--Struts   TestCase--提供了一套Struts1的模擬物件(來進行測試)。
Struts   2   Action可以通過初始化、設定屬性、呼叫方法來測試,“依賴注入”支援也使測試更容易。
5、捕獲輸入: 
   Struts1   使用ActionForm物件捕獲輸入。所有的ActionForm必須繼承一個基類。因為其他JavaBean不能用作ActionForm,開發者經 常建立多餘的類捕獲輸入。動態Bean(DynaBeans)可以作為建立傳統ActionForm的選擇,但是,開發者可能是在重新描述(建立)已經存 在的JavaBean(仍然會導致有冗餘的javabean)。
Struts   2直接使用Action屬性作為輸入屬性,消除了對第二個輸入物件的需求。輸入屬性可能是有自己(子)屬性的rich物件型別。Action屬效能夠通過   web頁面上的taglibs訪問。Struts2也支援ActionForm模式。rich物件型別,包括業務物件,能夠用作輸入/輸出物件。這種   ModelDriven   特性簡化了taglib對POJO輸入物件的引用。
6、表示式語言: 
   Struts1   整合了JSTL,因此使用JSTL   EL。這種EL有基本物件圖遍歷,但是對集合和索引屬性的支援很弱。
Struts2可以使用JSTL,但是也支援一個更強大和靈活的表示式語言-- "Object   Graph   Notation   Language "   (OGNL).
7、繫結值到頁面(view): 
   Struts   1使用標準JSP機制把物件繫結到頁面中來訪問。
   Struts   2   使用   "ValueStack "技術,使taglib能夠訪問值而不需要把你的頁面(view)和物件繫結起來。ValueStack策略允許通過一系列名稱相同但型別不同的屬性重用頁面(view)。
8、型別轉換: 
   Struts   1   ActionForm   屬性通常都是String型別。Struts1使用Commons-Beanutils進行型別轉換。每個類一個轉換器,對每一個例項來說是不可配置的。
  Struts2   使用OGNL進行型別轉換。提供基本和常用物件的轉換器。
9、校驗: 
   Struts   1支援在ActionForm的validate方法中手動校驗,或者通過Commons   Validator的擴充套件來校驗。同一個類可以有不同的校驗內容,但不能校驗子物件。
   Struts2支援通過validate方法和XWork校驗框架來進行校驗。XWork校驗框架使用為屬性類型別定義的校驗和內容校驗,來支援chain校驗子屬性
10、Action執行的控制: 
   Struts1支援每一個模組有單獨的Request   Processors(生命週期),但是模組中的所有Action必須共享相同的生命週期。
   Struts2支援通過攔截器堆疊(Interceptor   Stacks)為每一個Action建立不同的生命週期。堆疊能夠根據需要和不同的Action一起使用。


五、為什麼要使用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編寫測試用例,大大方便了5Java Web專案的測試。
易於擴充套件的外掛機制在Struts2新增擴充套件是一件愉快而輕鬆的事情,只需要將所需要的Jar包放到WEB-INF/lib資料夾中,在struts.xml中作一些簡單的設定就可以實現擴充套件。
6、模組化管理
Struts2已經把模組化作為了體系架構中的基本思想,可以通過三種方法來將應用程式模組化:將配置資訊拆分成多個檔案把自包含的應用模組建立為外掛建立新的框架特性,即將與特定應用無關的新功能組織成外掛,以新增到多個應用中去。
7、全域性結果與宣告式異常
為應用程式新增全域性的Result,和在配置檔案中對異常進行處理,這樣當處理過程中出現指定異常時,可以跳轉到特定頁面。
他的如此之多的優點,是很多人比較的青睞,與spring ,hibernate進行結合,組成了現在比較流行的ssh框架,當然每個公司都要自己的框架,也是ssh變異的產品。


六、struts2有哪些優點?
1、在軟體設計上Struts2的應用可以不依賴於Servlet API和struts API。 Struts2的這種設計屬於無侵入式設計; 
2、攔截器,實現如引數攔截注入等功能; 
3、型別轉換器,可以把特殊的請求引數轉換成需要的型別; 
4、多種表現層技術,如:JSP、freeMarker、Velocity等; 
5、Struts2的輸入校驗可以對指定某個方法進行校驗; 
6、提供了全域性範圍、包範圍和Action範圍的國際化資原始檔管理實現 
 

七、struts2是如何啟動的?
 
1、struts2框架是通過Filter啟動的,即StrutsPrepareAndExecuteFilter,此過濾器為struts2的核心過濾器; 
3、StrutsPrepareAndExecuteFilter的init()方法中將會讀取類路徑下預設的配置檔案struts.xml完成初始化操作。struts2讀取到struts.xml的內容後,是將內容封裝進javabean物件然後存放在記憶體中,以後使用者的每次請求處理將使用記憶體中的資料,而不是每次請求都讀取struts.xml檔案。
 

八、struts2框架的核心控制器是什麼?它有什麼作用? 
1、Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。 
2、作用: 
 負責攔截由<url-pattern>/*</url-pattern>指定的所有使用者請求,當用戶請求到達時,該Filter會過濾使用者的請求。預設情況下,如果使用者請求的路徑 
不帶字尾或者字尾以.action結尾,這時請求將被轉入struts2框架處理,否則struts2框架將略過該請求的處理。 
可以通過常量"struts.action.extension"修改action的字尾,如: 
<constant name="struts.action.extension" value="do"/> 
如果使用者需要指定多個請求字尾,則多個字尾之間以英文逗號(,)隔開。
<constant name="struts.action.extension" value="do,Go"/>   
 

九、struts2配置檔案的載入順序? 
struts.xml ——> struts.properties 
常量可以在struts.xml或struts.properties中配置,如果在多個檔案中配置了同一個常量,則後一個檔案中配置的常量值會覆蓋前面檔案中配置的常量值. 
struts.xml檔案的作用:通知Struts2框架載入對應的Action資源
 

十、struts2常量的修改方式? 
常量可以在struts.xml或struts.properties中配置,兩種配置方式如下: 
1、在struts.xml檔案中配置常量 
<constant name="struts.action.extension" value="do"/> 
2、在struts.properties中配置常量(struts.properties檔案放置在src下): 
struts.action.extension=do
 
 
struts2如何訪問HttpServletRequest、HttpSession、ServletContext三個域物件? 
方案一: 
HttpServletRequest request =ServletActionContext.getRequest(); 
HttpServletResponse response =ServletActionContext.getResponse(); 
HttpSession  session=   request.getSession();
ServletContext servletContext=ServletActionContext.getServletContext();  
   
方案二: 
類 implements ServletRequestAware,ServletResponseAware,SessionAware,ServletContextAware 
注意:框架自動傳入對應的域物件 
 
 

十二、struts2是如何管理action的?這種管理方式有什麼好處? 
struts2框架中使用包來管理Action,包的作用和java中的類包是非常類似的。 
主要用於管理一組業務功能相關的action。在實際應用中,我們應該把一組業務功能相關的Action放在同一個包下。 
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包。      
 
 
 
十三、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()方法 
 
 
十四、struts2預設能解決get和post提交方式的亂碼問題嗎? 
不能。struts.i18n.encoding=UTF-8屬性值只能解析POST提交下的亂碼問題。 
 

十五、請你寫出struts2中至少5個的預設攔截器? 
fileUpload      提供檔案上傳功能 
i18n            記錄使用者選擇的locale 
cookies         使用配置的name,value來是指cookies 
checkbox        添加了checkbox自動處理程式碼,將沒有選中的checkbox的內容設定為false,而html預設情況下不提交沒有選中的checkbox。 
chain           讓前一個Action的屬性可以被後一個Action訪問,現在和chain型別的result()結合使用。 
alias           在不同請求之間將請求引數在不同名字件轉換,請求內容不變 
 
 
十六、值棧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、注意: Struts2中,OGNL表示式需要配合Struts標籤才可以使用。如:<s:property value="name"/> 
8、在struts2配置檔案中引用ognl表示式 ,引用值棧的值 ,此時使用的"$",而不是#或者%;  
 
 
十七、ActionContext、ServletContext、pageContext的區別? 
1、ActionContext是當前的Action的上下文環境,通過ActionContext可以獲取到request、session、ServletContext等與Action有關的物件的引用; 
2、ServletContext是域物件,一個web應用中只有一個ServletContext,生命週期伴隨整個web應用; 
3、pageContext是JSP中的最重要的一個內建物件,可以通過pageContext獲取其他域物件的應用,同時它是一個域物件,作用範圍只針對當前頁面,當前頁面結束時,pageContext銷燬, 
生命週期是JSP四個域物件中最小的。  
 

十八、result的type屬性中有哪幾種結果型別? 
一共10種:
   
dispatcher         
struts