zoukankan      html  css  js  c++  java
  • Struts1和Struts2的区别

    Struts1的工作原理是Web程序启动的时,候会加载ActionServlet,然后ActionServlet会读取struts-config.xm配置文件中的配置信息,把配置信息存放到配置对象中

    ActionServlet接到请求执行一下流程

    检索ActionMapping实例,如果不存在就返回无效路径错误

    如果ActionForm实例不存在,就创建一个ActionForm对象,把客户端表单提交的数据封装到ActionForm中

    根据配置信息检查是否需要表单验证,如果需要就调用ActionForm中的validate()方法,如果validate方法返回null或者并不包含ActionMessage中的ActionError对象,就表示验证成功。

    ActionServlet根据ActionMapping所包含的的映射信息将请求发个对应的Action,如果action不存在就创建action,然后调用action中的execute()方法进行处理

    action的execute方法返回一个ActionFord对象,ActionServlet会把客户端发送的请求转发给ActionFord对象的jsp页面

    Struts2的核心是xwork,同时吸收了struts1的优点

    当客户端发送请求时,会首先经过图中的几个过滤器然后到达FilterDispatcher

    过滤去FilterDispatcher是struts2的心脏,在web容器启动的时候会自动加载配置文件中的参数,并转换成相应的类如ConfigurationManager、ActionMapper和ObjectFactory

    ConfigurationManager存有一些配置文件的基本信息,ActionMapper存有action的配置信息。在请求过程中所有的对象都是通过ObjectFactory来创建的。过滤器会通过查询ActionMapper类来查找请求中所需要的Action

    如果找到Action,过滤器会把请求交给ActionProxy(代理对象),ActionProxy通过ConfigurationManager配置找到对象的action类

    ActionProxy创建一个ActionInvocation实例,Actioninvocation初始化时根据配置加载action所有相关的Interceptor。

    Actioninvocation初始化时根据配置加载Action相关所有的Interceptor,通过ActionInvocation.invoke方法调用Action实现时执行Interceptor。在调用Action的过程前后,涉及到相关拦截器的调用

    action执行完毕之后,Actioninvocation会找到struts.xml中配置的返回结果然后返回。

    Struts1和Struts2的区别,从工作原理上可以看出两者有很大的不同。

    下面参考:http://www.blogjava.net/314508313/archive/2011/11/17/364038.html

    1.在Action方面对比:Struts1的action继承了抽象基类,struts1的问题是试用抽象类而不是借口编程。Struts2可以实现一个Action借口也可以实现其他接口。Struts2提供一个ActinSupport基类去实现常用的接口。

    2.线程方面对比:Struts1 Action是单例模式必须是线程安全的,因为仅有一个Action实例处理请求,这就限制了action能做的事情,开发的时候也需要小心Action资源必须是线程安全的或者同步的,Struts2 Action为每一个请求产生一个实例,因此没有线程安全问题。

    3.Servlet依赖方面:Struts2的action依赖于Servlet的API,因为action中的execute方法中有HttpServletRequest和HttpServletResponse。Struts2的action不在依赖于Servlet,因此可以脱离web容器运行,降低了测试action的难度。

    4.封装请求参数的对比:Struts1使用ActionForm封装请求参数,所有的ActionForm必须统一继承基类ActionForm,普通的JavaBean不能用作ActionForm,因此开发这要创建很多ActionForm,Struts2直接可以用Action中的属性来封装用户请求的参数,可以创建一个基本pojo类来封装请求的参数,然后在action中定义就行了。

    5.表达语言方面:Struts1整合了JSTL表达式,Struts2可以使用JSTL也整合了更强大的表达式语言OGNL。

    6.绑定视图对比:struts1使用标准的jsp显示,Struts2使用“ValueStack”技术,使标签库能够访问值,而不需要把对象和视图页面绑定在一起。可以和多种显示整合。

    7.类型转换对比:Struts 1 ActionForm 属性通常都是String类型。Struts 1使用Commons-Beanutils进行类型转换,每个类一个转换器,转换器是不可配置的;Struts 2使用OGNL进行类型转换,支持基本数据类型和常用对象之间的转换。

    8.Struts 1支持在ActionForm重写validate方法中手动校验,或者通过整合Commons alidator框架来完成数据校验。Struts 2支持通过重写validate方法进行校验,也支持整合XWork校验框架进行校验。

    9.Struts 1支持在ActionForm重写validate方法中手动校验,或者通过整合Commons alidator框架来完成数据校验。Struts 2支持通过重写validate方法进行校验,也支持整合XWork校验框架进行校验。

    10.Action执行控制的对比:Struts 1支持每一个模块对应一个请求处理(即生命周期的概念),但是模块中的所有Action必须共享相同的生命周期。Struts 2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。开发者可以根据需要创建相应堆栈,从而和不同的Action一起使用。

    11.Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经 常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存 在的JavaBean(仍然会导致有冗余的javabean)。Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。

  • 相关阅读:
    频繁FGC解决方案
    ThreadLocal
    Session与Cookie
    Socket通信流程
    SpringBoot面试题
    面向对象3大特性:封装、继承、多态——继承(继承方法的重写和初始化顺序、final & super关键字、Object类)
    面向对象3大特性:封装、继承、多态——封装(this 、访问修饰符、内部类)
    java类和对象、构造方法、静态变量、静态方法、静态初始化块
    数组的使用、eclipse调试程序、练习小demo以及方法的定义和重载
    java中的条件语句if...else... switch 和循环语句while do...while for
  • 原文地址:https://www.cnblogs.com/hujia/p/3542498.html
Copyright © 2011-2022 走看看