struts,struts2,spring MVC原理及区别

struts,struts2,spring MVC

  • MVC思想
    • Struts原理
    • Struts2原理
    • Spring MVC原理
    • Struts和Struts2比较
    • Struts2和Spring MVC比较
    • 是否线程安全?

MVC思想

在Web开发中,MVC思想如下:
M(Model),封装应用程序的数据结构和事务逻辑,集中体现应用程序的状态,当数据状态发生改变的时候,能够在视图中显示出来,JavaBean非常适合这个角色
V(View),是Model的外在表现,模型状体改变时,有所体现。JSP非常适合这个角色
C(Controller),对用户的输入进行响应,将模型和视图联系到一起,负责将数据写到模型中,并调用视图。JAVA Servlet非常适合这个角色

其工作步骤:
(1)用户在表单输入,表单提交给Servlet,Servlet验证输入,然后实例化JavaBean
(2)JavaBean查询数据库,查询结果暂存在JavaBean中
(3)Servlet跳转到JSP,JSP使用JavaBean,得到它里面的查询结果,并进行显示

Struts原理

在Struts中,常用的组件有:JSP,ActionServlet,ActionForm,Action,JavaBean、配置文件等。
对于一个动作,其执行步骤如下:

  1. 用户输入,JSP提交表单给ActionServlet
  2. ActionServlet将表单信息封装到ActionForm中,转交Action
  3. ActionServlet不直接处理业务逻辑,而是让Action调用JavaBean(DAO)
  4. Action返回要跳转的JSP页面地址给ActionServlet
  5. ActionServlet进行跳转,结果在JSP上显示

Struts2原理

在Struts2中,常用组件有:FilterDispatcher过滤器、JSP、Action、JavaBean、配置文件等。
对于一个动作,其执行步骤如下:

  1. 用户输入, JSP表单的请求被FilterDispatcher截获
  2. FilterDispatcher将表单信息转给Action,并封装在Action内
  3. Action来调用JavaBean(DAO)
  4. Action返回要跳转的JSP页面逻辑名称给框架
  5. 框架根据逻辑名称找到相应的网址,进行跳转,结果在JSP上显示

Spring MVC原理

  1. spring mvc将所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作。
  2. DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.
  3. DispatcherServlet将请求提交到目标Controller
  4. Controller进行业务逻辑处理后,会返回一个ModelAndView(Model存储数据,View存储返回的页面)
  5. DispathcherServlet查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
  6. 视图对象负责渲染返回给客户端。

Struts和Struts2比较

  1. Struts1要求继承抽象基类org.apache.struts.action.Action,而不是接口,Struts2可以实现Action接口,也可以继承ActionSupport基类
  2. struts1是单例模式的,Action资源必须是线程安全的或同步的,会有线程安全问题,struts2为每一个请求都实例化一个对象,不存在线程安全问题。同时,系统又能够及时回收垃圾资源,不会有废弃空间的问题
  3. struts1依赖servlet API 因为execute方法的参数有httpservletrequest和httpservletresponse对象,而struts2不用依赖servlet。
  4. struts1依赖servlet API,所以测试要依赖web容器,测试难,struts2不依赖于容器,允许Action脱离容器单独被测试
  5. ActionForm,普通的JavaBean不能用作ActionForm,因此,开发者必须创建大量的ActionForm类封装用户请求参数,Struts 2直接使用Action属性来封装用户请求属性,避免了开发者需要大量开发ActionForm类的烦琐。Struts 2提供了ModelDriven模式,可以让开发者使用单独的Model对象来封装用户请求参数,但该Model对象无需继承任何Struts 2基类,是一个POJO,从而降低了代码污染。

Struts2和Spring MVC比较

  1. spring mvc的入口是servlet,而struts2是filter
  2. struts2是类级别的拦截, 一个类对应一个request上下文。
    springmvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应。
  3. spring mvc会稍微比struts2快。
    spring mvc是基于方法的设计,而sturts2是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性。
    spring mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring mvc中,一个方法对应一个request上下文。而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入,struts2中,一个Action对象对应一个request上下文。
  4. spring MVC只需要在交互方法上加上@ResponseBody即可在返回值中返回数据,spring MVC会自动将返回值数据转换成json数据。非常方便。struts2则需要自己手动将返回值数据转换成json格式,再手动写回浏览器。返回 NONE;

是否线程安全?

  1. Struts1 Action 是单例的模式并且必须是线程安全的,因为仅有 Action 的一个实例来处理所有的请求.单例的策略限制了Struts1 Action 能做的事情,并且要在开发的时候特别的小心. Action 资源必须是线程安全或者同步的
  2. Struts2 Action 对象为每一个请求产生一个实例,因此没有线程安全的问题
  3. springmvc是单例模式的框架,但它是线程安全的,因为springmvc没有成员变量,所有参数的封装都是基于方法的,属于当前线程的私有变量. 因此是线程安全的框架

你可能感兴趣的:(struts,struts2,spring MVC原理及区别)