1.
什麼是Struts2?
Apache Struts2是一個用Java建構Web應用程式的開源架構。Struts2基于OpenSymphony WebWork架構。它從Struts1中得到了很大的改進,使其更加靈活,易于使用和擴充。Struts2的核心元件是Action,Interceptors和Result頁面。
Struts2提供了許多方法來建立Action類并通過struts.xml或注釋來配置它們。我們可以為常見任務建立自己的攔截器。Struts2附帶了很多标簽,并使用OGNL表達式語言。我們可以建立自己的類型轉換器來渲染結果頁面。結果頁面可以是JSP和FreeMarker模闆。
2.
Struts2的核心元件是什麼?
Struts2的核心元件是:
動作類 攔截器 結果頁面,FreeMarker模闆的JSP ValueStack,OGNL和Tag Libraries Struts 2架構圖,struts2 ,struts2試題
3.
什麼是Struts2中的攔截器?
攔截器是Struts2 Framework的支柱。Struts2攔截器負責架構完成的大部分處理,例如将請求參數傳遞給動作類,使Servlet API請求,響應,會話可用于Action類,驗證,i18n支援等。
ActionInvocation負責封裝Action類和攔截器并按順序觸發它們。在ActionInvocation中使用的最重要的方法是invoke()方法,它跟蹤攔截器鍊并調用下一個攔截器或動作。這是Java EE架構中責任鍊模式的最佳示例之一。
4.
Struts2攔截器實作了哪種設計模式?
Struts2攔截器基于攔截濾波器設計模式。攔截器堆棧中攔截器的調用非常類似于責任鍊設計模式。
5.
在Struts2中建立Action類有哪些不同的方法?
Struts2提供了建立動作類的不同方法。
通過實作Action接口 使用Struts2 @Action注釋 通過擴充ActionSupport類 任何傳回String的execute()方法的普通java類都可以配置為Action類。
6.
Struts2動作和攔截器是否是線程安全的?
Struts2 Action類是線程安全的,因為對象是為每個處理它的請求執行個體化的。
Struts2攔截器是單例類,并且建立了一個新線程來處理請求,是以它不是線程安全的,我們需要仔細實作它們以避免共享資料的任何問題。
7.
哪個類是Struts2中的前端控制器?
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter是Struts2中的Front Controller類,每個請求處理都從這個類開始。早期版本的Struts2 org.apache.struts2.dispatcher.FilterDispatcher用作Front Controller類。
8.
Struts2中攔截器有哪些好處?
攔截器的一些好處是:
攔截器在實作高度分離關注方面起着至關重要的作用。
Struts2攔截器是可配置的,我們可以為我們想要的任何動作配置它。
我們可以建立自己的自定義攔截器來執行一些常見任務,例如請求參數記錄,身份驗證等。這有助于我們在一個位置處理常見任務,進而降低維護成本。
我們可以建立攔截器堆棧以用于不同的操作。
9.
什麼是ValueStack和OGNL?
ValueStack是Struts2存儲應用程式資料以處理用戶端請求的存儲區域。資料存儲在ActionContext使用ThreadLocal的對象中,以具有特定于特定請求線程的值。
對象圖導航語言(OGNL)是一種功能強大的表達式語言,用于處理存儲在ValueStack上的資料。正如您在架構圖中看到的,攔截器和結果頁面都可以使用OGNL通路存儲在ValueStack上的資料。
10.
列舉Struts2中引入的一些有用的注釋?
Struts2中引入的一些重要注釋是:
- @Action建立動作類
- @Actions為多個動作配置單個類
- @Namespace和@Namespaces用于建立不同的子產品
- @Result用于結果頁面
- @ResultPath用于配置結果頁面位置
11.
提供一些您使用過的重要Struts2常量?
- struts.devMode在開發模式下運作我們的應用程式。此模式會重新加載屬性檔案,并提供額外的日志記錄和調試功能。它在開發我們的應用程式時非常有用,但我們應該在将代碼轉移到生産時将其關閉。
- struts.convention.result.path用于配置結果頁面的位置。預設情況下,Struts2在{WEBAPP-ROOT} / {Namespace} /中查找結果頁面,我們可以使用此常量更改位置。
- struts.custom.i18n.resources為i18n支援定義全局資源包。
- struts.action.extension為Struts2應用程式配置URL字尾。預設字尾是.action但有時我們可能想将其更改為.do或其他内容。
我們可以在struts.xml檔案中配置上面的常量,如下所示。
12.
Struts2中動作映射中命名空間的用途是什麼?
Struts2命名空間配置允許我們輕松建立子產品。我們可以使用命名空間根據其功能分離我們的操作類,例如admin,user,customer等。
13.
哪個攔截器負責将請求參數映射到動作類Java Bean屬性?
com.opensymphony.xwork2.interceptor.ParametersInterceptor攔截器負責将請求參數映射到Action類的java bean屬性。此攔截器在struts-default包中配置,名稱為“params”。此攔截器是basicStack和defaultStack攔截器堆棧的一部分。
14.
哪個攔截器負責i18n支援?
com.opensymphony.xwork2.interceptor.I18nInterceptor攔截器負責Struts2應用程式中的i18n支援。此攔截器在struts-default包中配置,名稱為“i18n”,它是i18nStack和defaultStack的一部分。
15.
對我們的操作類使用Action接口和ActionSupport類有什麼差別,您更喜歡哪一個?
我們可以實作Action接口來建立我們的動作類。這個接口有一個我們需要實作的方法execute()。使用此接口的唯一好處是它包含一些我們可以用于結果頁面的常量,這些常量是SUCCESS,ERROR,NONE,INPUT和LOGIN。
ActionSupport類是Action接口的預設實作,它還實作了與Validation和i18n支援相關的接口。ActionSupport類實作Action,Validateable,ValidationAware,TextProvider和LocaleProvider接口。我們可以覆寫ActionSupport類的validate()方法,以在我們的操作類中包含字段級驗證登入。
根據需求,我們可以使用任何方法來建立struts 2動作類,我最喜歡的是ActionSupport類,因為它有助于在動作類中輕松編寫驗證和i18n邏輯。
16.
我們怎樣才能在動作類中獲得Servlet API請求,響應,HttpSession等對象?
Struts2操作類不提供對Servlet API元件的直接通路,例如Request,Response和Session。但是,有時我們需要在操作類中進行這些通路,例如檢查HTTP方法或設定響應中的cookie。
這就是為什麼Struts2 API提供了一堆* Aware接口,我們可以實作這些接口來通路這些對象。Struts2 API使用依賴注入在操作類中注入Servlet API元件。一些重要的Aware接口是SessionAware,ApplicationAware,ServletRequestAware和ServletResponseAware。
17.
execAndWait攔截器有什麼用?
Struts2為長時間運作的動作類提供了execAndWait攔截器。我們可以使用此攔截器将中間響應頁面傳回給用戶端,一旦處理完成,最終響應将傳回給用戶端。此攔截器在struts-default包中定義,實作在ExecuteAndWaitInterceptor類中。
18.
Struts2中令牌攔截器的用途是什麼?
Web應用程式的主要問題之一是雙表單送出。如果不注意,雙重表單送出可能會導緻向客戶收取雙倍金額或兩次更新資料庫值。我們可以使用令牌攔截器來解決雙表格送出問題。這個攔截器是在struts-default包中定義的,但它不是任何攔截器堆棧的一部分,是以我們需要在我們的動作類中手動包含它。
19.
我們如何在Struts2應用程式中內建log4j?
Struts2提供了log4j API的簡單內建以便進行日志記錄,我們需要的隻是WEB-INF / classes目錄中的log4j配置檔案。
20.
什麼是不同的Struts2标簽?我們怎樣才能使用它們?
Struts2提供了許多自定義标記,我們可以在結果頁面中使用它們來建立用戶端請求的視圖。這些标簽大緻分為三類 - 資料标簽,控制标簽和UI标簽。
我們可以通過使用taglib指令在JSP頁面中添加這些标記來使用這些标記。
一些重要的Data标簽是property,set,push,bean,action,include,i18n和text标簽。
控制标簽用于處理和導航集合中的資料。一些重要的Control标簽是if-elseif-else,iterator,append,merge,sort,subset和generator标簽。
Struts2 UI标簽用于生成HTML标記語言,将HTML表單資料綁定到動作類屬性,類型轉換,驗證和i18n支援。一些重要的UI标簽是form,textfield,password,textarea,checkbox,select,radio和submit标簽。
21.
什麼是Struts2中的自定義類型轉換器?
Struts2支援OGNL表達式語言,它在Struts 2中執行兩項重要任務 - 資料傳輸和類型轉換。
OGNL非常靈活,我們可以輕松擴充它以建立我們自己的自定義轉換器類。建立和配置自定義類型轉換器類非常簡單,第一步是修複自定義類的輸入格式。第二步是實作轉換器類。類型轉換器類應該實作com.opensymphony.xwork2.conversion.TypeConverter接口。由于在Web應用程式中,我們總是以String的形式擷取請求并以String的形式發送響應,Struts 2 API提供了TypeConverter接口的預設實作,即StrutsTypeConverter。StrutsTypeConverter包含兩個抽象方法 - convertFromString将String轉換為Object,convertToString将Object轉換為String。
22.
我們如何編寫自己的攔截器并将其映射為動作?
我們可以實作com.opensymphony.xwork2.interceptor.Interceptor接口來建立自己的攔截器。一旦攔截器類準備就緒,我們需要在我們想要使用它的struts.xml包中定義它。我們還可以使用自定義攔截器和defaultStack攔截器建立攔截器堆棧。之後我們可以為我們想要使用攔截器的動作類配置它。
23.
什麼是攔截器的生命周期?
攔截器接口定義了三個方法 - init(),destroy()和intercept()。init和destroy是攔截器的生命周期方法。攔截器是Singleton類,Struts2初始化一個新線程來處理每個請求。建立攔截器執行個體時調用init()方法,我們可以初始化此方法中的任何資源。應用程式關閉時調用destroy()方法,我們可以釋放此方法中的任何資源。
intercept()是每次用戶端請求通過攔截器時調用的方法。
24.
什麼是攔截器堆棧?
攔截器堆棧可幫助我們将多個攔截器組合在一起以供進一步使用。struts-default包建立了一些最常用的攔截器堆棧--basicStack和defaultStack。我們可以在包的開頭建立我們自己的攔截器堆棧,然後配置我們的動作類來使用它。
25.
什麼是struts-default包,它有什麼好處?
struts-default是一個抽象包,它定義了所有Struts2攔截器和常用的攔截器堆棧。建議在配置應用程式包時擴充此程式包,以避免再次配置攔截器。這是為了幫助開發人員消除在我們的應用程式中配置攔截器和結果頁面的繁瑣任務。
26.
Struts2操作URI的預設字尾是什麼?我們如何更改它?
Struts2操作的預設URI字尾是.action,在Struts1中,預設字尾為.do。我們可以通過在Struts2配置檔案中定義struts.action.extension常量值來更改此字尾:
27.
結果頁面的預設位置是什麼?我們如何更改它?
預設情況下,Struts2在{WEBAPP-ROOT} / {Namespace} /目錄中查找結果頁面,但有時我們希望将結果頁面儲存在另一個位置,我們可以在Struts2配置檔案中提供struts.convention.result.path常量值來更改結果頁面位置。
另一種方法是在操作類中使用@ResultPath批注來提供結果頁面位置。
28.
我們如何在Struts2應用程式中上傳檔案?
檔案上載是Web應用程式中的常見任務之一。這就是為什麼Struts2通過FileUploadInterceptor提供對檔案上傳的内置支援。此攔截器在struts-default包中配置,并提供選項以設定檔案的最大大小和可以上載到伺服器的檔案類型。
29.
開發Struts2應用程式時要遵循哪些最佳實踐?
開發Struts2應用程式時的一些最佳實踐是:
- 在建立程式包時始終嘗試擴充struts-default程式包,以避免在配置攔截器時出現代碼備援。
- 對于整個應用程式中的常見任務,例如記錄請求參數,請嘗試使用攔截器。
- 始終将動作類java bean屬性儲存在單獨的bean中以便重用代碼并實作ModelDriven接口。
- 如果您有将在多個操作中使用的自定義攔截器,請為此建立攔截器堆棧,然後使用它。
- 嘗試使用基于功能區域的命名空間配置在不同子產品中劃分應用程式。
- 嘗試在結果頁面中使用Struts2标記進行代碼說明,如果需要,可以建立自己的類型轉換器。
- 使用開發模式可以加快開發速度,但請確定生産代碼不以dev模式運作。
- 使用Struts2 i18n支援資源包并支援本地化。
- Struts2提供了許多可以擁有資源包的地方,但是嘗試保留一個全局資源包,一個用于動作類以避免混淆。
- struts-default包配置所有攔截器并建立不同的攔截器堆棧。嘗試僅使用所需的内容,例如,如果您沒有本地化要求,則可以避免使用i18n攔截器。
30.
如何處理Struts2中應用程式抛出的異常?
Struts2為異常處理提供了一個非常強大的架構。我們可以在包中指定全局結果,然後将特定的例外映射到這些結果頁面。異常映射可以在全局包級别和操作級别完成。
當發生一些未由應用程式處理的意外異常時,讓異常結果頁面向使用者提供一些資訊是個好主意。struts.xml檔案中的示例配置如下所示。
/exception.jsp/runtime_exception.jsp/error.jsp/error.jsp
最後,我自己是一名從事了多年開發的Java老程式員,辭職目前在做自己的Java私人定制課程,今年年初我花了一個月整理了一份最适合2019年學習的Java學習幹貨,可以送給每一位喜歡Java的小夥伴,想要擷取的可以關注我的頭條号并在背景私信我:01,即可免費擷取。