-
struts1与strut2的差别
添加时间:2013-7-25 点击量:struts1和struts2是两个完全不合的框架
struts1工作流程:
公布Struts Web办事时,按照web.xml初始化ActionServlet,ActionContext等内容.
在接到一个HttpRequest恳求后,ActionServlet 按照struts-config.xml中的设备内容,将恳求的参数传到对应的Formbean中,并设置session.然后按照恳求中的Action参数,在struts-config.xml中查找指定的Action,并调用此Action来处理惩罚恳求.按照Action的处理惩罚成果,会返回一个forward变量,此时经由过程mapping.findForward()查找出对应的forward所标示的Action或者JSP页面,将恳求转到下一个处理惩罚.若是是forward指向JSP页面,则输出到前台.Struts2工作流程:
(1)客户端提交一个HttpServletRequest恳求(.action或JSP页面)
(2)恳求被提交到一系列Filter过滤器,如ActionCleanUp和FilterDispatcher等
(3)FilterDispatcher是Struts2把握器的核心,它凡是是过滤器链中的最后一个过滤器
(4)恳求发到FilterDispatcher后,FilterDispatcher询问ActionMapper是否须要调用某个Action来处理惩罚这个Request(一般按照URL后缀是否为.action来断定)
(5)若是ActionMapper决意须要调用某个Action,FilterDispatcher则把恳求交到ActioProxy,由其进行处理惩罚.
(6)ActionProxy经由过程Configuration Manager(它会接见struts.xml)询问框架的设备文件,找到须要调用的Action类.
(7)ActionProxy创建一个ActionInvocation实例,而ActionInvocation经由过程模式调用Action,(在调用之前会按照设备文件加载相干的所有Interceptor阻碍器)
(8)Action履行完毕后,返回一个result字符串,此时再按相反的次序经由过程Interceptor阻碍器.
(9) 最后ActionInvocation负责按照struts.xml中设备的result元素,找到与返回值对应的result,决意进行下一步输出.
差别:
/Action类
Struts1请求Action类持续一个抽象类,Struts1应用抽象类编程而不是接口
Struts2可以实现Action接口也可以不实现,Struts2供给一个ActionSuport基类去实现常用接口。Action接口不是必须的,任何有execute的标识的POJO都有可能成为struts2的Action的对象
/线程模式
Struts1的Action是单例模式并且是线程安然的,仅有Action一个实例来处理惩罚所有恳求。单策略模式限制了Struts1 Action能做的事。在开辟时要重视Action资料必须是线程安然比且是同步的。
Struts2的Action对象为每个恳求产生一个实例,是以没有线程安然题目。
/Servlet依附
Struts1 Action依附与Servlet API,因为当一个Action被调用时HttpServletRequest和HttpServletResponse被传递给execute办法。
Struts2 Action不依附与容器,容许Action离开容器被零丁测试。若是须要,struts2依然可以接见初始的request和response。然则,其他的元素削减或者打消了直接接见HttpServletRequest和HttpServletResponse的须要性。/表达式说话
Struts1整合了JSTL,是以应用JSTL EL。这种EL有根蒂根基对象图遍历,然则对凑集和索引属性的支撑很脆弱。
Struts2可以应用JSTL,然则也支撑一个更强大和灵活的表达式说话--“object graph Notation Language”(OGNL)/校验
Struts1支撑在ActionForm的validate办法中手动校验,或者经由过程Commons Validator的扩大来校验。同一个类可以有不合的校验内容,但不克不及校验子对象。
Struts2支撑经由过程validate办法和XWork校验框架进行效校验。XWork校验框架应用为属性类类型定义的校验和内容校验,来支撑Chain校验子属性。/Action履行的把握
Struts1支撑每一个模块有零丁的Request Processors(生命周期),然则模块中的所有Action必须共享雷同的生命周期。
struts2支撑经由过程阻碍器客栈(Interceptor Stacks)为每一个Action创建不克不及的生命周期。客栈可以或许按照须要和不合的Action一路应用。/类型转换
Struts1 ActionForm属性凡是都是String类型。struts1应用Commons-Beanutils进行类型转换。每个类一个转换器对每一个实例来说是不成设备的
struts2 应用OGNL进行类型转换,供给根蒂根基和常用对象的转换器。/绑定值到页面(view)
Struts1应用标准JSP机制吧对象绑定到页面中来接见。
struts2应用ValueStack技巧,使taglib可以或许接见值而不须要把你的页面(view)和对象绑定起来。ValueStack策略容许经由过程一系列名称雷同但类型不合的属性重同页面(view)/捕获输入:
struts1应用ActionForm对象捕获输入。所有ActionForm必须持续一个基类。因为其他JavaBean不克不及用作ActionForm,开辟者经常创建多余的基类不或输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,然则,开辟者可能是在从头描述(创建)已经存在的JavaBean(仍然会导致有沉余的JavaBean)。Struts2直接应用Acrtion属性作为输入属性,打消了对第二个输入对象的恳求。输入属性可能是有本身(子)属性的Rich对象类型。Action属机能过经由过程web页面上的Taglibs接见。struts2也支撑ActionForm模式。Richard对象类型,包含营业对象,可以或许用作输入/输出对象。这种ModelDriven特点简化了Taglib对POJO输入对象的引用。
我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》