Struts面試筆記

Struts2面試題
一、struts2工做流程
Struts 2框架自己大體能夠分爲3個部分:
核心控制器FilterDispatcher、業務控制器Action和用戶實現的企業業務邏輯組件。
核心控制器FilterDispatcher是Struts 2框架的基礎,
包含了框架內部的控制流程和處理機制。
業務控制器Action和業務邏輯組件是須要用戶來本身實現的。
用戶在開發Action和業務邏輯組件的同時,還須要編寫相關的配置文件,
供核心控制器FilterDispatcher來使用。
Struts 2的工做流程相對於Struts 1要簡單,與WebWork框架基本相同,
因此說Struts 2是WebWork的升級版本。基本簡要流程以下:
1 、客戶端初始化一個指向Servlet容器的請求;
二、 這個請求通過一系列的過濾器(Filter)
(這些過濾器中有一個叫作ActionContextCleanUp的可選過濾器,
這個過濾器對於Struts2和其餘框架的集成頗有幫助,例如:SiteMesh Plugin)
3 、接着FilterDispatcher被調用,
FilterDispatcher詢問ActionMapper來決定這個請是否須要調用某個Action
四、若是ActionMapper決定須要調用某個Action,
FilterDispatcher把請求的處理交給ActionProxy
五、ActionProxy經過Configuration Manager詢問框架的配置文件,
找到須要調用的Action類
六、ActionProxy建立一個ActionInvocation的實例。
七、ActionInvocation實例使用命名模式來調用,
在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用。
八、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果 。返回結果一般是(但不老是,也可 能是另外的一個Action鏈)一個須要被表示的JSP或者FreeMarker的模版。 在表示的過程當中可使用Struts2 框架中繼承的標籤。 在這個過程當中須要涉及到ActionMapper
九、響應的返回是經過咱們在web.xml中配置的過濾器
十、若是ActionContextCleanUp是當前使用的,則FilterDispatecher將不會清理sreadlocal ActionContext;若是ActionContextCleanUp不使用,則將會去清理sreadlocals。
二、說下Struts的設計模式
MVC模式: web應用程序啓動時就會加載並初始化ActionServler。用戶提交表單時,一個配置好的ActionForm對象被建立,並被填入表單相應的數據,ActionServler根據Struts-config.xml文件配置好的設置決定是否須要表單驗證,若是須要就調用ActionForm的Validate()驗證後選擇將請求發送到哪一個Action,若是Action不存在,ActionServlet會先建立這個對象,而後調用Action的execute()方法。Execute()從ActionForm對象中獲取數據,完成業務邏輯,返回一個ActionForward對象,ActionServlet再把客戶請求轉發給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生
成動態的網頁,返回給客戶。
三、攔截器和過濾器的區別
一、攔截器是基於java反射機制的,而過濾器是基於函數回調的。
二、過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。
三、攔截器只能對Action請求起做用,而過濾器則能夠對幾乎全部請求起做用。
四、攔截器能夠訪問Action上下文、值棧裏的對象,而過濾器不能。
五、在Action的生命週期中,攔截器能夠屢次調用,而過濾器只能在容器初始化時被調用一次。
四、struts1於struts2的比較
一、Action 類:
Struts1要求Action類繼承一個抽象基類。Struts1的一個廣泛問題是使用抽象類編程而不是接口。
Struts 2 Action類能夠實現一個Action接口,也可實現其餘接口,使可選和定製的服務成爲可能。Struts2提供一個ActionSupport基類去 實現經常使用的接口。Action接口不是必須的,任何有execute標識的POJO對象均可以用做Struts2的Action對象。
二、線程模式:
Struts1 Action是單例模式而且必須是線程安全的,由於僅有Action的一個實例來處理全部的請求。單例策略限制了Struts1 Action能做的事,而且要在開發時特別當心。Action資源必須是線程安全的或同步的。
Struts2 Action對象爲每個請求產生一個實例,所以沒有線程安全問題。(實際上,servlet容器給每一個請求產生許多可丟棄的對象,而且不會致使性能和垃圾回收問題)
三、Servlet 依賴:
Struts1 Action 依賴於Servlet API ,由於當一個Action被調用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。
Struts 2 Action不依賴於容器,容許Action脫離容器單獨被測試。若是須要,Struts2 Action仍然能夠訪問初始的request和response。可是,其餘的元素減小或者消除了直接訪問HttpServetRequest 和 HttpServletResponse的必要性。
四、可測性:
測試Struts1 Action的一個主要問題是execute方法暴露了servlet API(這使得測試要依賴於容器)。一個第三方擴展--Struts TestCase--提供了一套Struts1的模擬對象(來進行測試)。
Struts 2 Action能夠經過初始化、設置屬性、調用方法來測試,「依賴注入」支持也使測試更容易。
五、捕獲輸入:
Struts1 使用ActionForm對象捕獲輸入。全部的ActionForm必須繼承一個基類。由於其餘JavaBean不能用做ActionForm,開發者經 常建立多餘的類捕獲輸入。動態Bean(DynaBeans)能夠做爲建立傳統ActionForm的選擇,可是,開發者多是在從新描述(建立)已經存 在的JavaBean(仍然會致使有冗餘的javabean)。
Struts 2直接使用Action屬性做爲輸入屬性,消除了對第二個輸入對象的需求。輸入屬性多是有本身(子)屬性的rich對象類型。Action屬性可以經過 web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業務對象,可以用做輸入/輸出對象。這種 ModelDriven 特性簡化了taglib對POJO輸入對象的引用。
六、表達式語言:
Struts1 整合了JSTL,所以使用JSTL EL。這種EL有基本對象圖遍歷,可是對集合和索引屬性的支持很弱。
Struts2可使用JSTL,可是也支持一個更強大和靈活的表達式語言-- "Object Graph Notation Language " (OGNL).
七、綁定值到頁面(view):
Struts 1使用標準JSP機制把對象綁定到頁面中來訪問。
Struts 2 使用 "ValueStack "技術,使taglib可以訪問值而不須要把你的頁面(view)和對象綁定起來。ValueStack策略容許經過一系列名稱相同但類型不一樣的屬性重用頁面(view)。
八、類型轉換:
Struts 1 ActionForm 屬性一般都是String類型。Struts1使用Commons-Beanutils進行類型轉換。每一個類一個轉換器,對每個實例來講是不可配置的。
Struts2 使用OGNL進行類型轉換。提供基本和經常使用對象的轉換器。
九、校驗:
Struts 1支持在ActionForm的validate方法中手動校驗,或者經過Commons Validator的擴展來校驗。同一個類能夠有不一樣的校驗內容,但不能校驗子對象。
Struts2支持經過validate方法和XWork校驗框架來進行校驗。XWork校驗框架使用爲屬性類類型定義的校驗和內容校驗,來支持chain校驗子屬性
十、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是如何啓動的?
struts2框架是經過Filter啓動的,即StrutsPrepareAndExecuteFilter,此過濾器爲struts2的核心過濾器;
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配置文件的加載順序? html

struts.xml ——> struts.properties
常量能夠在struts.xml或struts.properties中配置,若是在多個文件中配置了同一個常量,則後一個文件中配置的常量值會覆蓋前面文件中配置的常量值.
struts.xml文件的做用:通知Struts2框架加載對應的Action資源

struts2常量的修改方式? java

常量能夠在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三個域對象? web

方案一:
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有什麼做用? spring

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

1)ActionContext是當前的Action的上下文環境,經過ActionContext能夠獲取到request、session、ServletContext等與Action有關的對象的引用;
2)ServletContext是域對象,一個web應用中只有一個ServletContext,生命週期伴隨整個web應用;
3)pageContext是JSP中的最重要的一個內置對象,能夠經過pageContext獲取其餘域對象的應用,同時它是一個域對象,做用範圍只針對當前頁面,當前頁面結束時,pageContext銷燬,
生命週期是JSP四個域對象中最小的。

result的type屬性中有哪幾種結果類型?

一共10種:
dispatcher
struts默認的結果類型,把控制權轉發給應用程序裏的某個資源不能把控制權轉發給一個外部資源,若須要把控制權重定向到一個外部資源, 應該使用
redirect結果類型
redirect 把響應重定向到另外一個資源(包括一個外部資源)
redirectAction 把響應重定向到另外一個 Action
freemarker、velocity、chain、httpheader、xslt、plainText、stream


攔截器的生命週期與工做過程?

1)每一個攔截器都是實現了Interceptor接口的 Java 類;
2)init(): 該方法將在攔截器被建立後當即被調用, 它在攔截器的生命週期內只被調用一次. 能夠在該方法中對相關資源進行必要的初始化;
3)intercept(ActionInvocation invocation): 每攔截一個動做請求, 該方法就會被調用一次;
4)destroy: 該方法將在攔截器被銷燬以前被調用, 它在攔截器的生命週期內也只被調用一次;
5)struts2中有內置了18個攔截器。

struts2如何完成文件的上傳?

一、JSP頁面: 1)JSP頁面的上傳文件的組件:<s: file name=」upload」 />,若是須要一次上傳多個文件, 就必須使用多個 file 標籤, 但它們的名字必須是相同的,即: name=「xxx」的值必須同樣; 2)必須把表單的enctype屬性設置爲:multipart/form-data; 3)表單的方法必須爲post,由於post提交的數據在消息體中,而無大小限制。 二、對應的action: 1)在 Action 中新添加 3 個和文件上傳相關的屬性; 2)若是是上傳單個文件, uploadImage屬性的類型就是 java.io.File, 它表明被上傳的文件, 第二個和第三個屬性的類型是 String, 它們分別表明上傳文 件的文件名和文件類型,定義方式是分別是: jsp頁面file組件的名稱+ContentType, jsp頁面file組件的名稱+FileName 3)若是上上傳多個文件, 可使用數組或 List struts的工做原理一、初始化,讀取struts-config.xml、web.xml等配置文件(全部配置文件的初始化)二、發送HTTP請求,客戶端發送以.do結尾的請求三、填充FormBean(實例化、復位、填充數據、校驗、保存)四、將請求轉發到Action(調用Action的execute()方法)五、處理業務(能夠調用後臺類,返回ActionForward對象)六、返回目標響應對象(從Action返回到ActionServlet)七、轉換Http請求到目標響應對象(查找響應,根據返回的Forward keyword)八、Http響應,返回到Jsp頁面用本身的話簡要闡述struts2的執行流程。Struts 2框架自己大體能夠分爲3個部分:核心控制器FilterDispatcher、業務控制器Action和用戶實現的企業業務邏輯組件。核心控制器FilterDispatcher是Struts 2框架的基礎,包含了框架內部的控制流程和處理機制。業務控制器Action和業務邏輯組件是須要用戶來本身實現的。用戶在開發Action和業務邏輯組件的同時,還須要編寫相關的配置文件,供核心控制器FilterDispatcher來使用。Struts 2的工做流程相對於Struts 1要簡單,與WebWork框架基本相同,因此說Struts 2是WebWork的升級版本。基本簡要流程以下:一、客戶端瀏覽器發出HTTP請求。二、根據web.xml配置,該請求被FilterDispatcher接收。三、根據struts.xml配置,找到須要調用的Action類和方法, 並經過IoC方式,將值注入給Aciton。四、Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。五、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面。六、返回HTTP響應到客戶端瀏覽器。它是以Webwork的設計思想爲核心,吸取struts1的優勢,能夠說 struts2是struts1和Webwork結合的產物。 struts2 的工做原理圖: 一個請求在Struts2框架中的處理分爲如下幾個步驟: 1.客戶端發出一個指向servlet容器的請求(tomcat); 2.這個請求會通過圖中的幾個過濾器,最後會到達FilterDispatcher過濾器。 3.過濾器FilterDispatcher是struts2框架的心臟,在處理用戶請求時,它和請求一塊兒相互配合訪問struts2 的底層框架結構。在web容器啓動時,struts2框架會自動加載配置文件裏相關參數,並轉換成相應的類。 如:ConfigurationManager、ActionMapper和ObjectFactory。ConfigurationManager 存有配置文件的一 些基本信息,ActionMapper存有action的配置信息。在請求過程當中全部的對象(Action,Results, Interceptors,等)都是經過ObjectFactory來建立的。過濾器會經過詢問ActionMapper類來查找請求中 須要用到的Action。 4.若是找到須要調用的Action,過濾器會把請求的處理交給ActionProxy。ActionProxy爲Action的代理對象 。ActionProxy經過ConfigurationManager詢問框架的配置文件,找到須要調用的Action類。 5.ActionProxy建立一個ActionInvocation的實例。ActionInvocation在ActionProxy層之下,它表示了 Action的執行狀態,或者說它控制的Action的執行步驟。它持有Action實例和全部的Interceptor。 6.ActionInvocation實例使用命名模式來調用,1. ActionInvocation初始化時,根據配置,加載Action相 關的全部Interceptor。2. 經過ActionInvocation.invoke方法調用Action實現時,執行Interceptor。在 調用Action的過程先後,涉及到相關攔截器(intercepetor)的調用。 7. 一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果 一般是(但不老是,也多是另外的一個Action鏈)一個須要被表示的JSP或者FreeMarker的模版。在表 示的過程當中可使用Struts2 框架中繼承的標籤。

相關文章
相關標籤/搜索