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