同是流行MVC框架,比較Strtus2和SpringMVC的差别

Struts2和SpringMVC是比較流行的MVC框架,二者的工作流程大体相似,从以下两张图就能够看出。


SpringMVC工作流程图


 

图二 


 

SpringMVC的工作流程描写叙述

     1. 用户向server发送请求,请求被Spring前端控制Servelt DispatcherServlet捕获;

      2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后依据该URI,调用HandlerMapping获得该Handler配置的全部相关的对象(包含Handler对象以及Handler对象相应的拦截器),最后以HandlerExecutionChain对象的形式返回;

      3. DispatcherServlet依据获得的Handler。选择一个合适的HandlerAdapter。

附注:假设成功获得HandlerAdapter后。此时将開始运行拦截器的preHandler(...)方法)

       4.  提取Request中的模型数据,填充Handler入參,開始运行Handler(Controller)。在填充Handler的入參过程中。依据你的配置。Spring将帮你做一些额外的工作:

      HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息

      数据转换:对请求消息进行数据转换。

如String转换成Integer、Double等

      数据根式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等

      数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

      5.  Handler运行完毕后,向DispatcherServlet 返回一个ModelAndView对象;

      6.  依据返回的ModelAndView。选择一个适合的ViewResolver(必须是已经注冊到Spring容器中的ViewResolver)返回给DispatcherServlet ;

      7. ViewResolver结合Model和View,来渲染视图

      8.将渲染结果返回给client。


Strut2的体系结构如图所看到的:



从图能够看出。一个请求在Struts2框架中的处理大概分为下面几个步骤:

1、client初始化一个指向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就easy实现restful urlstruts2是类级别的拦截,一个类相应一个request上下文;实现restfulurl要费劲,由于struts2 action的一个方法能够相应一个url;而其类属性却被全部方法共享,这也就无法用注解或其它方式标识其所属方法了。

 

数据共享:

struts是在接受參数的时候,能够用属性来接受參数,这就说明參数是让多个方法共享的。

spring3 mvc的方法之间基本上独立的。独享request response数据,请求数据通过參数获取,处理结果通过ModelMap交回给框架方法之间不共享变量

 

 

  1. 处理ajax的请求

spring3 mvc的验证也是一个亮点,支持JSR303,处理ajax的请求更是方便,仅仅需一个注解@ResponseBody ,然后直接返回响应文本就可以。送上一段代码: 

<span style="font-family:SimSun;font-size:18px;">@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();
//                }
}</span>

 

  1. intercepter的实现机制:

struts有以自己的interceptor机制,springmvc用的是独立的AOP方式。这样导致struts的配置文件量还是比springmvc大,尽管struts的配置能继承,所以我认为论使用上来讲,spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高。


小结

    其有用什么技术。这一点真的没有硬性的要求,有人认为struts好用,有人就认为springMVC先进。

总的来说,实现的功能都是大体一致的。有时候架构师一直使用struts,为了项目的稳定,就一直沿用。而一些先进分子总是喜欢在项目中常识新的技术。也促进了这项技术的发展。

单就struts和springMVC来说,都是controller层的框架,作用都是接收request请求,中间调用业务逻辑代码。最后返回reponse响应。不用刻意远离SSH。也不用一味追求Spring MVC。总之,合适的就是最好的。

posted @ 2017-04-25 14:35  jzdwajue  阅读(159)  评论(0编辑  收藏  举报