网站开发 男生,德庆网站建设公司,百度seo最成功的优化,怎么自创公众号先说结论#xff1a;目前Spring MVC已经一统江山#xff0c;Struts正在被抛弃
1、Spring MVC原理
Spring 体系#xff1a; Spring MVC工作流程图 SpringMVC的工作流程描述
1. 用户向服务器发送请求#xff0c;请求被Spring前端控制Servelt DispatcherServlet捕获#x…先说结论目前Spring MVC已经一统江山Struts正在被抛弃
1、Spring MVC原理
Spring 体系 Spring MVC工作流程图 SpringMVC的工作流程描述
1. 用户向服务器发送请求请求被Spring前端控制Servelt DispatcherServlet捕获2. DispatcherServlet对请求URL进行解析得到请求资源标识符URI。然后根据该URI调用HandlerMapping获得该Handler配置的所有相关的对象包括Handler对象以及Handler对象对应的拦截器最后以HandlerExecutionChain对象的形式返回DispatcherServlet根据获得的Handler选择一个合适的HandlerAdapter。附注如果成功获得HandlerAdapter后此时将开始执行拦截器的preHandler(…)方法 提取Request中的模型数据填充Handler入参开始执行HandlerController)。在填充Handler的入参过程中根据你的配置Spring将帮你做一些额外的工作 HttpMessageConveter将请求消息如Json、xml等数据转换成一个对象将对象转换为指定的响应信息 数据转换对请求消息进行数据转换。如String转换成Integer、Double等 数据根式化对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等 数据验证验证数据的有效性长度、格式等验证结果存储到BindingResult或Error中 Handler执行完成后向DispatcherServlet 返回一个ModelAndView对象 根据返回的ModelAndView选择一个适合的ViewResolver必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ViewResolver结合Model和View来渲染视图 8.将渲染结果返回给客户端。
2、Struts原理
Struts架构图 从图可以看出一个请求在Struts2框架中的处理大概分为以下几个步骤
1、客户端初始化一个指向Servlet容器例如Tomcat的请求
2、这个请求经过一系列的过滤器Filter这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器这个过滤器对于Struts2和其他框架的集成很有帮助例如SiteMeshPlugin
3、接着StrutsPrepareAndExecuteFilter被调用StrutsPrepareAndExecuteFilter询问ActionMapper来决定这个请求是否需要调用某个Action
4、如果ActionMapper决定需要调用某个ActionStrutsPrepareAndExecuteFilter把请求的处理交给ActionProxy
5、ActionProxy通过ConfigurationManager询问框架的配置文件找到需要调用的Action类
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用在调用Action的过程前后涉及到相关拦截器Intercepter的调用。
8、一旦Action执行完毕ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是但不总是也可能是另外的一个Action链一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。
以上是从宏观上对比下二者的工作流程下面针对细节对比二者的不同。
3、Struts2和Spring Mvc的区别
3.1、拦截机制的不同 Struts2是类级别的拦截每次请求就会创建一个Action和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype然后通过settergetter吧request数据注入到属性。 Struts2中一个Action对应一个requestresponse上下文在接收参数时可以通过属性接收这说明属性参数是让多个方法共享的。Struts2中Action的一个方法可以对应一个url而其类属性却被所有方法共享这也就无法用注解或其他方式标识其所属方法了只能设计为多例。
SpringMVC是方法级别的拦截一个方法对应一个Request上下文所以方法直接基本上是独立的独享requestresponse数据。而每个方法同时又何一个url对应参数的传递是直接注入到方法中的是方法所独有的。处理结果通过ModeMap返回给框架。在Spring整合时SpringMVC的Controller Bean默认单例模式Singleton所以默认对所有的请求只会创建一个Controller有应为没有共享的属性所以是线程安全的如果要改变默认的作用域需要添加Scope注解修改。
Struts2有自己的拦截Interceptor机制SpringMVC这是用的是独立的Aop方式这样导致Struts2的配置文件量还是比SpringMVC大。
3.2、底层框架的不同 Struts2采用FilterStrutsPrepareAndExecuteFilter实现SpringMVCDispatcherServlet则采用Servlet实现。Filter在容器启动之后即初始化服务停止以后坠毁晚于Servlet。Servlet在是在调用时初始化先于Filter调用服务停止后销毁。
3.3、性能方面 Struts2是类级别的拦截每次请求对应实例一个新的Action需要加载所有的属性值注入SpringMVC实现了零配置由于SpringMVC基于方法的拦截有加载一次单例模式bean注入。所以SpringMVC开发效率和性能高于Struts2。
3.4、和Spring集成
spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果但是需要xml配置的地方不少。
3.5、验证机制
SpringMVC验证支持JSR303处理起来相对更加灵活方便而Struts2验证比较繁琐感觉太烦乱。
3.6、设计思想
Struts2更加符合OOP的编程思想 SpringMVC就比较谨慎在servlet上扩展。
3.7、集成方面
SpringMVC集成了Ajax使用非常方便只需一个注解ResponseBody就可以实现然后直接返回响应文本即可而Struts2拦截器集成了Ajax在Action中处理时一般必须安装插件或者自己写代码集成进去使用起来也相对不方便。
拓展 拦截器与过滤器的区别
拦截器是基于java的反射机制的而过滤器是基于函数回调。拦截器不依赖与servlet容器过滤器依赖与servlet容器。拦截器只能对action请求起作用而过滤器则可以对几乎所有的请求起作用。拦截器可以访问action上下文、值栈里的对象而过滤器不能访问。在action的生命周期中拦截器可以多次被调用而过滤器只能在容器初始化时被调用一次 servletservlet是一种运行服务器端的Java应用程序具有独立于平台和协议的特性并且可以动态的生成web页面它工作在客户端请求与服务器响应的中间层。 filterfilter是一个可以复用的代码片段可以用来转换HTTP请求、响应和头信息。Filter不像Servlet它不能产生一个请求或者响应它只是修改对某一资源的请求或者修改从某一的响应。 listener监听器从字面上可以看出listener主要用来监听只用。通过listener可以监听web服务器中某一个执行动作并根据其要求作出相应的响应。通俗的语言说就是在applicationsessionrequest三个对象创建消亡或者往其中添加修改删除属性时自动执行代码的功能组件。 interceptor是在面向切面编程的就是在你的service或者一个方法前调用一个方法或者在方法后调用一个方法比如动态代理就是拦截器的简单实现在你调用方法前打印出字符串或者做其它业务逻辑的操作也可以在你调用方法后打印出字符串甚至在你抛出异常的时候做业务逻辑的操作。 servlet、filter、listener是配置到web.xml中interceptor不配置到web.xml中struts的拦截器配置到struts.xml中。spring的拦截器配置到spring.xml中。