1、Struts2培训笔记Struts2培训笔记一、 Struts2/Apache Struts1简介:MVC一、 Struts2发展史:核心技术是Webwork,Webwork原来是一个独立的开源项目,后来该项目捐赠给了Apache软件基金会,Apache就将它原来Struts与Webwork两个Web MVC框架进行整合,由于Struts出现的较早应用较广名声大,但它本身的设计没有后起之秀Webwork优秀所以Struts2的核心是Webwork。 二、 两种声明式桇构:XML配置方式和JAVA注解方式(不好用)三、 MVC模式:控制器、模型、视图控制器部分还应该包括Struts的配置文件st
2、ruts.xml;Action动作其实也可看作控制器同时也是模型对象。四、 工作原理上图来源于Struts2官方站点,是Struts 2 的整体结构。一个请求在Struts2框架中的处理大概分为以下几个步骤1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来
3、决定这个请是否需要调用某个Action4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类6 ActionProxy创建一个ActionInvocation的实例。7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配
4、置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。 Struts处理过程的一些内部对象说明:1. 客户端请求:高版本的Struts2已不推荐使用FilterDispatcher,而改用org.apache.struts2.dispatcher.ng.filter.StrutsPre
5、pareAndExecuteFilter。客户端请求最先由该过滤器处理。2. StrutsPrepareAndExecuteFilter根据请求的路径信息创建一个ActiomMapper实例,而ActionMapper负责从struts.xml文件中找到要调用的 配置。3. 接着框架会创建一个ActionProxy(Action代理实例),ActionProxy会通过ActionInvocation实例去调用Action对象的方法。也就是说框架不会直接调用Action方法而是通ActionProxy和ActionInvocation间接去完成Action的调用。可以把Action理解成一段.配
6、置信息的封装。4. 框架会通过ActionProxy去获得一个ActionInvocation实例,每一次用户请求struts都会创建一个ActionInvocation对象。ActionInvocation将包含调用Action对象过程的相关信息,如调用过程前后的一系列相关的拦截器。5. ActionInvocation的具体功能请参考本文档“第五节”。二、 Action动作类1) HelloWorld示例2) 动作类的作用:a) 动作类封装工作单元:execute()方法执行操作b) 动作类作为数据转移的场所:属性存储数据c) 动作为结果路由选择返回控制字符串:页面导航3) 实现动作类的三
7、种方式:实现Action接口、扩展ActionSupport、POJO,建议使用扩展ActionSupport的方式实现一个动作类,其好处是继承了众多的、便利的方法来获得框架提供的服务。4) 掌握struts.xml配置文件:a) 配置常量(也可以定义在struts.properties属性文件中):b) 配置包:名字空间必须唯一 .c) 配置动作: .d) 配置结果:/chapterTwo/HelloWorld.jspe) 配置拦截器: f) 配置全局结果:g) 配置全局异常:三、 常用Result类型:1. chain:动作链(转发方式),从一个动作转到另一个动作上去执行。实现类:com.
8、opensymphony.xwork2.ActionChainResult2. dispatcher(默认结果类型):转发,使用RequestDispatcher来转发或包含。实现类:org.apache.struts2.dispatcher.ServletDispatcherResult3. redirect:重定向,实际上调用response.sendRedirect(.)完成,这样意味着会丢失当前请求中的数据,必要时需要URL编码来传参。实现类:org.apache.struts2.dispatcher.ServletRedirectResult4. redirectAction:类似r
9、edirect结果类型,但比redirect结果要好,因为在struts.xml配置文件中无需去编码URL,建义使用该结果类型而不用redirect类型。实现类:org.apache.struts2.dispatcher.ServletActionRedirectResult5. stream:流结果类型,可供用户下载文件,有多个参数配置。实现类:org.apache.struts2.dispatcher.StreamResult6. plaintext:无格式文本,通常用于显示原文件(JSP,HTML)的内容。7. 等等有关各种Result的配置参照:API中com.opensymphony
10、.xwork2.Result接口各实现类的详细说明。结果类型配置参数chain动作链 dashboard /secure list - used to specify another method on target action to be invoked. If null, this defaults to execute methoddispatcher转发(默认) location (default) - the location to go to after execution (ex. jsp). parse - true by default. If set to false,
11、the location param will not be parsed for Ognl expressions.redirect重定向 location (default) - the location to go to after execution. parse - true by default. If set to false, the location param will not be parsed for Ognl expressions.redirectAction重定向到动作 actionName (default) - the name of the action t
12、hat will be redirect to namespace - used to determine which namespace the action is in that were redirecting to . If namespace is null, this defaults to the current namespace method - used to specify another method on target action to be invoked. If null, this defaults to execute methodstream流结果类型,文
13、件下载 contentType - the stream mime-type as sent to the web browser (default = text/plain). contentLength - the stream length in bytes (the browser displays a progress bar). contentDispostion - the content disposition header value for specifing the file name (default = inline, values are typically fil
14、ename=document.pdf. inputName - the name of the InputStream property from the chained action (default = inputStream). bufferSize - the size of the buffer to copy from input to output (default = 1024). 参照如下配置 :plaintext显示原文件内容 location (default) = location of the file (jsp/html) to be displayed as pl
15、ain text. charSet (optional) = character set to be used. This character set will be used to set the response type (eg. Content-Type=text/plain; charset=UTF-8) and when reading using a Reader. Some example of charSet would be UTF-8, ISO-8859-1 etc. 四、 拦截器1. 工具拦截器:h) timer拦截器:记录执行所花的时间。在拦截器栈中的位置决定了它实际
16、测量什么时间,可用于性能测试。i) logger拦截器:提供简单的日志记录机制2. 数据转移拦截器:j) params拦截器:将请求参数转移到通过ValueStack公开的属性上,再将ValueStack中的数据转移到Action属性上。k) staticParams拦截器:将参数转移到ValueStack公开的属性上,不同的是参数的来源定义在声明性桇构的动作元素中。l) autowiring拦截器:为使用Spring管理应用程序资源提供了一个集成点。m) servletConfig拦截器:提供了一种将来源于Servlet API的各种对象注入到动作的简洁方法(如将请求,会话注入到动作中),要
17、求动作必须实现相应的接口(ServletContextAware、ServletRequestAware、ServletResponseAware、SeesionaAware等)。n) fileUpload拦截器:将文件和元数据从多重请求转换为常规的请求参数,以便能够将它们像普通参数一样设置到动作上。3. 工作流程拦截器:o) workflow拦截器:它与动作协作,提供数据验证以及验证错误发生时改变后续工作流程的功能。p) validation拦截器:是Struts2验证框架的一部分,提供了声明性的方式(XML或注解)验证你的数据。q) prepare拦截器:该拦截器执行时,它在动作上查找pr
18、epare( )方法。实际上是检查动作是否实现了Prepareable接口。r) modelDriven拦截器:通过将模型(而不是Action)放在ValueStack上从而改变工作流。在不使用该拦截器时,参数会被params拦截器直接转移到动作上。4. 其它拦截器:s) exception拦截器:defaultStack栈中的第一个拦截器,exception拦截器捕获异常,并且根据类型将它们映射到用户自定义的错误里面。t) token和tokenSession拦截器:通过检查请求中唯一的令牌是否有效,可以避免表单重复提交。u) scopeModelDriven拦截器:为动作的模型对象提供跨请
19、求的向导式的持久性。例如允许将模型对象存储到会话作用域。v) execAnWait拦截器:用于处理长时间请求,并给于用户一些反馈信息。w) i18n拦截器:用于支持国际化应用。x) conversionError拦截器:在请求数据转移到动作属性上时,数据类型转换错误被存储到ActionContext中。5. 可以将多个拦截器组合在一起从而形成拦截器栈,拦截器栈又可以组合成一个更大的拦截器栈,可将拦截器栈看成一个大的拦截器,通过这样的组合出来的拦截器栈能更加灵活同时可以满足不同的功能需求。如框架中的struts-default.xml文件中的默认拦截器栈。6. 自定义拦截器的两种实现方式:y)
20、实现接口:com.opensymphony.xwork2.interceptor.Interceptor接口。zz) (推荐使用方式)继承:com.opensymphony.xwork2.interceptor.AbstractInterceptor类。五、 ActionInvocation:总指挥a) 框架不直接调用动作的execute( )或其它动作方法,而是创建一个ActionInvocation对象,通过ActionInvocation对象调用Action的动作方法。ActionInvocation封装了动作和一系列被配置在Action之前或之后触发的拦截器。这些拦截器会按照递归的方式
21、进行调用。b) ActionInvocation封装了与特定动作执行相关的所有处理细节(如拦截器、result等)。当框架收到一请求时,它首先必须决定这个URL映射到哪个动作。这个动作的一个实例被加入到一个新创建的ActionInvocation实例中。接着,框架咨询XML配置文件,以发现哪些拦截器应该触发,及按照什么样的顺序触发。指向这些拦截器的引用被加入到ActionInvocation中。除了这些核心元素,ActionInvocation也拥有对其它重要信息(如:Servlet请求、Result结果映射)的引用。六、ActionContext和OGNL:2) ActionContext(
22、Action上下文):a) ActionContext包含了框架的请求处理过程可以访问的所有数据,包含内容从应用程序数据到会话作用域或者应用程序作用域的映射。所有特定应用程序的数据(例如Action公开的属性),都存储在ValueStack上,ValueStack是ActionContext 中的一个对象。b) ActionContext是OGNL在其上求值的更广泛的一系列对象(ValueStack,parameters,attr,request,session,application)的容器。在Struts2中,每一个OGNL表达式必须从ActionContext包含的对象中选择初始对象 (
23、默认是ValueStack)进行求值,即一个OGNL表达式必须选择ActionContext中的一个对象作为它的根对象(默认是ValueStack)来求值。c) 黙认情况下,没有明确指定根对象名字的所有OGNL表达式都使用ValueStack作为根对象。3) ActionContext(Action上下文)结构:取HttpServletRequest、HttpSession、ServletContext(application)中的数据时Ognl表达式前都需要加一个#号。c) ValueStack值栈:当Struts2接收到一个请求时,它立即创建一个ActionContext、一个ValueS
24、tack、和一个动作对象。作为应用程序数据的承载者,动作被马上放到ValueStack中,以便框桇可以通过OGNL访问它的属性。d) Ognl表达式语言特点:1) 引用JavaBean属性:user.order.orderName。2) 设置和取得数据(类型转换):。3) 使用List和数组:定义列表:1,3,5;访问:list0, array0;调用方法:list.size( ), list.isEmpty( )。4) 使用Map:定义:#“foo”:”bar”, ”baz”: “whazzit”;#1:”one”, 2:”two”,访问关键字key访问Map的KEY,value访问Map的
25、VALUE。listKey:产生的value。listValue:产生高中的text。5) 过滤与投影(?:所有匹配的元素; :选取第一个匹配的元素; $:选取最后一个匹配的元素):1. 过滤:就是选取集合中元素的部分属性;投影的结果为选取属性的集合。语法:collectionName. ? 表达式。 示例:users.? #this.age 30 this表示当前元素,结果为年龄大于30的用户列表。2. 投影:指获取满足某个条件的结果,通常用来对集合进行过滤。语法:collectionName. 表达式 。 示例:users. #this.username 选取用户列表中所有用户的用户名,结
26、果为一个用户名的列表。6) 算术运算: +, , * , /, %, , =, +, -7) 逻辑运算符:true, false, and, or, not, !, &, |8) 静态方法调用:Struts2.3.X版本后出于安全性的考虑已不支持静态方法调用了,框架默认配置不允许调用静态方法:1. 如要用静态方法调用需将加入到struts.xml配置文件中(struts2.1.x及以下版本可用)。2. 访问java.lang.Math类:。3. 静态方法:包名.类名静态方法名。如:com.lanqiao.vo.Usertest()4. 常量:包名.类名常量。如:com.lanqiao.vo.U
27、serXXX5. 实例方法:对象.方法(参数)。6. 如果一个请求请发经过多个Action处理时,而这两个Action如果具相同名称的属性时:1)基本类型属性同名(包括String):ognl会视为两个Action中的不同属性。2)对象(JavaBean)类型属性同名:ognl会视这两个Action中的Bean属性为同一个Bean对象。七、类型转换和消息处理1) 内置转换器:框架默认情况下支持的类型转换。a) Stringb) boolean/Booleanc) char/Characterd) int/Integere) float/Floatf) long/Longg) double/Do
28、ubleh) date: yyyy-MM-dd,MM/dd/yyyy(2.3.20不支持些格式),是两个默认可自动转换的格式i) 数组和集合(List,Map, Set)2) 集合类型属性的的转换:如果项目使用的是JDK5.0以上版本包括JDK5.0版本,那么可以使用泛型。若使用的是JDK5.0以下版本,则需要作类型转换配置:ActionClass-conversion.properties。a) 泛型集合类型的转换:Struts2框架可根据泛型的类型自动的推断出集合元素的类型并进行相应的类型转换。1. List,Map集合类型不需要:YourActionClass-conversion.properties这样的类型转换配置文件。2. 数组属性的话要先初始化;private String skills = new String10;。3. Action中Set类型集合属性特殊需要创建一个属性文件(ActionClass-conversion.properties)。并有这个属性文件中进行如下配置:a) Set类型属性:#指定Set集合元素类型Element_skillSet=com
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1