SpringMVC與structs2區別
Struts2和SpringMVC是比較流行的MVC框架,二者的工作流程大體相似,從下面兩張圖就可以看出。,
SpringMVC工作流程圖
圖二
SpringMVC的工作流程描述
-
使用者向伺服器傳送請求,請求被Spring前端控制Servelt DispatcherServlet捕獲;
-
DispatcherServlet對請求URL進行解析,得到請求資源識別符號(URI)。然後根據該URI,呼叫HandlerMapping獲得該Handler配置的所有相關的物件(包括Handler物件以及Handler物件對應的攔截器),最後以HandlerExecutionChain物件的形式返回;
-
DispatcherServlet根據獲得的Handler,選擇一個合適的HandlerAdapter。(附註:如果成功獲得HandlerAdapter後,此時將開始執行攔截器的preHandler(…)方法)
-
提取Request中的模型資料,填充Handler入參,開始執行Handler(Controller)。在填充Handler的入參過程中,根據你的配置,Spring將幫你做一些額外的工作:
HttpMessageConveter:將請求訊息(如Json、xml等資料)轉換成一個物件,將物件轉換為指定的響應資訊
資料轉換:對請求訊息進行資料轉換。如String轉換成Integer、Double等
資料根式化:對請求訊息進行資料格式化。如將字串轉換成格式化數字或格式化日期等
資料驗證:驗證資料的有效性(長度、格式等),驗證結果儲存到BindingResult或Error中
-
Handler執行完成後,向DispatcherServlet 返回一個ModelAndView物件;
-
根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet ;
-
ViewResolver結合Model和View,來渲染檢視
8.將渲染結果返回給客戶端。
Strut2的體系結構如圖所示:
從圖可以看出,一個請求在Struts2框架中的處理大概分為以下幾個步驟:
1、客戶端初始化一個指向Servlet容器(例如Tomcat)的請求;
2、這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他框架的整合很有幫助,例如:SiteMeshPlugin);
3、接著StrutsPrepareAndExecuteFilter被呼叫,StrutsPrepareAndExecuteFilter詢問ActionMapper來決定這個請求是否需要呼叫某個Action;
4、如果ActionMapper決定需要呼叫某個Action,StrutsPrepareAndExecuteFilter把請求的處理交給ActionProxy;
5、ActionProxy通過ConfigurationManager詢問框架的配置檔案,找到需要呼叫的Action類;
6、ActionProxy建立一個ActionInvocation的例項。
7、ActionInvocation例項使用命名模式來呼叫,在呼叫Action的過程前後,涉及到相關攔截器(Intercepter)的呼叫。
8、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2框架中繼承的標籤。在這個過程中需要涉及到ActionMapper。
以上是從巨集觀上對比下二者的工作流程,下面針對細節對比二者的不同。
SpringMVC和Struts2的區別:
1. 機制:
springmvc的入口是servlet,而struts2是filter(這裡要指出,filter和servlet是不同的。以前認為filter是servlet的一種特殊),這樣就導致了二者的機制不同,這裡就牽涉到servlet和filter的區別了。
(1)spring mvc是基於方法的設計,而sturts是基於類,導致:
效能:
spring會稍微比struts快。spring mvc是基於方法的設計,而sturts是基於類,每次發一次請求都會例項一個action,每個action都會被注入屬性,而spring基於方法,粒度更細,但要小心把握像在servlet控制資料一樣。spring3mvc是方法級別的攔截,攔截到方法後根據引數上的註解,把request資料注入進去,在spring3mvc中,一個方法對應一個request上下文。而struts2框架是類級別的攔截,每次來了請求就建立一個Action,然後呼叫settergetter方法把request中的資料注入;struts2實際上是通過setter getter方法與request打交道的,而springmvc不用setter getter方法;struts2中,一個Action物件對應一個request上下文。
實現restful:
springmvc是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,所以說從架構本身上spring3 mvc就容易實現restful url。struts2是類級別的攔截,一個類對應一個request上下文;實現restfulurl要費勁,因為struts2 action的一個方法可以對應一個url;而其類屬性卻被所有方法共享,這也就無法用註解或其他方式標識其所屬方法了。
資料共享:
struts是在接受引數的時候,可以用屬性來接受引數,這就說明引數是讓多個方法共享的。
spring3 mvc的方法之間基本上獨立的,獨享request response資料,請求資料通過引數獲取,處理結果通過ModelMap交回給框架方法之間不共享變數
處理ajax的請求
spring3 mvc的驗證也是一個亮點,支援JSR303,處理ajax的請求更是方便,只需一個註解@ResponseBody ,然後直接返回響應文字即可。送上一段程式碼:
@ResponseBody
@RequestMapping("/delUser")
public String delUser(String id, HttpServletResponse response){
String result ="{\"result\":\"error\"}";
if (userManager.delUser(id)) {
result ="{\"result\":\"success\"}";
}
return result;
// spring3mvc的驗證也是一個亮點,支援JSR303,處理ajax的請求更是方便,只需一個註解@ResponseBody
// @ResponseBody代替了下面的程式碼
// PrintWriterout = null;
// response.setContentType("application/json");
//
// try{
// out= response.getWriter();
// out.write(result);
// }catch (IOException e) {
// e.printStackTrace();
// }
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
intercepter的實現機制:
struts有自己的interceptor機制,springmvc用的是獨立的AOP方式。這樣導致struts的配置檔案量還是比springmvc大,雖然struts的配置能繼承,綜上,spring mvc使用更加簡潔,開發效率Spring MVC確實比struts2高。