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的後綴,如:
<struts><constant name="struts.action.extension" value="do"/></struts>
如果用戶需要指定多個請求後綴,則多個後綴之間以英文逗號(,)隔開。如:
<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文件中配置常量
<struts>
<constant name="struts.action.extension" value="do"/>
</struts>
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的工作流程?
用戶請求
——> StrutsPrepareAndExecuteFilter
——> Interceptor
——> Action
——> Result
——> Jsp/html
——> 響應
struts2的action的URL訪問路徑由什麼構成?
由兩部分組成:包的命名空間+action的名稱 [ + action的後綴 ],即:package.namespace + action.name
在struts.xml中可以不爲action指定class屬性嗎?struts2中有哪些默認的屬性?
可以,如果沒有爲action指定class,默認是com.opensymphony.xwork2.ActionSupport
默認屬性:
如果沒有爲action指定class ActionSupport
如果沒有爲action指定method execute() 注意:ActionSupport的execute方法裏面就一句話return "success";
如果沒有指定result的name success
如果沒有指定result的type dispatcher
action中默認都有一個攔截器的引用,即:<interceptor-ref name="defaultStack">;
注意:
1)一旦我們爲該包中的某個action顯式指定了某個攔截器,則默認攔截器不會起作用,所以此時要顯式的引進默認的攔截器;
2)每個包只能指定一個默認攔截器,每個默認攔截器只針對當前包下有效。
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如何完成文件的上傳?
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
struts2的攔截器與攔截器棧有什麼區別:
1)Struts2 攔截器在訪問某個 Action 方法之前或之後實施攔截, Struts2 攔截器是可插拔的。
2)攔截器棧(Interceptor Stack): 將攔截器按一定的順序聯結成一條鏈,在訪問被攔截的方法時, Struts2攔截器鏈中的攔截器就會按其之前定義的順序被依次
調用,類似於Filter在web.xml文件中的配置順序調用。
攔截器的生命週期與工作過程?
1)每個攔截器都是實現了Interceptor接口的 Java 類;
2)init(): 該方法將在攔截器被創建後立即被調用, 它在攔截器的生命週期內只被調用一次. 可以在該方法中對相關資源進行必要的初始化;
3)intercept(ActionInvocation invocation): 每攔截一個動作請求, 該方法就會被調用一次;
4)destroy: 該方法將在攔截器被銷燬之前被調用, 它在攔截器的生命週期內也只被調用一次;
5)struts2中有內置了18個攔截器。
攔截器的作用?攔截器與過濾器的區別?
1)攔截器是對調用的Action起作用,它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的代碼。攔截器只能攔截Action,說明白點攔截器其實是Action
的功能塊,只在Action前後執行。攔截器可以抽象出一部分代碼可以用來完善原來的action。同時可以減輕代碼冗餘,提高重用率。
2)過濾器是攔截用戶請求的,範圍明顯比攔截器大的多。
請你寫出struts2中至少5個的默認攔截器?
fileUpload 提供文件上傳功能
i18n 記錄用戶選擇的locale
cookies 使用配置的name,value來是指cookies
checkbox 添加了checkbox自動處理代碼,將沒有選中的checkbox的內容設定爲false,而html默認情況下不提交沒有選中的checkbox。
chain 讓前一個Action的屬性可以被後一個Action訪問,現在和chain類型的result()結合使用。
alias 在不同請求之間將請求參數在不同名字件轉換,請求內容不變
result的type屬性中有哪幾種結果類型?
一共10種:
dispatcher struts默認的結果類型,把控制權轉發給應用程序裏的某個資源不能把控制權轉發給一個外部資源,若需要把控制權重定向到一個外部資源, 應該使用
redirect結果類型
redirect 把響應重定向到另一個資源(包括一個外部資源)
redirectAction 把響應重定向到另一個 Action
freemarker、velocity、chain、httpheader、xslt、plainText、stream
struts2如何完成從html表單到action的類型轉換?
1)在 struts2 中, 把請求參數映射到 action 屬性的工作由 Params攔截器負責, 它是默認的 defaultStack 攔截器中的一員. Params攔截器可以自動完成字符串
和基本數據類型之間轉換.
2)對於引用類型的數據(除String、Collection)轉換,需要自定義類型轉換器;
3)自定義類型轉化器必須實現TypeConverter 接口或對這個接口的某種具體實現做擴展,如:StrutsTypeConverter,重寫convertToString和convertFromString方法;
4)兩種自定義類型的轉換器:
>> 局部:
創建一個屬性文件: ActionClassName-conversion.properties, 該文件需和相對應的動作類(Action)放在同一個目錄下, ActionClassName是Action的類名,
後面的-conversion.properties 是固定寫法。在properties文件中的內容爲: 屬性名稱=類型轉換器的全類名
>> 全局:
在 WEB-INF/classes/ 目錄下創建 xwork-conversion.properties 文件. 在properties文件中的內容爲: 待轉換的類型=類型轉換器的全類名
注意:對於轉換的是屬性,只需要寫屬性名,如果是對應的是類型,則需要寫全類名
值棧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四個域對象中最小的。
struts2如何防止用戶表單重複提交?
第一步:在表單中加入<s:token />
第二步,使用token欄截器,定義invalid.token結果集