zoukankan      html  css  js  c++  java
  • struts1与struts2的区别

            Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物。

    简单来说二者的区别是:   

           技术方面,Stuts1有个核心控制器,但是只提供了一个接口,也就是execute,还要配置actionform之类的,很麻烦,所以依赖性比较强;而Stuts2是针对拦截器开发的,也就是所谓的AOP思想,可以配置多个action,用起来比较方便,但是因为请求之前的拦截器有一些注入的操作,速度相对Stuts1来说慢一点

    一、Struts1的工作原理

          Struts1工作原理如下:

    1、Web容器启动的时候,ActionServlet被初始化,加载struts-config.xml配置文件;

    2、当客户端浏览器发起请求到ActionServlet时,ActionServlet对请求进行处理。根据请求的路劲和配置信息找到对应的Action和ActionForm;

    3、在确定将要调用的Action和对应的ActionForm后,就讲请求中包含的值填充到ActionForm中。在调用Action的execute方法前,ActionServlet还需要准备好ActionMapping参数;例如Action的映射信息存放在ActionMapping对象

    4、Action调用业务逻辑方法,得到返回值,并返回ActionForward对象;

    5、控制权重新回到ActionServlet,ActionServlet根据Action返回的ActionForward对象转发到相应的页面;

    6、处理结果返回给浏览器

    对于采用Struts框架的web应用, 在web应用启动时会加载并初始化ActionServlet,ActionServlet从struts-config.xml中读取配置信息,把它们存放到各种配置对象中,例如把Action的映射信息存放在ActionMapping对象中。  
       当ActionServlet接收到客户请求时,执行以下流程:     
         1、检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效信息;       
         2、如果ActionForm实例不存在,就创建一个ActionForm对象并在其中保存客户提交的表单内容;       
         3、根据配置信息决定是否调用ActionForm的validate()方法;     
         4、如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功;     
         5、ActionServlet根据ActionMapping实例包含的映射信息将请求转发给Action(如果Action实例不存在,就先创建Action实例),然后调用Action的excute()方法;       
         6、Action的excute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件;   
         7、ActionForward对象指向的JSP组件生成动态网页,返回给客户。

      XXX.action根据Web.xml中的filter配置,Struts截获所有请求,包括.action的请求; 然后查找struts.xml,找到对应的XXXAction,生成XXXAction实例,接着把表达数据传送到该实例中,然后调用Action中对应的method方法,如果没有配置则调用默认的execute()方法。

    二、Struts2工作原理

    一个请求在Struts2框架中的处理大概分为以下几个步骤:
    1 、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;
    2 、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
    3、 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action ;
    4 、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
    5 、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;
    6 、ActionProxy创建一个ActionInvocation的实例;
    7、 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用;
    8 、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper。

    工作流程
    1、客户端请求一个HttpServletRequest的请求,如在浏览器中输入http://localhost: 8080/bookcode/Reg.action就是提交一个(HttpServletRequest)请求;
    2、根据web.xml配置[请求经过一系列的过滤器(Filter)如(ActionContextCleanUp、其他过滤器(SiteMesh等)、 FilterDispatcher)。注意:这里是有顺序的,先ActionContext CleanUp,再其他过滤器(Othter Filters、SiteMesh等)],最后该请求被FilterDispatcher接收。
    FilterDispatcher是控制器的核心,就是MVC的Struts 2实现中控制层(Controller)的核心。
    3、FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(HttpServlet Request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy;
    4、ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类和方法,并通过IoC方式,将值注入给Aciton。
    5、ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过代理模式调用Action。但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器);
    6、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result;
    7、最后通过HTTPServletResponse返回客户端一个响应;
    需要注意的是:

    1、调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用

    2、Struts 2的核心控制器是FilterDispatcher,有3个重要的方法:destroy()、doFilter()和Init(),可以在Struts 2的下载文件夹中找到源代码,执行顺序是:init()---->doFilter()-->destroy()

    三、二者区别
    1、Action 类:
    • Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。
    • Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。
    2、线程模式:
    • Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
    • Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
    3、Servlet 依赖:
    • Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。
    • Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
  • 相关阅读:
    BZOJ3752 : Hack
    XIV Open Cup named after E.V. Pankratiev. GP of SPb
    XIII Open Cup named after E.V. Pankratiev. GP of Ukraine
    BZOJ2087 : [Poi2010]Sheep
    BZOJ2080 : [Poi2010]Railway
    BZOJ2082 : [Poi2010]Divine divisor
    Moscow Pre-Finals Workshop 2016. National Taiwan U Selection
    XIII Open Cup named after E.V. Pankratiev. GP of Asia and South Caucasus
    XIII Open Cup named after E.V. Pankratiev. GP of Azov Sea
    XIII Open Cup named after E.V. Pankratiev. GP of SPb
  • 原文地址:https://www.cnblogs.com/moonandstar08/p/5218579.html
Copyright © 2011-2022 走看看