1Struts2备课笔记一.什么是struts2?Struts2内部MVC设计模式,企业web开发常用架构设计模式,将web应用程序进行模块划分,分为三个部分:Model模型、View视图、Controller控制器将web程序分为三个部分,便于维护和扩展MVC可以理解为就是表现层模式二.Struts2快速入门(quickStart)下载all-zip包最新2.3.8解压apps:例子docs:文档lib:jar包src:源码需要的具体jar包及其各jar的作用。struts2-core-2.3.1.1.jar:Struts2框架的核心类库xwork-core-2.3.1.1.jar:Command模式框架,WebWork和Struts2都基于xworkognl-3.0.3.jar:对象图导航语言(ObjectGraphNavigationLanguage),struts2框架通过其读写对象的属性freemarker-2.3.18.jar:Struts2的UI标签的模板使用FreeMarker编写commons-logging-1.1.x.jar:ASF出品的日志包,Struts2框架使用这个日志包来支持Log4J和JDK1.4+的日志记录。commons-fileupload-1.2.2.jar:文件上传组件,2.1.6版本后需要加入此文件commons-io-2.0.1.jar:传文件依赖的jar包commons-lang-2.5.jar:对java.lang包的增强快速导入基本jar包的简便方式。我们可以直接使用struts2提供的例子(apps)里面的jar包如下图:解压apps里面的Struts2-blank.war:目录如下:Struts.xml配置情况出现以上问题:解决方案如下:2最终发现:undefinedstruts-default不影响程序的执行,只要联网,那么这个感叹号就会消失。出现状况的原因是:由于web服务器出现问题,由于之前采用分布式部署项目,tomcat端口改动频繁,故而出现问题。Struts.xml配置文件不是齿轮状解决方案。在创建文件的时候引入即可。或者new找到xml找到xml(advancedTemplates)点击next,然后templatetouse选择:XMLtemplateforastruts-config.xmlfile即可。自动引入的。三.Struts2运行流程。1).启动服务器(tomcat)将会自动加载配置文件,加载过程如下:服务器一启动:init()方法被执行,方法如下:3客户端初始化一个指向Servlet容器(WEB容器)的请求;这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:(SiteMeshPlugin)。接着StrutsPrepareAndExecuteFilter被调用,StrutsPrepareAndExecuteFilter询问ActionMapper来决定这个请是否需要调用某个Action。4如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类ActionProxy创建一个ActionInvocation的实例。ActionInvocation实例使用命名模式来调用,在调用Action的过程前5后,涉及到相关拦截器(Intercepter)的调用。拦截器默认执行default-interceptor-refname=defaultStack/defaultStack里面有一些列的interceptor。一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper响应的返回是通过我们在web.xml中配置的过滤器如果ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理threadlocalActionContext;如果ActionContextCleanUp不使用,则将会去清理threadlocals。四.Struts2的常用配置1、配置文件加载顺序default.properties位于struts2-core.jarorg.apache.struts2包中配置常量(框架内部)struts-default.xml位于struts2-core.jar内部配置Bean、结果类型、拦截器(框架内部)struts-plugin.xml位于struts2框架扩展插件包中(每个插件包plugin包中都可以定义)(插件内部)struts.xml建立src下,用户自定义struts配置文件,配置action信息(用户定义)struts.properties建立src下用户自定义struts配置文件,主要定义常量(用户定义,通常不写)web.xml配置核心过滤器时init-param标签设置struts2常量(通常不写)2、Action相关配置action标签必须要配置packagepackage内部定义结果类型result-types、拦截器列表interceptors---------struts-default.xml自定义package,通常extends=struts-default,自定义包要使用框架已经定义好结果类型和拦截器为自定义package指定namespace,用于区别不同package相同Actionname的访问路径Action的访问路径=包名称空间namespace+Actionname属性配置Action默认值packagename=demoextends=struts-default默认namespace=/可以省略actionname=helloclass=...HelloAction默认method=execute自动调用HelloAction的execute方法result/result默认name=success编写name就是success页面配置actionname=index默认class---执行ActionSupport类*default-class-refclass=com.opensymphony.xwork2.ActionSupport/3、相关常量配置6配置struts2常量struts.xmlstruts.propertiesweb.xml主要struts.xmlconstantname=struts.devModevalue=true/name就是常量名字value配置常量值重要常量1)struts.i18n.encoding=UTF-8相当于request.setCharacterEncoding2)struts.action.extension=action,,配置Action匹配请求路径扩展名/hello/hello.action3)struts.serve.static.browserCache=true支持浏览器缓存4)struts.configuration.xml.reload=false改动struts.xml不会自动加载5)struts.devMode=false配置为true启动开发模式###-struts.i18n.reload=true###-struts.configuration.xml.reload=true6)struts.ui.theme=xhtml配置默认视图主题,在后期s:标签生成页面代码时会使用7)#struts.objectFactory=spring默认注释,在struts2整合spring框架时,将Struts2Action创建权交给Spring8)struts.enable.DynamicMethodInvocation=true是否支持动态方法调用,true支持将struts2配置文件拆分为多个includefile=struts-part1.xml/五、Struts2框架Action编写代理模式,控制目标对象访问/hello.action请求时StrutsPrepareAndExecuteFilter的doFilter一定执行1).ActionMappingmapping=prepare.findActionMapping(request,response,true);判断配置文件中有没有对应Action2).ActionProxyproxy=config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(namespace,name,method,extraContext,true,false);根据配置创建代理对象执行时:先执行interceptor的intercept拦截方法,最后指向action的execute1、struts2Action三种写法第一种自定义Action不需要实现任何接口,继承任何父类第二种自定义Action实现框架内部提供Action接口使用Action接口中定义逻辑视图常量publicstaticfinalStringSUCCESS=success;------Action业务逻辑执行成功publicstaticfinalStringNONE=none;---------不需要跳转结果页面,手动生成结果数据AJAXpublicstaticfinalStringERROR=error;-------Action执行逻辑发生错误publicstaticfinalStringINPUT=input;-------用户输入数据非法7publicstaticfinalStringLOGIN=login;------没有权限访问第三种自定义ActionextendsActionSupport(开发最常用推荐)*表单数据合法性校验*错误信息封装*国际化信息的读取2、Action中方法调用如果配置action元素时,没有指定method属性,默认执行execute,指定method,就会调用指定method方法使用通配符配置Action示例:actionname=user_*class=.....UserActionmethod={1}这里{1}就是前面匹配*内容*用户所有操作,只需要配置一个action元素就可以了*actionname=user_add...动态方法调用语法:xxx.action!方法名例如:product!add.action执行ProductAction中add方法*依赖Struts2常量struts.enable.DynamicMethodInvocation=true该常量决定是否允许使用动态方法调用。3、区分默认Action和默认处理类的区别1)默认Action:指当访问名称空间下,没有找到匹配Action元素,就会执行默认Action--default-action-refname=hello/default-action-ref2)默认处理类,当配置Action时,没有配置class属性,访问Action时,默认处理类就会得到执行default-class-refclass=com.opensymphony.xwork2.ActionSu