前言
眾所周知,Struts2是個非常優秀的開源框架,我們能用Struts2框架進行開發,同時能快速搭建好一個Struts2框架,但我們是否能把Struts2框架的工作原理用語言表達清楚,你表達的原理不需要說出底層是怎么實現的,我估計大多數的人也聽不懂。當面試官問到我們Struts2的工作原理時,我們該怎么回答這個問題呢?回答什么才能讓自己說的與眾不同,先看看其他朋友總結的
一、工作原理
在Struts2框架中的處理大概分為以下幾個步驟
1 客戶端初始化一個指向Servlet容器(例如Tomcat)的請求
2 這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin)
3 接著FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請是否需要調用某個Action
4 如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy
5 ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調用的Action類
6 ActionProxy創建一個ActionInvocation的實例。
7 ActionInvocation實例使用命名模式來調用,在調用Action的過程前后,涉及到相關攔截器(Intercepter)的調用。
8 一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標簽。在這個過程中需要涉及到ActionMapper
二 工作流程
1、客戶端瀏覽器發出HTTP請求.
2、根據web.xml配置,該請求被FilterDispatcher接收
3、根據struts.xml配置,找到需要調用的Action類和方法, 并通過IoC方式,將值注入給Aciton
4、Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。
5、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,并跳轉到相應頁面
6、返回HTTP響應到客戶端瀏覽器
三、攔截器和過濾器的區別
1、攔截器是基于java反射機制的,而過濾器是基于函數回調的。
2、過濾器依賴于servlet容器,而攔截器不依賴于servlet容器。
3、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。
4、攔截器可以訪問Action上下文、值棧里的對象,而過濾器不能。
5、在Action的生命周期中,攔截器可以多次調用,而過濾器只能在容器初始化時被調用一次。
四、什么要使用Struts2
Struts2 是一個相當強大的Java Web開源框架,是一個基于POJO的Action的MVC Web框架。它基于當年的Webwork和XWork框架,繼承其優點,同時做了相當的改進。
1、Struts2基于MVC架構,框架結構清晰,開發流程一目了然,開發人員可以很好的掌控開發的過程。
2、使用OGNL進行參數傳遞。
OGNL提供了在Struts2里訪問各種作用域中的數據的簡單方式,你可以方便的獲取Request,Attribute,Application,Session,Parameters中的數據。大大簡化了開發人員在獲取這些數據時的代碼量。
3、強大的攔截器
Struts2 的攔截器是一個Action級別的AOP,Struts2中的許多特性都是通過攔截器來實現的,例如異常處理,文件上傳,驗證等。攔截器是可配置與重用的,可以將一些通用的功能如:登錄驗證,權限驗證等置于攔截器中以完成一些Java Web項目中比較通用的功能。在我實現的的一Web項目中,就是使用Struts2的攔截器來完成了系統中的權限驗證功能。
4、易于測試
Struts2的Action都是簡單的POJO,這樣可以方便的對Struts2的Action編寫測試用例,大大方便了5Java Web項目的測試。
易于擴展的插件機制在Struts2添加擴展是一件愉快而輕松的事情,只需要將所需要的Jar包放到WEB-INF/lib文件夾中,在struts.xml中作一些簡單的設置就可以實現擴展。
6、模塊化管理
Struts2已經把模塊化作為了體系架構中的基本思想,可以通過三種方法來將應用程序模塊化:將配置信息拆分成多個文件把自包含的應用模塊創建為插件創建新的框架特性,即將與特定應用無關的新功能組織成插件,以添加到多個應用中去。
7、全局結果與聲明式異常
為應用程序添加全局的Result,和在配置文件中對異常進行處理,這樣當處理過程中出現指定異常時,可以跳轉到特定頁面。
他的如此之多的優點,是很多人比較的青睞,與spring ,Hibernate進行結合,組成了現在比較流行的ssh框架,當然每個公司都要自己的框架,也是ssh變異的產品。
五、看到網友的對Struts2的原理總結,我自己也總結以便后續的面試,以下是我的疑問
1、客服端發起一個請求,通過HTTP協議指向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>
誰負責根據struts.xml配置,找到需要調用的Action類和方法呢?
4、最后根據struts.xml中的配置找到對應的返回結果result,在返回HTTP響應到客戶端瀏覽器
struts2的工作原理
Struts攔截器,常用的攔截器
struts2的優點
struts2核心控制器
struts2配置文件覆蓋順序
struts2修改常量的方式
<constant name="struts.action.extension" value="do"/>
struts.action.extension=do
Action
Action實現的三種方式
訪問ServletAPI
結果視圖
默認的struts-default有什么作用
struts2如何對指定的方法進行驗證
值棧
ActionContext、ServletContext、pageContext的區別?
攔截器
自定義攔截器
文件上傳
enctype=multipart/form-data
提交方式為post我覺的要說清楚Struts原理,不光死記硬背資料上的寫的原理,還要帶著這些問題去做總結。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。
新聞熱點
疑難解答
圖片精選