同是流行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的差别了。
-
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 url。struts2是类级别的拦截,一个类相应一个request上下文;实现restfulurl要费劲,由于struts2 action的一个方法能够相应一个url;而其类属性却被全部方法共享,这也就无法用注解或其它方式标识其所属方法了。
数据共享:
struts是在接受參数的时候,能够用属性来接受參数,这就说明參数是让多个方法共享的。
spring3 mvc的方法之间基本上独立的。独享request response数据,请求数据通过參数获取,处理结果通过ModelMap交回给框架方法之间不共享变量
-
处理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>
-
intercepter的实现机制:
struts有以自己的interceptor机制,springmvc用的是独立的AOP方式。这样导致struts的配置文件量还是比springmvc大,尽管struts的配置能继承,所以我认为论使用上来讲,spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高。
小结
其有用什么技术。这一点真的没有硬性的要求,有人认为struts好用,有人就认为springMVC先进。
总的来说,实现的功能都是大体一致的。有时候架构师一直使用struts,为了项目的稳定,就一直沿用。而一些先进分子总是喜欢在项目中常识新的技术。也促进了这项技术的发展。
单就struts和springMVC来说,都是controller层的框架,作用都是接收request请求,中间调用业务逻辑代码。最后返回reponse响应。不用刻意远离SSH。也不用一味追求Spring
MVC。总之,合适的就是最好的。