动力节点-及源码源代码struts2struts_第1页
动力节点-及源码源代码struts2struts_第2页
动力节点-及源码源代码struts2struts_第3页
动力节点-及源码源代码struts2struts_第4页
动力节点-及源码源代码struts2struts_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 Struts2授课:王勇 流行的MVC框架Struts2纲要Struts2概述Struts2与Struts1的差异掌握Struts2体系结构掌握Struts2开发流程掌握Struts2常用配置 Struts2概述Struts2仍然是一个基于请求驱动的MVC框架Struts2不是Struts1的升级Struts2与Struts1的体系结构差距非常大Struts2采用了另一个MVC框架WebWork的核心设计Struts2是WebWork的一个升级Struts2更加优秀松耦合设计以后会讲到Struts2与Struts1的对比Action类Struts1的Action必须继承Struts2的Act

2、ion可以不继承Action的线程安全Struts1是单例的,存在线程安全问题Struts2是多例的,没有线程安全问题Struts2与Struts1的对比Servlet API依赖Struts1中的Action需要依赖Servlet APIStruts2中的Action可以不用依赖Servlet API可测试性Struts1的Action测试性不好,因为需要容器支持,因为在Action依赖于Servlet APIStruts2的Action测试性好,可以直接写一个单元测试完成,因为Struts2的Action是一个POJO对象Struts2与Struts1的对比ActionForm方面Stru

3、ts1收集数据通常使用ActionForm,而ActionForm还需要继承,使ActionForm的复用率降低,另外项目非常大会建立很多ActionForm给维护带来工作量,但也有好处数据的收集和控制进行了很好的分离Struts2可以不用使用ActionForm来收集数据,直接让Action来收集数据,但也可以采用类似ActionForm的方式来收集数据,Struts2采用了ModelDriven的方式来支持类似Struts1的ActionForm方式,所以Struts2更灵活表达式语言方面Struts1中我们通常使用JSTLStruts2中我们可以使用功能更加强大的表达式语言OGNL(Ob

4、ject Graph Notation Language )Struts2与Struts1的对比类型转换Struts1中对ActionForm的类型转换采用commons-beanutils工具,而定义完成一个转换器,将对所有的ActionForm起作用,而不能针对某个一ActionForm来配置是否使用此类型的转换器Struts2使用OGNL进行类型转换,功能更加强大,转换过程可以针对某个类型进行配置校验Struts1采用覆盖ActionForm中的validate()方法或采用验证框架commons validator来验证Struts2支持使用覆盖validate()方法来完成验证,也支

5、持验证框架XWork来验证Struts2与Struts1的对比Action执行控制Struts1固定不变的Struts2通过拦截器,可以改变执行流程,灵活配置的Struts2架构图Struts2简单执行流程所有请求被Struts2核心控制器FilterDispather拦截根据ActionMapper提供的信息决定如何进行下一步ActionMapper主要依赖Struts2的配置文件struts.xml接下来为每个Action创建Action代理类ActionProxy执行ActionProxy的execute()方法在执行execute()方式时会逐个执行Struts2中的拦截器执行完成拦截

6、器后才会真正执行目标Action目标Action需要返会转向的视图名称ActionProxy取得视图名称对象Result完成转向生成resposne对象完成本次请求Struts2,第一个示例完成一个用户登录的示例登录页面,包含用户名和密码输入域验证用户名和密码等于bjpowernode,转向登录页面否则转向失败页面开发过程在MyEclipse中创建web项目在apache网站上下载Struts2将struts2中相关的依赖包拷贝到WEB-INF/lib目录下,依赖包可以全部拷贝,也可以有选择的拷贝,如只使用Struts2的基本功能只拷贝如下依赖包即可commons-logging-1.0.4.

7、jarfreemarker-2.3.15.jarognl-2.7.3.jarstruts2-core-.jarxwork-core-2.1.6.jarcommons-fileupload-1.2.1.jarStruts2,第一个示例在web.xml文件中配置Struts2的核心控制器FilterDispather,可以参见Struts2下的blank项目,配置如下 struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /* Struts2,第一个示例需要创建的文件Jsp登录页面login.jsp成功页面login_succ

8、ess.jsp失败页面login_failure.jsp创建一个ActionLoginAction.javaStruts2不需要ActionForm将Action配置到struts.xml文件中Struts2,第一个示例login.jspInsert title here用户:密码:Struts2,第一个示例login_success.jspInsert title here $username ,用户登录成功Struts2,第一个示例login_error.jspInsert title here登录失败Struts2,第一个示例LoginAction.javapackage com.bjp

9、owernode.struts2;/* * 登录Action,提供一个方法,缺省方法名叫做execute()没有参数返回值为字符串 * * 关于其他方法名的情况以后会讲到 * author Administrator * */public class LoginAction private String username;private String password;public String getUsername() return username;public void setUsername(String username) this.username = username;publ

10、ic String getPassword() return password;public void setPassword(String password) this.password = password; public String execute() throws Exception if (bjpowernode.equals(username) & bjpowernode.equals(password) return “success; else return “error; Struts2,第一个示例struts.xml/login_success.jsp/login_err

11、or.jspStrut2拦截器Struts2引入了拦截器拦截器是AOP的一种体现方式使用拦截器对代码没有侵入性使用拦截器可以动态的增加或减少功能使用拦截器使软件设计耦合度更加松散Struts2中Action的生命周期如下:Struts2主要拦截器拦截器所在包erceptor拦截器名称对应的类作用autowiringActionAutowiringInterceptor与spring集成时,Struts2可以自动访问Spring IoC中的BeanconversionErrorStrutsConversionErrorInterceptor负责类型转换错误cookieCookieIntercep

12、tor负责cookie处理createSessionCreateSessionInterceptor创建HttpSession对象debuggingDebuggingInterceptor在开发模式下该拦截器会提供更多的调试信息exceptionExceptionMappingInterceptor负责异常的处理fileUploadFileUploadInterceptor负责文件上传i18nI18nInterceptor负责国际化loggerLoggingInterceptor负责Action的日志记录Struts2主要拦截器拦截器名称对应的类作用modelDrivenModelDriven

13、Interceptor用于模型驱动的拦截器paramsParametersInterceptor将表单中的参数设置到Action属性上scopeScopeInterceptor将Action的状态设置到HttpSession或ServletContextservletConfigServletConfigInterceptor通过此拦截器让Action可以直接访问Serlet APItimerTimerInterceptor输出Action的执行时间tokenTokenInterceptor检查Action中的Token,防止重复提交workflowDefaultWorkflowInterce

14、ptor负责调用Action中的validate方法自定义拦截器的实现Struts2提供了非常多的拦截器,通常情况下可以满足我们的项目需求Struts2的拦截器提供了相应的扩展机制,我们可以实现自己的拦截器在Action执行前记录日志、在Action执行前进行安全性检查等主要开发步骤实现Intercepter接口或继承AbstractInterceptor抽象类将实现的拦截器配置到struts.xml文件中日志记录拦截器MyLogInterceptor权限检查拦截器MySecurityInterceptor拦截器栈,是多个拦截器的集合如果为某个Action指定了拦截器,那么Struts2的默认

15、拦截器将会失效,必须显示的再次调用系统默认的拦截器如果所有Action都需要使用相同的拦截器,那么如何做呢?定义默认拦截器package和namespaceStruts2采用package来管理Action和拦截器,每个package中可以放多个Action和拦截器,struts配置文件中的package可以理解为java中的package,主要为了统一管理package标签主要涉及的属性name,包的名字,必填项,可以是任何合法的名称extends,此属性可选,指可以继承其他包,这个继承和java中的继承是一样的,指继承其他包相关的定义(Action定义、拦截器定义)被继承的为父packag

16、e,父package的定义必须在子package的前面namespace,此属性可选,默认为“”,定义包的命名空间,命名空间相当目录,如果有相同的Action就可以放到不同的目录里,如果一个Action没有命名空间那么它的访问方式直接就是action的名称,如登录示例访问方式为login.action,如加入了命名空间,访问方式为命名空间+action,如命名空间为user,那么访问url为user/login.action常用配置项介绍Struts2包含两个配置文件一个是struts.xml,这是我们用到的,另外struts2还有一个perties配置文件,该配置文件中包含了struts2框

17、架中常用的属性,我们可以通过将属性配置到perties文件来满足我们开发的需求,最后将perties文件拷贝到classpath路径下即可,perties具体属性可以参见struts2的帮助文档docstrutsproperties.html常用配置项介绍struts.devMode,此配置项可以取值为true和false,默认为false,在开发阶段建议设置为true,这样struts2会给出更加全面友好的提示,但系统运行阶段最好设置为falsestruts.configuration.xml.reload,此配置项可以取值为true和false,默认为false,建议开发阶段设置为true

18、,这样当修改了struts.xml配置文件struts2会立即加载,会给开发带来便利性,但系统运行阶段最好设置为false常用配置项介绍常用配置项介绍struts.i18n.reload,此配置项可以取值为true和false,默认为false,建议开发阶段设置为true,这样在修改了国际化资源文件后会马上加载,但系统运行阶段最好设置为falsestruts.i18n.encoding,此配置项主要设置编码集,默认为UTF-8,可以改变此配置为GB18030、GBK或GB2312,相当在请求时调用了HttpServletRequest的setCharacterEncoding方法另外:如果不喜

19、欢使用perties文件,也可以将配置项放到struts.xml文件中,采用标签,如:,perties配置文件主要是为了和WebWork兼容,所以一般建议配置项都放到struts.xml文件中Struts2对团队开发的支持、 Action和ModelDriven接口Struts2支持多个配置文件在团队开发过程中如果同时修改一个配置文件,势必造成一些修改冲突Struts2可以使用多个配置文件来解决团多来发的修改冲突,因为分解为多个配置文件给维护也带来了方便性Action接口Struts2为了规范开发提供了一个Action接口,此接口中定义了一些常量,这样会使开发更加规范,见示例ModelDriv

20、en接口在Struts1中有ActionForm的概念,采用ActionForm收集页面的数据,在Struts2中也提供了类似的功能,使用此功能必须实现ModelDriven接口,使用Struts2开发很少会使用此功能,也就是模型驱动方式,因为此方式需要建立多余的类,这样会增加维护量,通常采用在Action中提供getter和setter方法,也就是属性驱动方式来收集数据,见示例Struts2中的Action如何访问Servlet API因为Struts2的Action没有和Servlet API紧密耦合,这样会提高可测试性,使Struts2中Action成为了一个真正的POJO但如何来访问S

21、ervlet API呢?可以通过ActionContext,常用方法Object get(Object key),相当于request.getAttribute(String key)Map getApplication(),模拟ServletContext对象Map getParameters(),取得所有的请求参数,同request.getParameterMap()Map getSession(),模拟HttpSession对象Action getContext(),返会ActionContext实例Struts2中的Action如何访问Servlet API可以通过如下接口访问Serv

22、letContextAware,实现此接口可访问ServletContextServletRequestAware,实现此接口可访问HttpServletRequestServletResponseAware,实现此接口可访问HttpServletResponse也可以直接使用ServletActionContext直接访问Servlet API可以不用接口,ServletActionContext提供了一些静态方法static PageContext getPageContext(),得到PageContextstatic HttpServletRequest getRequest(),得到

23、HttpServletRequeststatic HttpServletResposne getResponse(),得到HttpServletResponsestatic ServletContext getServletContext(),得到ServletContext处理结果类型Struts2支持的处理结果类型chaindispatcherfreemarkerhttpheaderredirectredirect-actionstreamvelocityxsltplaintext参见:docsresult-types.html处理结果类型局部结果类型,局部结果类型只能被当前的Action

24、访问全局结果类型,全局结果类型可以被所有的Action访问注:和Strut1中的局部ActonForward全局ActionForward是一个意思默认ActionStruts2的类型转换器为什么需要类型转换器,因为从表单提交过去的数据都是字符串,而Java是强类型的,所以需要提供相应的机制将字符串转换成相应的类型,这样会给开发带来方便性Struts2的类型转换器不同Struts1Struts1的类型转换器采用commons-beanUtils工具包Struts2的类型转换器采用OGNL实现所有的MVC框架通常都会提供类型转换机制Struts2的类型转换器我们该如何实现呢?继承StrutsTypeConverter抽象类重写convertFromString和convertToString方法注册转换器局部类型转换器(MyActionNperties)全局类型转换器(perties)采用JDK1.5注解Struts2对文件上传的支持Struts2上传默认采用commons-fileu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论