在struts2.0中,可以通過ServletActionContext.getRequest()獲取request對象。
在action的方法中return一個字符串,該字符串對應struts.xml中的result標簽的name相同,result標簽中包含的就是跳轉頁面,
其原理,我的理解是這樣的:
一.客戶端提起一個(HttpServletRequest)請求,如上文在瀏覽器中輸入”http://localhost:8080/TestMvc/add.action”
二.請求被提交到一系列(主要是三層)的過濾器(Filter),如ActionContextCleanUp,FilterDispatcher等
三.FilterDispatcher是控制器的核心,FilterDispatcher進行初始化並啟用核心doFilter
四.FilterDispatcher詢問ActionMapper是否需要調用某個Action來處理這個(request)請求,如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy
五、ActionProxy通過(struts.xml)詢問框架的配置文件,找到需要調用的Action類.
六、ActionProxy創建一個ActionInvocation的實例,同時ActionInvocation通過代理模式調用Action。但在調用之前ActionInvocation會根據配置加載Action相關的所有Interceptor(攔截器)
ActionInvocation工作原理:
1. ActionInvocation初始化時,根據配置,加載Action相關的所有Interceptor。
2. 通過ActionInvocation.invoke方法調用Action實現時,執行Interceptor。
3. 旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果
可以說Struts2本質還是一個Servlet(在S1中用於整體控制的是一個Servlet;S2中是一個Filter,其實也可把它看作是Servlet),只是對Servlet進一步的封裝罷了
打個比方:做Web項目,好比建房子。Servlet好比木材,用一根根的木材搭,也可蓋起房子,只是速度慢而已;
而Struts2好比是用木材做好的一個房子大概結構,要建房子時,只需把它拿過來,再往其里面添磚加瓦,修修補補,就能很快蓋好房子,這要比直接使用Servlet要快得多
具體對比
1.開發時間。這個的對比是struts比servlet低。因為struts有一些配置文件,如果有些不注意思,出錯的機會比servlet大,不如使用jsp+servlet開發隨意。
2.代碼的規范。因為jsp+servlet開發隨意。規范性應差。控制語句到處有,為維護及修改帶來不便。也使接手的人為解讀代碼帶來不便。
3.安全性。web開發最不安全的就是session的使用.servlet的開發離不開request。有了request,那也就有了session,以前我們有個組開發,亂用session,使系統的性能很着。而且有很多保密信息外漏。如果你在serlet中封裝request,那你就會發現越來越象struts。而struts的值都保存在ActionForm中,所以進行簡單的封裝就可以使底層人員,看不到requet,又不影響取值。
4.維護性。這個基本處於項目后期,這個的比較,就是struts遠勝於servlet。只在PM控制的好。那么struts項目的代碼分層很清晰。數據層,頁面表示,頁面控制,業務處理,這些都會分好模塊。這給后期維護帶來了很大的方便。因為后期的話,誰也不想引入新的BUG,如果用servlet,代碼結構不清晰,很空易引入新BUG。這也是struts最強勢的地方。
struts最受人指責的地方就是前期布署,開發比較費時。所以現在的方向是便捷開發易編創護框架的開發。