Struts2相關(guān)的面試題整理分享
前言
眾所周知,Struts2是個(gè)非常優(yōu)秀的開(kāi)源框架,我們能用Struts2框架進(jìn)行開(kāi)發(fā),同時(shí)能快速搭建好一個(gè)Struts2框架,但我們是否能把Struts2框架的工作原理用語(yǔ)言表達(dá)清楚,你表達(dá)的原理不需要說(shuō)出底層是怎么實(shí)現(xiàn)的,我估計(jì)大多數(shù)的人也聽(tīng)不懂。當(dāng)面試官問(wèn)到我們Struts2的工作原理時(shí),我們?cè)撛趺椿卮疬@個(gè)問(wèn)題呢?回答什么才能讓自己說(shuō)的與眾不同,先看看其他朋友總結(jié)的
一、工作原理
在Struts2框架中的處理大概分為以下幾個(gè)步驟
1 客戶端初始化一個(gè)指向Servlet容器(例如Tomcat)的請(qǐng)求
2 這個(gè)請(qǐng)求經(jīng)過(guò)一系列的過(guò)濾器(Filter)(這些過(guò)濾器中有一個(gè)叫做ActionContextCleanUp的可選過(guò)濾器,這個(gè)過(guò)濾器對(duì)于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin)
3 接著FilterDispatcher被調(diào)用,F(xiàn)ilterDispatcher詢問(wèn)ActionMapper來(lái)決定這個(gè)請(qǐng)是否需要調(diào)用某個(gè)Action
4 如果ActionMapper決定需要調(diào)用某個(gè)Action,F(xiàn)ilterDispatcher把請(qǐng)求的處理交給ActionProxy
5 ActionProxy通過(guò)Configuration Manager詢問(wèn)框架的配置文件,找到需要調(diào)用的Action類
6 ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例。
7 ActionInvocation實(shí)例使用命名模式來(lái)調(diào)用,在調(diào)用Action的過(guò)程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。
8 一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。返回結(jié)果通常是(但不總是,也可 能是另外的一個(gè)Action鏈)一個(gè)需要被表示的JSP或者FreeMarker的模版。在表示的過(guò)程中可以使用Struts2 框架中繼承的標(biāo)簽。在這個(gè)過(guò)程中需要涉及到ActionMapper
二 工作流程
1、客戶端瀏覽器發(fā)出HTTP請(qǐng)求.
2、根據(jù)web.xml配置,該請(qǐng)求被FilterDispatcher接收
3、根據(jù)struts.xml配置,找到需要調(diào)用的Action類和方法, 并通過(guò)IoC方式,將值注入給Aciton
4、Action調(diào)用業(yè)務(wù)邏輯組件處理業(yè)務(wù)邏輯,這一步包含表單驗(yàn)證。
5、Action執(zhí)行完畢,根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果result,并跳轉(zhuǎn)到相應(yīng)頁(yè)面
6、返回HTTP響應(yīng)到客戶端瀏覽器
三、攔截器和過(guò)濾器的區(qū)別
1、攔截器是基于java反射機(jī)制的,而過(guò)濾器是基于函數(shù)回調(diào)的。
2、過(guò)濾器依賴于servlet容器,而攔截器不依賴于servlet容器。
3、攔截器只能對(duì)Action請(qǐng)求起作用,而過(guò)濾器則可以對(duì)幾乎所有請(qǐng)求起作用。
4、攔截器可以訪問(wèn)Action上下文、值棧里的對(duì)象,而過(guò)濾器不能。
5、在Action的生命周期中,攔截器可以多次調(diào)用,而過(guò)濾器只能在容器初始化時(shí)被調(diào)用一次。
四、什么要使用Struts2
Struts2 是一個(gè)相當(dāng)強(qiáng)大的Java Web開(kāi)源框架,是一個(gè)基于POJO的Action的MVC Web框架。它基于當(dāng)年的Webwork和XWork框架,繼承其優(yōu)點(diǎn),同時(shí)做了相當(dāng)?shù)母倪M(jìn)。
1、Struts2基于MVC架構(gòu),框架結(jié)構(gòu)清晰,開(kāi)發(fā)流程一目了然,開(kāi)發(fā)人員可以很好的掌控開(kāi)發(fā)的過(guò)程。
2、使用OGNL進(jìn)行參數(shù)傳遞。
OGNL提供了在Struts2里訪問(wèn)各種作用域中的數(shù)據(jù)的簡(jiǎn)單方式,你可以方便的獲取Request,Attribute,Application,Session,Parameters中的數(shù)據(jù)。大大簡(jiǎn)化了開(kāi)發(fā)人員在獲取這些數(shù)據(jù)時(shí)的代碼量。
3、強(qiáng)大的攔截器
Struts2 的攔截器是一個(gè)Action級(jí)別的AOP,Struts2中的許多特性都是通過(guò)攔截器來(lái)實(shí)現(xiàn)的,例如異常處理,文件上傳,驗(yàn)證等。攔截器是可配置與重用的,可以將一些通用的功能如:登錄驗(yàn)證,權(quán)限驗(yàn)證等置于攔截器中以完成一些Java Web項(xiàng)目中比較通用的功能。在我實(shí)現(xiàn)的的一Web項(xiàng)目中,就是使用Struts2的攔截器來(lái)完成了系統(tǒng)中的權(quán)限驗(yàn)證功能。
4、易于測(cè)試
Struts2的Action都是簡(jiǎn)單的POJO,這樣可以方便的對(duì)Struts2的Action編寫測(cè)試用例,大大方便了5Java Web項(xiàng)目的測(cè)試。
易于擴(kuò)展的插件機(jī)制在Struts2添加擴(kuò)展是一件愉快而輕松的事情,只需要將所需要的Jar包放到WEB-INF/lib文件夾中,在struts.xml中作一些簡(jiǎn)單的設(shè)置就可以實(shí)現(xiàn)擴(kuò)展。
6、模塊化管理
Struts2已經(jīng)把模塊化作為了體系架構(gòu)中的基本思想,可以通過(guò)三種方法來(lái)將應(yīng)用程序模塊化:將配置信息拆分成多個(gè)文件把自包含的應(yīng)用模塊創(chuàng)建為插件創(chuàng)建新的框架特性,即將與特定應(yīng)用無(wú)關(guān)的新功能組織成插件,以添加到多個(gè)應(yīng)用中去。
7、全局結(jié)果與聲明式異常
為應(yīng)用程序添加全局的Result,和在配置文件中對(duì)異常進(jìn)行處理,這樣當(dāng)處理過(guò)程中出現(xiàn)指定異常時(shí),可以跳轉(zhuǎn)到特定頁(yè)面。
他的如此之多的優(yōu)點(diǎn),是很多人比較的青睞,與spring ,Hibernate進(jìn)行結(jié)合,組成了現(xiàn)在比較流行的ssh框架,當(dāng)然每個(gè)公司都要自己的框架,也是ssh變異的產(chǎn)品。
五、看到網(wǎng)友的對(duì)Struts2的原理總結(jié),我自己也總結(jié)以便后續(xù)的面試,以下是我的疑問(wèn)
1、客服端發(fā)起一個(gè)請(qǐng)求,通過(guò)HTTP協(xié)議指向Tomcat容器,tomcat拿到請(qǐng)求她干了什么?
2、我們web.xml配置
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
我們從web配置文件中可以看到org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter,這個(gè)Filter這個(gè)類有什么用?
這個(gè) /* 是攔截所有的請(qǐng)求,他攔截了請(qǐng)求做了什么處理? <url-pattern>/*</url-pattern>
3、我們struts.xml配置
<struts> <package name="default" namespace="/" extends="struts-default"> <action name="hello"> <result> /Hello.jsp </result> </action> </package> </struts>
誰(shuí)負(fù)責(zé)根據(jù)struts.xml配置,找到需要調(diào)用的Action類和方法呢?
4、最后根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果result,在返回HTTP響應(yīng)到客戶端瀏覽器
struts2的工作原理
- 客戶端發(fā)送請(qǐng)求
- 經(jīng)過(guò)一系列的過(guò)濾器
- FilterDispatcher通過(guò)ActionMapper來(lái)決定這個(gè)REquest需要調(diào)用的Action
- FilterDispather交給ActionProxy
- 通過(guò)ConfigurationManager詢問(wèn)struts.xml找到對(duì)應(yīng)的Action
- ActionProxy創(chuàng)建一個(gè)ActionInvocation實(shí)例
- 調(diào)用Action Action執(zhí)行完畢ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果
Struts攔截器,常用的攔截器
- Struts2的攔截器是其核心部分,它提供了一種機(jī)制,可以定義一個(gè)特殊的模塊,對(duì)請(qǐng)求進(jìn)行封裝和處理,這個(gè)模塊在Action執(zhí)行前后都可以進(jìn)行
- modelDriven(模型驅(qū)動(dòng)) servletConfig(獲取ServletApo) params(動(dòng)態(tài)參數(shù)注入) validation(輸入驗(yàn)證 聲明式驗(yàn)證)
struts2的優(yōu)點(diǎn)
- 實(shí)現(xiàn)了mvc模式 層次結(jié)構(gòu)清晰,
- 豐富的標(biāo)簽庫(kù),提高了開(kāi)發(fā)效率
- 提供了豐富的攔截器實(shí)現(xiàn)
- 方便異常處理
- 通過(guò)配置文件可以掌握系統(tǒng)各個(gè)部分之間的關(guān)系
struts2核心控制器
- FilterDispatcher
- 它負(fù)責(zé)攔截所有的用戶請(qǐng)求,當(dāng) 用戶請(qǐng)求到達(dá)時(shí),該Filter會(huì)過(guò)濾用戶請(qǐng)求。如果用戶請(qǐng)求以action結(jié)尾,該請(qǐng)求將被轉(zhuǎn)入Struts 2框架處理。
struts2配置文件覆蓋順序
- struts.xml -> struts.properties -> web.xml(配置過(guò)濾器時(shí),指定參數(shù)。程序員可以編寫)
struts2修改常量的方式
- struts.xml :
<constant name="struts.action.extension" value="do"/> - struts.properties :
struts.action.extension=do
Action
- Action為多例的,所以在Spring中Scope要設(shè)置參數(shù)
- 通配符 動(dòng)態(tài)調(diào)用
Action實(shí)現(xiàn)的三種方式
- 單純的POJO
- 實(shí)現(xiàn)Action接口 (提供了格式化的返回參數(shù))
- 繼承ActionSupport(實(shí)現(xiàn)了Action接口并且其中還做了一些國(guó)際化和驗(yàn)證的功能)
訪問(wèn)ServletAPI
- ServletActionContext
- 實(shí)現(xiàn)接口 ServletRequestAware,ServletResponseAware ,ServletContextAware 攔截器負(fù)責(zé)注入(ServletConfig)
結(jié)果視圖
- chain(轉(zhuǎn)發(fā)到動(dòng)作,要是不在同一個(gè)包內(nèi)需要設(shè)置 name) dispatcher(默認(rèn)) redierct (請(qǐng)求重定向) stream(文件上傳和下載)
默認(rèn)的struts-default有什么作用
- struts-default包是由struts內(nèi)置的,它定義了struts2內(nèi)部的眾多攔截器和Result類型,而Struts2很多核心的功能都是通過(guò)這些內(nèi)置的攔截器實(shí)現(xiàn),當(dāng)包繼承了struts-default包才能使用struts2為我們提供的這些功能。
- 通常每個(gè)包都應(yīng)該繼承struts-default包。
struts2如何對(duì)指定的方法進(jìn)行驗(yàn)證
- 驗(yàn)證功能是由validation攔截器來(lái)負(fù)責(zé)處理的?;仫@錯(cuò)誤信息是由workflow攔截器來(lái)負(fù)責(zé)處理的。
- 驗(yàn)證失敗以后錯(cuò)誤信息回顯需要設(shè)置 <result name="input">/regist.jsp</result> 結(jié)果視圖
- 對(duì)類中所有方法進(jìn)行驗(yàn)證,復(fù)寫validate()方法,當(dāng)出錯(cuò)的時(shí)候addFieldError("name", "請(qǐng)輸入用戶名");
- 對(duì)指定方法:將validate()方法改寫成為public void validateDemo1 后面是指定方法的名字(驗(yàn)證Demo1方法)
值棧
- ValueStack的生命周期為Action的生命周期,保存在request域中,
- 每個(gè)action都有與之對(duì)應(yīng)的值棧,action對(duì)象默認(rèn)保存在棧頂
- 使用OGNL訪問(wèn)值棧中的內(nèi)容不需要添加# 而訪問(wèn)其他域中的需要添加#
ActionContext、ServletContext、pageContext的區(qū)別?
- ActionContext是當(dāng)前Action的上下文環(huán)境,通過(guò)ActionContext可以獲取到request、session、ServletContext等與Action有關(guān)的對(duì)象的引用
- ServletContext是域?qū)ο?,一個(gè)web應(yīng)用中只有一個(gè)ServletContext,生命周期伴隨整個(gè)web應(yīng)用;
- pageContext是JSP中的最重要的一個(gè)內(nèi)置對(duì)象,可以通過(guò)pageContext獲取其他域?qū)ο蟮膽?yīng)用,同時(shí)它是一個(gè)域?qū)ο?作用范圍只針對(duì)當(dāng)前頁(yè)面
攔截器
- 每個(gè)攔截器都是實(shí)現(xiàn)了Interceptor接口的java類
- Init() 在這個(gè)攔截器初始化的時(shí)候被調(diào)用
- intercept() 當(dāng)攔截器起作用的時(shí)候調(diào)用
- destroy() 在攔截器被銷毀的時(shí)候調(diào)用
- struts2默認(rèn)有18個(gè)攔截器
自定義攔截器
- 編寫一個(gè)類繼承 MethodFilterInterceptor
- struts2.xml中聲明攔截器
- struts2.xml中聲配置攔截器 , 當(dāng)指定自定義攔截器時(shí)默認(rèn)攔截器會(huì)失效,所以還要顯示的在指定一次.
文件上傳
- file域 form表單
enctype=multipart/form-data提交方式為post - action接受文件對(duì)象為表單中的name, 文件類型為name+ContentType 文件名字為:jsp頁(yè)面file組件的名稱+FileName
- 可以用數(shù)組來(lái)接收多個(gè)文件的上傳
我覺(jué)的要說(shuō)清楚Struts原理,不光死記硬背資料上的寫的原理,還要帶著這些問(wèn)題去做總結(jié)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- Struts2攔截器Interceptor的原理與配置實(shí)例詳解
- struts2框架的登錄制作圖文教程
- Struts2實(shí)現(xiàn)對(duì)action請(qǐng)求對(duì)象的攔截操作方法
- struts2的國(guó)際化實(shí)現(xiàn)網(wǎng)站整體中英文切換實(shí)例代碼
- Struts2 的國(guó)際化實(shí)現(xiàn)方式示例
- 基于struts2和hibernate實(shí)現(xiàn)登錄和注冊(cè)功能
- struts2中使用注解配置Action方法詳解
- struts2 validation.xml 驗(yàn)證規(guī)則代碼解析
相關(guān)文章
一文詳解Spring的Enablexxx注解使用實(shí)例
這篇文章主要為大家介紹了一文詳解Spring的Enablexxx注解使用實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(41)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07
解決MyBatis中模糊搜索使用like匹配帶%字符時(shí)失效問(wèn)題
Mybatis是我們?nèi)粘m?xiàng)目中經(jīng)常使用的框架,在項(xiàng)目中我們一般會(huì)使用like查詢作為模糊匹配字符進(jìn)行搜索匹配,下面的Mapper.xml是我們使用like在項(xiàng)目中進(jìn)行模糊匹配的常用方式,感興趣的朋友跟隨小編一起看看吧2021-09-09
SpringBoot整合TKMyBatis實(shí)現(xiàn)單表增刪改查操作
據(jù)說(shuō)tk.mybatis能夠讓我不寫sql代碼就可以所有單表操作問(wèn)題,作為熱愛(ài)偷懶的我,怎么能放過(guò)這種機(jī)會(huì)。talk is cheap, show me the code。趕緊搞個(gè)例子爽一把先2023-01-01
java實(shí)現(xiàn)簡(jiǎn)單五子棋小游戲(1)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單五子棋小游戲的第一部分,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
MyBatis全局映射文件實(shí)現(xiàn)原理解析
這篇文章主要介紹了MyBatis全局映射文件實(shí)現(xiàn)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
spring自定義一個(gè)簡(jiǎn)單的Starter啟動(dòng)器
這篇文章主要介紹了spring自定義一個(gè)簡(jiǎn)單的Starter啟動(dòng)器,一個(gè) starter其實(shí)就是對(duì)一個(gè)功能的集成封裝,然后對(duì)外提供一個(gè)依賴,讓業(yè)務(wù)去使用,像我們熟悉的 Redis,mongo,mybatis 等均屬于,需要的朋友可以參考下2023-07-07
關(guān)于spring data jpa一級(jí)緩存的問(wèn)題
這篇文章主要介紹了關(guān)于spring data jpa一級(jí)緩存的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11

