zoukankan      html  css  js  c++  java
  • java学习-struts基础(一)

    struts发展

    struts是Apache软件基金会赞助的一个开源项目,是一个基于Java EE的MVC开源实现。
    它为Servlet/JSP技术的应用提供技术框架
    2001.7--Struts1正式发布
    2006年底--Strus2正式发布

    struts2优点

     Struts开放源码框架的创建是为了使开发者在构建基于Java Servlet和JavaServer Pages(JSP)技术的Web应用时更加容易。

    1. 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现.
    2.  丰富的标签库,提高开发效率。
    3.  页面导航.使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。
    4.  提供Exception处理机制,只需在配置文件中配置异常的映射,即可对异常做相应的处理。
    5. Struts2提供丰富的拦截器实现。

    缺点:安全性有待提高。Struts2曝出2个高危安全漏洞,一个是使用缩写的导航参数前缀时的远程代码执行漏洞,另一个是使用缩写的重定向参数前缀时的开放式重定向漏洞。这些漏洞可使黑客取得网站服务器的“最高权限”,从而使企业服务器变成黑客手中的“肉鸡”。

    struts1和struts2的区别

    struts2是在 struts 1和WebWork的技术基础开发出来的全新的框架,较好的解决了struts1的缺点。

    事实上struts2是webwork的升级而不是struts1.x的升级(struts2增加的拦截器和IOC功能这是在wbwork中继承过来了,在struts1.x没有这种功能,)

    • Struts1是使用ActionServlet做为其中心处理器,Struts2则使用一个拦截器(FilterDispatcher)做为其中心处理器,这样做的一个好处就是将Action类和Servlet API进行了分离。

    action类

    • Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Action是接口。
    • Struts2中Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去 实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。(execute是默认方法名可以在xml中自定义配置)

    线程模式: 

    • Struts1的Action类是单例模式,必须设计成线程安全的(因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的)。Struts2则为每一个请求产生一个实例(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

    与servlet耦合程度

    • Struts1的Action类依赖与Servlet API,从其execute的方法可看出,execute方法有两个Servlet的参数HttpServletRequest和HttpServletResponse。 Struts2则不依赖于Servlet API。允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。

    可测性: 

    • 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)
    •  Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。

    捕获输入

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

    表达式语言: 

    • Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。 
    • Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL). 

    绑定值到页面(view): 
    • Struts 1使用标准JSP机制把对象绑定到页面中来访问。 
    • Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。

    类型转换: 
    • Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。
    • Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。 

    校验: 
    • Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
    • Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性 

    Action执行的控制: 
    • Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。 
    • Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

    struts1工作原理图                                                                                                             struts2工作原理图

    struts1工作流程

    1初始化 

    struts1的控制器ActionServlet是一个Servlet,在web.xml中被配置成自动启动的servlet

    在启动时会读取struts-config.xml的配置信息,为struts不同的模块初始化相应对象。

    2发送请求

    客户端向web服务器发送请求,请求的数据用http协议传给服务器

    3form填充

    struts的总控制器ActionServlet在用户提交请求时将数据放到对应的form对象中的成员变量中。

    4、派发请求:控制器根据配置信息对象ActionConfig将请求派发到具体的Action,对应的formBean一并传给这个Action中的excute()方法。
     
    5、处理业务:Action一般只包含一个excute()方法,它负责执行相应的业务逻辑(调用其它的业务模块)完毕后返回一个ActionForward对象。服务器通过ActionForward对象进行转发工作。
     
    6、返回响应:Action将业务处理的不同结果返回一个目标响应对象给总控制器。
     
    7、查找响应:总控制器根据Action处理业务返回的目标响应对象,找到对应的资源对象,一般情况下为jsp页面。
     
    8、响应用户:目标响应对象将结果传递给资源对象,将结果展现给用户。

    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 

    参考资料:

     Struts1、Struts2、Hibernate、Spring框架工作原理介绍

  • 相关阅读:
    Call KernelIoControl in user space in WINCE6.0
    HOW TO:手工删除OCS在AD中的池和其他属性
    关于新版Windows Server 2003 Administration Tools Pack
    关于SQL2008更新一则
    微软发布3款SQL INJECTION攻击检测工具
    HyperV RTM!
    OCS 2007 聊天记录查看工具 OCSMessage
    CoreConfigurator 图形化的 Server Core 配置管理工具
    OC 2007 ADM 管理模板和Live Meeting 2007 ADM 管理模板发布
    Office Communications Server 2007 R2 即将发布
  • 原文地址:https://www.cnblogs.com/gne-hwz/p/7161992.html
Copyright © 2011-2022 走看看