更新時(shí)間:2020-10-14 17:14:11 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1720次
Struts2用于接受頁(yè)面信息然后通過(guò)內(nèi)部處理,將結(jié)果返回,是一個(gè)基于MVC設(shè)計(jì)模式的Web應(yīng)用框架,它本質(zhì)上相當(dāng)于一個(gè)servlet。在java程序員的面試中,會(huì)有很大的概率出現(xiàn),因此struts2面試題是大家在參加java面試前需要學(xué)習(xí)的內(nèi)容,這篇文章盤點(diǎn)了常考的基礎(chǔ)struts2面試題,一起來(lái)學(xué)習(xí)吧!

1、Struts2與Struts1的聯(lián)系與區(qū)別,為什么要用Struts2?
答:二者之間的聯(lián)系:struts1與struts2都是mvc框架的經(jīng)典實(shí)現(xiàn)模式。
Struts2不是從Struts1升級(jí)而來(lái),而是有WebWork改名而來(lái),而WebWork只是Xwork加了很多WEB攔截器而已。
區(qū)別:(1)核心控制器改成了過(guò)濾器(過(guò)濾器比Servlet的級(jí)別要高,因?yàn)槌绦蜻\(yùn)行時(shí)是先進(jìn)入過(guò)濾器再進(jìn)入Servlet);(2)struts1要求業(yè)務(wù)類必須繼承Action或dispatchAction,struts2不強(qiáng)制這么做,只需要提供一個(gè)pojo類;(3)管理Action時(shí)struts1是單例模式,struts2是每個(gè)請(qǐng)求產(chǎn)生一個(gè)實(shí)例;(4)在表達(dá)式的支持上struts2不僅有jstl,還有功能更加強(qiáng)大的ognl表達(dá)式;(5)struts2支持多種視圖類型,如:jsp,freemaker,velocity,源代碼等。
2、Struts2的核心是什么?體現(xiàn)了什么思想?
答:Struts2的核心是攔截器,基本上核心功能都是由攔截器完成,攔截器的實(shí)現(xiàn)體現(xiàn)了AOP(面向切面編程)思想。
3、Struts2是怎樣進(jìn)行值封裝的?
答:struts2的值封裝實(shí)際上是采用了ognl表達(dá)式。struts2的攔截器經(jīng)過(guò)模型驅(qū)動(dòng)時(shí)會(huì)先判斷action是否實(shí)現(xiàn)了ModelDriven,如果是則拿到模型的實(shí)例放在了棧的頂部,到屬性驅(qū)動(dòng)的時(shí)候會(huì)從棧里面把棧頂?shù)膶?shí)例給取出來(lái),從頁(yè)面?zhèn)鬟M(jìn)來(lái)的值放在一個(gè)map集合當(dāng)中,通過(guò)map集合進(jìn)行迭代會(huì)通過(guò)ognl技術(shù)把值封裝到實(shí)例中。
4、談?wù)凷truts2 的國(guó)際化?
答:在struts2中是使用了攔截器來(lái)實(shí)現(xiàn)國(guó)際化。struts2的國(guó)際化分為三部分:(1)Action范圍,這種范圍是用Action的實(shí)現(xiàn)類的類名來(lái)作為前綴__語(yǔ)言名稱_國(guó)家地區(qū)名(大寫).properties;(2)包范圍,包范圍是用package作為前綴__語(yǔ)言名稱_國(guó)家地區(qū)名(大寫).properties;(3)全局范圍,全局范圍的前綴默認(rèn)的是application,可以通過(guò)xml配置文件配置常量(使用constant標(biāo)簽注冊(cè)i18l攔截器)來(lái)指定前綴,前綴__語(yǔ)言名稱_國(guó)家地區(qū)名(大寫).properties。
國(guó)際化實(shí)現(xiàn)的原理:通過(guò)i18n攔截器獲得請(qǐng)求參數(shù)request——locale的值(zh或者是en)并把當(dāng)前的值轉(zhuǎn)化為locale對(duì)象,把locale對(duì)象存在ww_trans_i18n_locale的session作用域中,根據(jù)struts2的請(qǐng)求處理流程,攔截器只會(huì)在進(jìn)入action的時(shí)候才會(huì)調(diào)用,所有我們一般把對(duì)jsp的訪問(wèn)轉(zhuǎn)化為對(duì)action的訪問(wèn)。
5、Strust2如何訪問(wèn)Servlet API?
答:(1)通過(guò)ActionContext可以獲得request,application,session三個(gè)作用域(struts2實(shí)際上是通過(guò)適配器來(lái)把servlet的api轉(zhuǎn)換為一個(gè)map,
并把這些map放在ActionContext里面);(2)通過(guò)ActionContext的子類ServletActionContext去獲取原滋原味的API;(3)可以通過(guò)實(shí)現(xiàn)ServletRequestAware接口,重寫里面的setServletRequest方法可以獲得request,實(shí)際上是通過(guò)set的依賴注入。
6、什么是Struts2中的攔截器?
答:攔截器是Struts2 Framework的支柱。Struts2攔截器負(fù)責(zé)框架完成的大部分處理,例如將請(qǐng)求參數(shù)傳遞給動(dòng)作類,使Servlet API請(qǐng)求,響應(yīng),會(huì)話可用于Action類,驗(yàn)證,i18n支持等。
ActionInvocation負(fù)責(zé)封裝Action類和攔截器并按順序觸發(fā)它們。在ActionInvocation中使用的最重要的方法是invoke()方法,它跟蹤攔截器鏈并調(diào)用下一個(gè)攔截器或動(dòng)作。這是Java EE框架中責(zé)任鏈模式的最佳示例之一。
7、列舉Struts2中引入的一些有用的注釋?
答:Struts2中引入的一些重要注釋是:
@Action創(chuàng)建動(dòng)作類
@Actions為多個(gè)動(dòng)作配置單個(gè)類
@Namespace和@Namespaces用于創(chuàng)建不同的模塊
@Result用于結(jié)果頁(yè)面
@ResultPath用于配置結(jié)果頁(yè)面位置
8、怎樣能在動(dòng)作類中獲得Servlet API請(qǐng)求,響應(yīng),HttpSession等對(duì)象?
答:Struts2操作類不提供對(duì)Servlet API組件的直接訪問(wèn),例如Request,Response和Session。但是,有時(shí)我們需要在操作類中進(jìn)行這些訪問(wèn),例如檢查HTTP方法或設(shè)置響應(yīng)中的cookie。
這就是為什么Struts2 API提供了一堆* Aware接口,我們可以實(shí)現(xiàn)這些接口來(lái)訪問(wèn)這些對(duì)象。Struts2 API使用依賴注入在操作類中注入Servlet API組件。一些重要的Aware接口是SessionAware,ApplicationAware,ServletRequestAware和ServletResponseAware。
9、Struts2中令牌攔截器的用途是什么?
答:Web應(yīng)用程序的主要問(wèn)題之一是雙表單提交。如果不注意,雙重表單提交可能會(huì)導(dǎo)致向客戶收取雙倍金額或兩次更新數(shù)據(jù)庫(kù)值。我們可以使用令牌攔截器來(lái)解決雙表格提交問(wèn)題。這個(gè)攔截器是在struts-default包中定義的,但它不是任何攔截器堆棧的一部分,所以我們需要在我們的動(dòng)作類中手動(dòng)包含它。
10、開發(fā)Struts2應(yīng)用程序時(shí)要遵循哪些最佳實(shí)踐?
答:開發(fā)Struts2應(yīng)用程序時(shí)的一些最佳實(shí)踐是:
(1)在創(chuàng)建程序包時(shí)始終嘗試擴(kuò)展struts-default程序包,以避免在配置攔截器時(shí)出現(xiàn)代碼冗余;
(2)對(duì)于整個(gè)應(yīng)用程序中的常見任務(wù),例如記錄請(qǐng)求參數(shù),請(qǐng)嘗試使用攔截器;
(3)始終將動(dòng)作類java bean屬性保存在單獨(dú)的bean中以便重用代碼并實(shí)現(xiàn)ModelDriven接口;
(4)嘗試使用基于功能區(qū)域的命名空間配置在不同模塊中劃分應(yīng)用程序;
(5)嘗試在結(jié)果頁(yè)面中使用Struts2標(biāo)記進(jìn)行代碼說(shuō)明,如果需要,可以創(chuàng)建自己的類型轉(zhuǎn)換器;
(6)使用開發(fā)模式可以加快開發(fā)速度,但請(qǐng)確保生產(chǎn)代碼不以dev模式運(yùn)行;
(7)Struts2提供了許多可以擁有資源包的地方,但是嘗試保留一個(gè)全局資源包,一個(gè)用于動(dòng)作類以避免混淆;
(8)Struts2提供了許多可以擁有資源包的地方,但是嘗試保留一個(gè)全局資源包,一個(gè)用于動(dòng)作類以避免混淆。
上面就是對(duì)struts2面試題的整理,并相應(yīng)的附上了總結(jié)好的答案。Struts2是一種重量級(jí)的框架,是位于MVC架構(gòu)中的controller,是java程序員需要掌握的技能。希望大家可以通過(guò)這10道struts2面試題來(lái)對(duì)自己進(jìn)行一下檢驗(yàn),更多的面試題請(qǐng)到java面試題欄目查看,遇到不會(huì)或者模糊的知識(shí)點(diǎn)及時(shí)的通過(guò)看java視頻教程或者專業(yè)書的方式來(lái)查漏補(bǔ)缺。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)