Struts2面试问答
Struts2是用Java開發Web應用程序的著名框架之一。 最近,我寫了很多Struts2教程 ,在這篇文章中,我列出了一些重要的Struts2面試問題以及答案,以幫助您進行面試。
什么是Struts2?
Apache Struts2是一個開放源代碼框架,可以用Java構建Web應用程序。 Struts2基于OpenSymphony WebWork框架。 它比Struts1有了很大的改進,使其更加靈活,易于使用和擴展。 Struts2的核心組件是“操作”,“攔截器”和“結果”頁面。
Struts2提供了許多方法來創建Action類并通過struts.xml或通過注釋對其進行配置。 我們可以為常見任務創建自己的攔截器。 Struts2帶有很多標簽,并使用OGNL表達式語言。 我們可以創建自己的類型轉換器來呈現結果頁面。 結果頁面可以是JSP和FreeMarker模板。
Struts1和Struts2之間有什么區別,或者Struts2比Struts1更好?
Struts2旨在克服Struts1的缺點,并使它更加靈活,可擴展。 一些明顯的區別是:
| 動作班 | Struts1動作類被強制擴展一個Abstract Class,使其無法擴展。 | Struts2動作類非常靈活,我們可以通過實現Action接口,擴展ActionSupport類或僅具有execute()方法來創建它們。 |
| 線程安全 | Struts1操作類是Singleton且不是線程安全的,因此在開發人員方面要格外小心,以免由于多線程而產生任何副作用。 | 每個請求都會實例化Struts2動作類,因此不存在多線程處理并使它們成為線程安全的。 |
| Servlet API耦合 | Struts1 API與Servlet API緊密耦合,并且Request和Response對象傳遞給操作類execute()方法。 | Struts2 API與Servlet API松散耦合,并自動將表單bean數據映射到我們最常用的動作類java bean屬性。 但是,如果需要引用Servlet API類,則可以使用* Aware接口。 |
| 測試中 | 由于Servlet API耦合,Struts1動作類很難測試。 | Struts2 Action類就像普通的Java類一樣,我們可以通過實例化它們并設置它們的屬性來輕松地對其進行測試。 |
| 請求參數映射 | Struts1要求我們創建ActionForm類來保存請求參數,并且需要在struts配置文件中對其進行配置。 | Struts2請求參數映射是動態完成的,我們需要做的是在動作類中具有Java Bean屬性,或者實現ModelDriven接口以提供用于映射的Java Bean類名稱。 |
| 標簽支持 | Struts1使用JSTL標簽,因此受到限制。 | Struts2使用OGNL并提供各種UI,控件和數據標簽。 它更加通用且易于使用。 |
| 驗證方式 | Struts1支持通過手動validate()方法進行驗證 | Struts2支持手動驗證以及驗證框架集成。 |
| 視圖渲染 | Struts1使用標準的JSP技術為JSP頁面提供bean值以供查看。 | Struts2使用ValueStack存儲請求參數和屬性,我們可以使用OGNL和Struts2標簽訪問它們。 |
| 模塊支持 | Struts1模塊設計復雜,看起來像單獨的項目 | Struts2為軟件包提供“命名空間”配置,以輕松創建模塊。 |
什么是Struts2核心組件?
Struts2的核心組件是:
Struts2中的攔截器是什么?
攔截器是Struts2框架的基礎。 Struts2攔截器負責框架完成的大多數處理,例如將請求參數傳遞給動作類,使Servlet API請求,響應,可用于動作類的會話,驗證,i18n支持等。
ActionInvocation負責封裝Action類和攔截器,并按順序觸發它們。 在ActionInvocation中使用的最重要的方法是invoke()方法,該方法跟蹤攔截器鏈并調用下一個攔截器或操作。 這是Java EE框架中“責任鏈”模式的最佳示例之一。
Struts2攔截器實現哪種設計模式?
Struts2攔截器基于攔截過濾器設計模式。 在攔截器堆棧中調用攔截器非常類似于責任鏈設計模式。
在Struts2中創建Action類的不同方式有哪些?
Struts2提供了創建動作類的不同方法。
Struts2動作和攔截器是否是線程安全的?
Struts2 Action類是線程安全的,因為會為處理該請求的每個請求實例化一個對象。
Struts2攔截器是單例類,并且創建了一個新線程來處理請求,因此它不是線程安全的,我們需要仔細實現它們,以避免共享數據出現任何問題。
Struts2中的Front Controller是哪個類?
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter是Struts2中的Front Controller類,每個請求處理都從該類開始。 早期版本的Struts2使用org.apache.struts2.dispatcher.FilterDispatcher作為Front Controller類。
Struts2中的Interceptor有什么好處?
攔截器的一些好處是:
- 攔截器在實現高級別關注點分離方面起著至關重要的作用。
- Struts2攔截器是可配置的,我們可以將其配置為所需的任何操作。
- 我們可以創建自己的自定義攔截器來執行一些常見任務,例如請求參數記錄,身份驗證等。這有助于我們在單個位置處理常見任務,從而降低了維護成本。
- 我們可以創建攔截器堆棧以用于不同的動作。
什么是ValueStack和OGNL?
ValueStack是Struts2將應用程序數據存儲在其中的存儲區域,用于處理客戶端請求。 數據存儲在使用ThreadLocal的ActionContext對象中,該對象具有特定于特定請求線程的值。
對象圖導航語言(OGNL)是一種功能強大的表達語言,用于處理存儲在ValueStack上的數據。 從體系結構圖中可以看到,攔截器和結果頁面都可以使用OGNL訪問存儲在ValueStack上的數據。
命名一些在Struts2中引入的有用注釋?
Struts2中引入的一些重要注釋是:
提供一些重要的Struts2常量?
我使用的一些Struts2常數是:
我們可以在struts.xml文件中配置上述常量,如下所示。
<constant name="struts.devMode" value="true"></constant> <constant name="struts.action.extension" value="action,do"></constant> <constant name="struts.custom.i18n.resources" value="global"></constant> <constant name="struts.convention.result.path" value="/"></constant>Struts2中的動作映射中名稱空間的用途是什么?
Struts2名稱空間配置使我們可以輕松創建模塊。 我們可以使用名稱空間根據動作類的功能來分隔它們,例如admin,user,customer等。
哪個攔截器負責將請求參數映射到動作類Java Bean屬性?
com.opensymphony.xwork2.interceptor.ParametersInterceptor攔截器負責將請求參數映射到Action類java bean屬性。 該攔截器在struts-default軟件包中配置為“ params”。 此攔截器是basicStack和defaultStack攔截器堆棧的一部分。
哪個攔截器負責i18n支持?
com.opensymphony.xwork2.interceptor.I18nInterceptor攔截器負責Struts2應用程序中的i18n支持。 該攔截器在名為“ i18n”的struts-default軟件包中配置,并且是i18nStack和defaultStack的一部分。
將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邏輯。
我們如何在動作類中獲取Servlet API請求,響應,HttpSession等對象?
Struts2操作類不提供對Servlet API組件(如請求,響應和會話)的直接訪問。 但是有時我們需要在操作類中進行這些訪問,例如檢查HTTP方法或設置cookie以響應。
因此,Struts2 API提供了一堆* Aware接口,我們可以實現這些接口來訪問這些對象。 Struts2 API使用依賴項注入將Servlet API組件注入到動作類中。 一些重要的Aware接口是SessionAware,ApplicationAware,ServletRequestAware和ServletResponseAware。
您可以在Struts2 Action Classes教程中的如何獲取Servlet API會話中了解有關它們的更多信息。
execAndWait攔截器有什么用?
Struts2為長時間運行的動作類提供了execAndWait攔截器。 我們可以使用此攔截器將中間響應頁面返回給客戶端,一旦處理完成,最終響應將返回給客戶端。 此攔截器在struts-default包中定義,實現在ExecuteAndWaitInterceptor類中提供。
查看Struts2 execAndWait攔截器示例,以了解有關此攔截器以及如何使用它的更多信息。
Struts2中的令牌攔截器有什么用?
Web應用程序的主要問題之一是雙重表單提交。 如果不小心,重復提交表單可能導致向客戶收取雙倍的費用或兩次更新數據庫值。 我們可以使用令牌攔截器來解決雙重表單提交問題。 這個攔截器是在struts-default包中定義的,但它不是任何攔截器堆棧的一部分,因此我們需要在操作類中手動添加它。
在Struts2令牌攔截器示例中了解更多信息。
我們如何將log4j集成到Struts2應用程序中?
Struts2為日志目的提供了log4j API的輕松集成,我們所需要的只是WEB-INF / classes目錄中的log4j配置文件。
您可以在Struts2 Log4j集成中簽出示例項目。
我們如何使用它們?
Struts2提供了許多自定義標簽,我們可以在結果頁中使用它們來創建客戶端請求的視圖。 這些標簽大致分為三類-數據標簽,控制標簽和UI標簽。
我們可以通過使用taglib指令在JSP頁面中添加這些標記來使用這些標記。
<%@ taglib uri="/struts-tags" prefix="s" %>一些重要的數據標簽是屬性,設置,推送,Bean,操作,包含,i18n和文本標簽。 在Struts2數據標簽中了解更多信息 。
控制標簽用于操作和導航集合中的數據。 一些重要的控制標簽是if-elseif-else,迭代器,附加,合并,排序,子集和生成器標簽。 在Struts2控制標簽中了解更多信息。
Struts2 UI標記用于生成HTML標記語言,將HTML表單數據綁定到動作類屬性,類型轉換,驗證和i18n支持。 一些重要的UI標簽是表單,文本字段,密碼,文本區域,復選框,選擇,廣播和提交標簽。 在Struts2 UI標簽上閱讀有關它們的更多信息。
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。
有關實現的詳細信息,請閱讀Struts2 OGNL示例教程 。
我們如何編寫自己的攔截器并將其映射為行動?
我們可以實現com.opensymphony.xwork2.interceptor.Interceptor接口來創建我們自己的攔截器。 攔截器類準備就緒后,我們需要在struts.xml包中定義要使用的類。 我們還可以使用我們的自定義攔截器和defaultStack攔截器創建攔截器堆棧。 之后,我們可以為要使用攔截器的操作類配置它。
使用自定義攔截器的最佳示例之一是驗證會話,請在Struts2 Interceptor Tutorial中閱讀有關會話的更多信息。
攔截器的生命周期是多少?
攔截器接口定義了三種方法-init(),destroy()和intercept()。 初始化和銷毀??是攔截器的生命周期方法。 攔截器是Singleton類,Struts2初始化一個新線程來處理每個請求。 創建攔截器實例時將調用init()方法,我們可以在此方法中初始化任何資源。 當應用程序關閉時會調用destroy()方法,我們可以在此方法中釋放任何資源。
exclude()是每次客戶端請求通過攔截器時調用的方法。
什么是攔截器堆棧?
攔截器堆棧可幫助我們將一個包裝中的多個攔截器組合在一起以備將來使用。 struts-default軟件包創建一些最常用的攔截器堆棧-basicStack和defaultStack。 我們可以在包的開頭創建自己的攔截器堆棧,然后配置操作類以使用它。
什么是struts-default軟件包,它有什么好處?
struts-default是一個抽象包,它定義了所有Struts2攔截器和常用的攔截器堆棧。 建議在配置我們的應用程序包時擴展此程序包,以避免再次配置攔截器。 通過消除在我們的應用程序中配置攔截器和結果頁面的繁瑣任務,可以幫助開發人員。
Struts2操作URI的默認后綴是什么,我們如何更改它?
Struts2操作的默認URI后綴為.action,在Struts1中的默認后綴為.do。 我們可以通過在Struts2配置文件中將struts.action.extension常量值定義為以下內容來更改此后綴:
<constant name="struts.action.extension" value="action,do"></constant>結果頁面的默認位置是什么,我們如何更改它?
默認情況下,Struts2在{WEBAPP-ROOT} / {Namespace} /目錄中查找結果頁面,但有時我們希望將結果頁面保留在另一個位置,我們可以在Struts2配置文件中提供struts.convention.result.path常量值來更改結果頁面位置。
另一種方法是在操作類中使用@ResultPath批注提供結果頁面的位置。
我們如何在Struts2應用程序中上傳文件?
文件上傳是Web應用程序中的常見任務之一。 這就是Struts2為通過FileUploadInterceptor上傳文件提供內置支持的原因。 該攔截器在struts-default程序包中進行配置,并提供選項來設置文件的最大大小和可以上傳到服務器的文件類型。
在Struts2文件上傳示例中閱讀有關FileUpload攔截器的更多信息。
開發Struts2應用程序時應遵循的最佳實踐是什么?
開發Struts2應用程序時的一些最佳實踐是:
這就是Struts2面試問答的全部內容,如果您遇到任何我遺漏的重要問題,請通過評論告知我。
翻譯自: https://www.javacodegeeks.com/2013/11/struts2-interview-questions-and-answers.html
總結
以上是生活随笔為你收集整理的Struts2面试问答的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RIP GlassFish –感谢所有的
- 下一篇: 您正在使用什么垃圾收集器?