struts2笔记
- 格式:ppt
- 大小:529.50 KB
- 文档页数:49
一、准备工作及实例1.解压struts-2.1.6-all.zipapps目录:struts2自带的例子程序docs目录:官方文档。
lib 目录:存放所有jar文件。
Src 目录:源文件存放地2.六个基本包struts2-core-2.1.6.jar :开发的核心类库freemarker-2.3.13.jar :struts2的UI标签的模板使用freemarker编写commons-logging-1.0.4.jar :日志包ognl-2.6.11.jar :对象图导航语言,通过它来读写对象属性xwork-2.1.2.jar :xwork类库,struts2在其上进行构建commons-fileupload-1.2.1.jar:文件上传组件,2.1.6版本后必须加入此jar包特别需要说明的是目前strust2的最新版本是struts-2.1.6,它作为2.1X的正式版。
特别要注意导入commons-fileupload-1.2.1.jar包,在此jar包中包含了RequestContext类,如果不导入该jar包将会报异常。
3.初识struts2配置文件(1).web.xml文件主要完成对StrutsPrepareAndExecuteFilter的配置(在以前的版本中是对FilterDispatcher配置,新版本同样支持用FilterDispatcher配置),它的实质是一个过滤器,它负责初始化整个Struts框架并且处理所有的请求。
这个过滤器可以包括一些初始化参数,有的参数指定了要加载哪些额外的xml 配置文件,还有的会影响struts框架的行为。
除了StrutsPrepareAndExecuteFilter外,Struts还提供了一个ActionContexCleanUp类,它的主要任务是当有其它一些过滤器要访问一个初始化好了的struts框架的时候,负责处理一些特殊的清除任务。
(2).struts.xml文件框架的核心配置文件就是这个默认的struts.xml文件,在这个默认的配置文件里面我们可以根据需要再包括其它一些配置文件。
Struts2项目的构建与配置 (2)1. 配置struts.xml (2)2. 配置web.xml (2)3. 配置Struts2的jar包 (2)Struts.xml的配置 (2)1. <package>的属性与配置 (2)2. <action>的属性与配置 (3)3. <result>的属性与配置 (5)4. <include>的属性与配置 (6)5. <constant>配置struts.properties (6)6. <exception-mapping>与<global-exception-mapping> (6)7. <default-class-ref> (6)8. <default-action-ref> (6)9. <default-interceptor-ref> (7)10. <interceptors> (7)11. <interceptor-ref> (7)12. <global-results> (7)Struts的常见问题 (7)1. 超链接路径问题的说明 (7)2. 声明式的异常处理 (8)3. i18n国际化 (8)4. 拦截器 (8)5. 类型转换 (9)OGNL表达式 (10)1. 访问值栈中action的属性 (10)2. 访问方法 (10)3. 访问集合 (11)4. 投影(过滤的作用) (11)5. 使用“[]”访问元素 (11)Struts2的标签 (11)1. $、#、%的区别 (11)2. 控制标签 (11)3. 数据输出标签 (12)4. 通用标签 (13)5. HTML非表单标签 (13)6. HTML表单标签(很少用) (14)7. AJAX标签(很少用) (15)作者:李志伟编写完成时间:2013-11-21Struts2项目的构建与配置1.配置struts.xml(1)struts.xml文件位置:在项目的src目录下创建该文件,并配置。
1.包头的设置name是struts的包,与Java的包名效果类似,但不是按项目中SRC中包名设置的。
namescape是该包的命名空间。
将作为访问该报Action的路径的一部分。
默认命名空间为namescape=””;假设form 表单提交给helloworld的action ,其action=”/test/helloworld”exctends是表示该包继承的其他包struts_default是任何包都必须继承的包。
否则无法使用struts的核心功能,比如参数上传到action,文件上传,数据校验等。
abstract=”true”定义为抽象包,不得包含Action。
2.action的查找顺序(1)寻找namespace为path1/path2/path3/的包,有这个包:寻找test的Action有这个action:执行没有这个action:寻找namespace为””的命名空间(默认命名空间)是否有这action,没有的话提示找不到action没有这个包:寻找namespace为path1/path2/的包重复(1)步骤。
3.action的默认属性4.Action中各种result的转发类型dispatcher(默认类型)redirect(重定向)redirectAction (重定向到新的Action)plainText (显示原始文件内容)result转发还可包含参数,该参数取自Action中的属性。
例:<action name=”login” class=”xxxx.xxx.xxx.sdsds”><result name=”sucess”> /aaa.jsp?username=${ssss}</result></action>其中ssss是login这个Action中所必须具有的属性redirect书写格式1.<result name=”sucess” type=”redirectAction”>login</result>该写法只能访问位于同一包中的Action;2. <result name=”sucess” type=”redirectAction”><parma name=”actionname”>login</parama><parma name=”namespace”>/xxxxx</parama></result>该写法可访问位于其他包的ActionplainText书写格式1.<result type=”plainText”>/login.jsp</result>2. <result type=” plainText”><parma name=”location”>/login.jsp</parama><parma name=”charSet”>UTF-8</parama></result>全局转发只能在包内定义全局转发。
Struts2 框架第一天今天重点内容:1、什么是Struts2框架?框架特性分析2、struts2 快速入门(分析struts2 运行原理)3、struts2 常用配置4、如何访问Struts2 Action (Servlet)5、Struts2 结果集使用(响应跳转/ajax)1.Struts2 框架概述1.1.什么是struts2Struts2 框架问题:什么是框架?为什么要学习框架?框架是一些已经写好代码,通常和具体业务无关(可以看成:软件的半成品)学习框架,提高开发效率,简化开发(应用框架,实现代码代码开发实现开发标准化)javaEE三层结构在web阶段DAO模式符合JA V AEE三层结构的三层结构出自JavaEE规范(体系结构图)表现层⏹业务层⏹持久层/集成层Struts2 是一个表现层框架(简化表现层代码开发)分层开发:代码结构更加清晰,为了更好维护和扩展1.2.struts2 由来由两个框架优点合并后发展而来(struts1 + webwork)历史由来:Java兴起98年(最早进行java开发分方向j2se 、j2ee、j2me )J2EE 企业级应用软件开发2000 年左右出现struts1 (几乎所有开发人员都在用)随着互联网的发展struts1 设计慢慢开始存有缺陷和不足Webwork框架的出现该框架的设计思想比struts1 先进的多,例如:引入拦截器机制、ognl 表达式语言Apache 推出struts2 框架,特点: 开发流程类似struts1 ,内部结构类似webwork (struts2 和webwork 源自xwork 命令模式框架)1.3.struts2 开发包结构使用框架,导入jar包课程使用struts-2.3.15.3-all.zip 版本学习apps 使用demo (方便后期快速导入jar包和配置文件)开发中war重命名成zip包解压找到里面的13个核心jar包doc 文档(学习struts2的官方官方规范文档)lib 开发struts2 需要的所有jar包src 源代码开发struts2 没必要导入lib下128个jar包(去struts2_blank.war下方找struts2 最基本jar)将war包改为zip 扩展名,解压缩回顾jar记忆: 核心struts2-core-3.15.3.jar+ xwork-core+ognl (3) 上传(2jar) 日志: 2 jar 字符串lang 1 asm.* 3 jar 处理字节码信息javassist.jar 1 代理相关freemarker 1 jar 图形模板引擎开发strutrs2 基包导入web 工程!1.4.struts2入门理论JavaEE设计模式:前端控制器模式过滤器模式访问如图:前段控制器作用: 请求分发!通过struts.xml配置给指定Actionstruts前端控制器:开发中将所有的重复的代码提前到前端控制器去完成,在Action 中只要写不重复业务处理代码!编写快速入门开发流程说明2.Struts2快速入门案例第一步:在myeclipse 新建web project选择javaee版本,课程优先5.0 ------ myeclipse2014 servlet 版本2.5 采用JDK6 编译器第二步:导入struts2 开发jar包apps/struts2_blank.war/WEB-INF/lib/ 13个jar包asm-* 字节码操作类库(.class文件)commons-fileupload 文件上传依赖commons-iocommons-lang3 对字符串、数据操作公共方法commons-logging Java通用日志接口,依赖日志实现log4j freemarker 模板引擎(struts2标签库,依赖freemarker )javassist 生成代理ognl 表达式语言(比EL强大很多倍)struts2-core 核心jar包xwork-core struts2和webwork依赖命令模式框架2: 配置web.xml3:配置struts.xml 推荐找到2.3.15.jar --> apps 目录:struts-blank自带struts.xml 文件导入!编写HelloAction (类似之前写的Servlet )5 struts.xml 注册action 和请求资源虚拟路径映射!访问该action http://localhost/strut2_day01/hellAction运行流程分析图解:3.分析struts2运行原理Struts2 核心控制器Struts Prepare And Execute Filter (准备和执行)-------- 前端控制器模式查看系统执行默认一组拦截器打开文档: struts2核心jar 内struts-default.xml系统执行前端控制器根据struts-default.xml 配置文件配置默认拦截器栈执行一组拦截器然后再执行目标Action -->execute 方法!请求---执行一堆拦截器组件(业务功能)---- 具体ActionStruts2 可以复用代码功能,基于Interceptor 实现的问题:执行了哪些拦截器?小结原理:1: 通过web.xml 配置前端控制器2: 前端控制器执行一组拦截器通过struts.xml 访问具体action 执行业务方法3: action execute 方法返回字符串结果页面跳转!拦截器组件执行顺序:参考struts-core.jar 提供struts-default.xml 配置文件默认情况下,访问每个Action ,defaultStack 都会执行!每个拦截器都会被调用,一些重复功能,由拦截器去实现的!!!问题: 是否是struts2 开发每一次请求都会执行拦截器?拦截器并不是每次都执行!! 看访问资源的!1: 访问资源目标是一个Action 组件必然会调用拦截器然后执行action ' 2: 如果访问是jsp/html 静态资源前端控制器不会调用默认拦截器栈的!拦截器只针对Action 有效!3.1.配置struts.xml DTD提示struts.xml 引入DTD约束(限制如何配置这个文件)⏹如果电脑可以联网,自动从网上下载DTD,缓存提供提示⏹如果电脑没有联网,在本地配置DTD文件位置,提供本地提示struts-2.3.15.3\src\core\src\main\resources文件struts.xml关闭重新打开有自动提示标签!4.struts2 常用配置文件了解前端控制器在容器启动的时候执行哪些配置文件的加载! 配置文件源码分析流程: 分析StrutsPreparedAndExecuteFilter先加载*.properties 然后再加载*.xml 配置文件properties:配置框架启动一些基本配置信息: 比如: 请求虚拟路径配置乱码配置..... default.properties : 框架加载的默认配置信息其次加载xml 文件: 三个struts-default.xml : 核心包下struts-plugin.xml : struts 和第三方插件整合的时候加载插件配置文件举例: struts-json-plugin.jarstruts2 + json 整合整合第三方插件配置文件.struts.xml: 用户自定义配置文件: 可以重写上述框架配置文件信息以及用户开发相关信息: action exception result .... 小节: 容器一旦启动: 加载xxx.properties 又加载三个xml ...继续加载src 必须名称叫做struts.properties配置文件修改: default.properties 信息4.1.框架配置文件配置文件加载顺序通过源码跟踪执行主要的配置文件哪些?init 容器启动的时候加载配置文件!!跟踪dispatcher.init();配置文件的加载顺序!! 核心defalust.properties [1] struts-default.xml struts-plugins.xml struts.xml [2] struts.properies[3](修改框架默认配置信息)⏹Struts2 常量配置文件⏹default.properties (框架执行加载配置信息) struts-core jar包org.apache.struts2 包下⏹项目默认配置信息!!!⏹Struts2 框架内置核心配置文件struts-core jar包struts-default.xml 拦截器结果集⏹(Bean元素、结果集类型、拦截器… )在struts2框架体系中,package 实现一些配置复用,编写子包继承struts-default⏹Struts2 框架插件配置文件位于每个插件包根目录struts-plugin.xml扩展一些插件配置用户自定义配置因为开发中往往需要更改框架默认配置信息参数⏹在用户项目src目录struts.xml ,推荐使用!进行用户开发相关配置⏹⏹用户也可以添加properties 修改框架默认加载信息!!⏹在用户项目src目录struts.properties ,文件名不能修改!⏹用户自己常量配置文件default.properties 不推荐!⏹在web.xml 配置struts2 常量(更不推荐)规则:后加载配置文件,配置内容,可以覆盖之前加载配置内容!!!开发人员主要采用struts.xml 或者struts.propertiesstruts.properties (只能配置常量)struts.xml 修改struts.xml添加标签<constant name="" value=""></constant>测试通过struts.xml 或者自定义struts.properties 修改框架加载的默认配置信息!! 修改访问路径扩展名struts.action.extension=action,, 改成自己的扩展名4.2.小节配置文件1: default.properties : 框架加载默认配置信息如果用户需要修改推荐: struts.xml 引入<constant 标签name="key"> 2: TranditionXml :struts-default.xml : 定义struts2 大量结果集以及拦截器配置和工厂Bean : 使用默认拦截器和结果集跳转程序员在struts.xml 使用<package extends="struts-default"> 使用struts2 提供结果集和拦截器3: struts-plugin.xml : 整合第三方插件: 如果需要使用第三方插件: 程序员在struts.xml <package extends="xxx插件包名称">4: struts.xml : 定义用户自己的配置信息:4.3.详细分析Action相关映射配置Struts2 提供前端控制器,采用请求分发思想,将不同url请求,分配给不同Action进行处理,需要在struts.xml 配置请求路径和Action 映射关系!问题:struts2 package作用Package可以用来管理Action,实现包内配置复用(通过包继承实现)struts-default.xml 定义一个package包内定义大量结果集类型和拦截器用户开发package 通常继承struts-default 包name属性:包名称,在struts容器具有唯一性(在开发中可以用模块名称作为包名)namespace 属性:名称空间区分重复性举例:如果两个包存在同名Action ,需要名称空间区分action访问路径访问上面Action 应用名称空间http://localhost/struts2_day01/demo2/hello.action4.4.struts2 常量配置在struts2 六种配置文件中,都可以配置struts2 常量,后加载配置文件常量可以对先加载配置文件进行覆盖!常用常量分析1、struts.i18n.encoding=UTF-8相当于request.setCharacterEncoding(“utf-8”); 解决post 请求乱码问题Struts2开发时,无需关注post 乱码问题2、struts.action.extension=action,,Action请求映射路径默认扩展名问题:http://localhost:8080/struts2_day1/hello 也可以访问HelloAction如果请求路径必须以.action结尾3、struts.configuration.xml.reload=true修改struts.xml 配置后,无需重启服务器当设置devMode =true 激活xml自动重新加载4、struts.ui.theme=xhtml设置页面标签显示样式// struts-tag 标签库5、struts.objectFactory=struts负责创建Action对象类6、struts.enable.DynamicMethodInvocation=true // 默认是false访问Action 支持动态方法调用访问action组件可以采用动态调用的方式进行.配置文件分离,在大型项目中,因为如果使用一个配置文件,需要配置很多Action,不方便维护,struts.xml 提供<include> 标签,将配置分离出去5.访问Action5.1.Action 三种书写格式第一种写法,编写自定义Action类,实现Action接口Action 接口提供execute 处理业务逻辑方法1: 实现Action 接口!!struts.xml配置访问: Action http://localhost/struts2_day01/helloAction第二种写法:编写自定义Action 继承ActionSupport 类(间接实现Action接口)ActionSupport 类的特点:源码:添加了更多的接口实现ActionSupport 提供更多功能(数据校验、国际化…)编码:struts.xml 配置注册!注意DTD 约束规范逗号表示标签书写顺序!访问action http://localhost/struts2_day01/helloAction2第三种特殊写法:POJO plain old java object写法domain--->充当Action 场景: 请求封装对象本身就是javaBeanUser --->== Action提供一个execute 方法struts.xml 配置http://localhost:8099/struts2_day01/helloUserPOJO(Plain Old Java Object)简单的Java对象,实际就是普通JavaBeans 小结:5.2.关于Action的业务方法说明5.2.1.通配符的使用1: 访问指定业务方法<action 标签添加method ="对应Action中指定方法名称">配置struts.xml 注意每一个method属性值匹配Action具体的方法名称问题: 如果目标Action 方法业务过多struts.xml 引入多个action 标签重复性很高!如何简化struts.xml 配置??解决方案: 2种简化: 1: 通配符(重点) 2: 动态方法调用(掌握)5.2.2.通过设置method属性,执行Action不同业务方法设置method属性,指定调用Action 组件的对应方法启示:可以在一个Action中编写多个业务方法,在访问时,通过method 区别5.2.3.使用通配符简化路径和Action业务方法映射配置案例1: index.jsp 搭建请求访问Action 编写注意: 星的和占位符{1} {2} struts.xml{1} 对应name中第一个* 匹配的内容--->方法名称演示 2 颗星使用index.jsp 引入多个模块struts.xml 配置可以简化多个模块配置引入2颗星第一颗表示类名第二颗表示方法名称修改请求地址index.jsp测试!通配符完成!5.2.4.动态方法调用动态方法调用,效果类似通配符玩法,无需配置method 属性举例:在新版本struts2 中动态方法调用,默认是关闭的演示动态方法调用:编写:index.jsp注意请求资源地址的路径写法: ! 编写ProductAction配置struts.xml 完成配置最后开启动态方法调用配置查看默认的default.properties默认是关闭的在自己的strut.xml 开启测试完成!5.3.Action访问Servlet 相关API5.3.1.Action与ServletAPI 解耦合方式调用Servlet API doGet(HttpServletRequest, HttpServletReponse)--- Servlet 依赖request和response (代码中直接依赖---- 耦合)Struts2 设计思想与Servlet API 解耦合,编写Action 中不再直接依赖Servlet 任何APIStruts2 提供ActionContext 类(Action 上下文)上下文:与容器相关,获取容器相关对象、信息---- 工具类提供大量间接操作Servlet API (request、response、session、application)方法5.3.2.Action 直接操作Servlet API方式一:接口注入Servlet APIindex.jsp编写入口2:struts.xml 引入其他配置文件信息主文件: struts.xml模块化文件: myservlet.xml注意子文件不能和其他文件包名冲突3: 采用指定接口注入获取对应servlet api 对象。
.Struts2课件1Mvc与servlet1.1 Servlet的优点1、是mvc的基础,其他的框架比如struts1,struts2,webwork都是从servlet基础上发展过来的。
所以掌握servlet是掌握mvc的关键。
2、Servlet把最底层的api暴漏给程序员,使程序员更能清楚的了解mvc的各个特点。
3、程序员可以对servlet进行封装。
Struts2就是从servlet中封装以后得到的结果。
1.2 Servlet的缺点1、每写一个servlet在web.xml中都要做相应的配置。
如果有多很servlet,会导致web.xml内容过于繁多。
2、这样的结构不利于分组开发。
3、在servlet中,doGet方法和doPost方法有HttpServletRequest和HttpServletResponse参数。
这两个参数与容器相关,如果想在servlet中作单元测试,则必须初始化这两个参数。
4、如果一个servlet中有很多个方法,则必须采用传递参数的形式,分解到每一个方法中。
2重构servlet针对servlet以上的特点,我们可以对servlet进行重构,使其开发起来更简单。
更容易,更适合团队协作。
重构的目标:1、只写一个serlvet或者过滤器,我们这里选择过滤器。
2、不用再写任何的servlet,这样在web.xml中写的代码就很少了。
3、原来需要写serlvet,现在改写action。
4、在action中把HttpServletRequest参数和HttpServletResponse参数传递过去。
5、在过滤器中通过java的反射机制调用action。
6、详细过程参照cn.itcast.action包中的内容3Struts2介绍1、struts2是apache组织发明的开源框架。
是struts的第二代产品。
2、struts2是在struts和webwork基础上整合的全新的框架。
Struts2笔记✧S truts.xml中的配置引用struts标签库<%@taglib prefix="s"uri="/struts-tags"%>Bean配置<bean class="" type="" name = "" scope="" static="" optional="">Type:bean的规范通常是某接口来体现;Scope: bean的作用域default、singleton、request、session、thread;Static:表明bean是否是静态注入,当指定了type属性时,该属性不应该指定为true Optional:指定bean是否是一个可选bean,可选属性。
常量配置<constant name="常量名" value="常量值">命名空间配置●当包制定了命名空间时action的路径为命名空间+action名称●如果在命名空间里找不到action系统会在默认的命名空间查找该action●配置跟命名空间namespace="/"包含配置<struts><include file="struts-shop.xml"></struts>Struts2会在struts.xml中配置多个struts配置文件拦截器配置●拦截器定义<intercepters><interceptor name="拦截器名" class="拦截器实现类"><interceptor-stack name="拦截栈名"><interceptor name="拦截器名" ><interceptor name="拦截器名" ></interceptor-stack></intercepters>●Action中使用拦截器<action name="" class=""><result name=""></result><interceptor name="拦截器名" ></action>Jsp页面中显示action属性(<s:property value="属性名称">)Action访问servletAPI●间接访问ActoinContext ac = ActionContext.getContext();●直接访问Action继承ServletActionContext可直接访问ServletAPI动态方法调用①<fomr action="action名称!方法名称.action" method="">②将指定方法名添加事件例:<input type="button" value="注册" onclick="regist()"/>③实现该方法function regist(){targetAction = document.form[0];targetAction .action = "action名称!方法名称.action";targetAction.submit();}④在action中实现该方法配置action中的method●使用通配符<action name="*_*" method ="{2}" class="{1}"><result name=""> /{2}.jsp</reuslt></action>●当请求中能匹配action的元素,则method=“第二个星号的内容”;class=“第一个星号的内容”结果页面为:第二个星号内容.jsp有完全符合URL请求的配置默认的Action(可显示连接视图)<defult-action-ref name="simpleViewResultAction"><action name="simpleViewResultAction" class=""><result name=""> </reuslt></action></defult-action-ref>Struts2支持多种处理结果类型(<result type="*"></result>)◆plintText类型处理结果(显示试图资源的源代码)<param name="location">/webcome.jsp</param><param name="charSet">/webcome.jsp</param> // 这只显示编码方式◆redirect类型处理结果(包括类型:redirectAction)请求参数、属性都会丢失◆动态结果使用通配符:*◆请求参数决定结果<result > ${参数名}.jsp</result>◆全局结果<global-result></global-result>所有的action都有效,现在本action搜索视图结果在搜全局结果。
struts2课堂笔记一、环境配置1、下载struts2所需包()2、解压空项目(apps/struts2-blank)3、复制项目中的web.xml(WEB-INF文件夹中),并修改web.xml起始默认页4、复制项目中lib(WEB-INF文件夹中)下面的所有包5、复制项目中的struts.xml(WEB-INF\classes文件夹中),留下xml的定义头、struts和package标签,其他的全部删除6、配置struts.xml的提示,window-references-xml Calalog-addLocation:struts-2.3.dtd所在路径(struts-2.3.3\src\core\src\main\resources)Key Type:URIKey:/dtds/struts-2.3.dtd7、新建action可以继承ActionSupport类或实现Action接口8、配置struts.xml,package标签中增加action标签,指定name属性(该属性为必填属性,别名的作用),可以指定class属性(class为选填属性,表示别名对应的action类)9、jsp页面可以直接使用上面配置的action的name属性值了(一般使用范围:form的action,a标记的href)二、struts.xml配置1、参考struts-2.3.3\src\core\src\main\resources\struts-2.3.dtd配置2、参考struts-2.3.3\src\core\src\main\resources\struts-default.xml配置result-types:action中结果类型的配置(很少用)interceptors:拦截器定义(下节重点)default-interceptor-ref:声明默认拦截器引用(下节重点)default-action-ref:声明默认actiondefault-class-ref:声明默认的classglobal-results:全局返回结果(常用于登陆或出错了)global-exception-mappings:全局异常处理action:action的配置(此节重点介绍)<action name="..." class="..." method="...">-action中方法名为execute时,此处method可以省略配置<result name="..." type="...">-action返回值为success时,此处name可以省略配置<param name="...">...</param></result></action>type:掌握chain,dispatcher(默认),redirect,redirectAction,stream内部转发(chain,dispatcher)重定向(redirect,redirectAction)跳转页面(dispatcher,redirect)跳转action(chain,redirectAction)三、校验框架校验execute方法(方法执行顺序:validate-execute)1、在action中编写validate方法2、如果验证出错了可以用:this.addFieldError("...","...");或this.addActionError("...");或this.addMessage("...");来增加错误提示3、前台JSP页面可以用<s:filederror filedName="..." />或<s:actionError />或<s:message />或EL表达式(${errors[0].name})4、如果action中增加错误,则action中的execute方法是不会执行的,并且会自动返回input,所有在struts.xml中配置action的时候一定要配置返回结果为input的类型校验自定义方法(方法执行顺序:validate-validateTest-test)1、如自定义方法名为test,则增加validateTest方法实现校验2、其他步骤和上面execute方法的校验一样3、注意事项(自定义校验注意方法名的大小写规范,注意方法的执行顺序)配置校验(action名-validation.xml)参考xwork-core-2.3.3.jar下的com.opensymphony.xwork2.validator.validators下的default.xml文件配置提示(见第1章):struts-2.3.3\src\xwork-core\src\main\resources\xwork-validator-1.0.2.dtd验证器说明required:验证非数字是否非空requiredstring:验证字符串字段是否非空int:验证是否为数字long:验证长数字short:验证短数字double:验证小数date:验证日期email:验证邮箱url:验证URL地址stringlength:验证字符串长度regex:验证正则表达式四、拦截器和Action通配拦截器编写与配置(参考struts-2.3.3\src\core\src\main\resources\struts-default.xml配置)1、拦截器编码新建拦截器类,实现Interceptor接口或继承AbstractInterceptor抽象类2、拦截器的定义在struts.xml中增加<interceptors>标签(参考第2章struts.xml配置)在<interceptors>标签中增加<interceptor name="..." class="...">标签3、拦截器栈的定义在<interceptors>标签中增加<interceptor-stack name="...">标签在<interceptor-stack name="...">标签中添加拦截器的引用(参考第4点)4、拦截器的引用在<action>标签下增加<interceptor-ref name="...">标签引用配置好的拦截器或拦截器栈5、默认拦截器增加<default-interceptor-ref name="...">标签引用拦截器或拦截器栈6、拦截器的执行顺序action中的拦截器-默认拦截器-继承的拦截器7、struts2提供的拦截器defaultStack:struts2提供的拦截器(配置了自定义拦截器之后,一定要把默认的拦截器加上,否则会导致struts2的很多功能无法使用)Action通配(*)配置Action的时候要注意约束规则(包括大小写)<action name="*_*" class="com.zit.action.{1}Action" method="{2}"><result><param name="location">{1}{2}success.jsp</param></result><result name="input"><param name="location">{1}{2}.jsp</param></result></action>提交的action别名:student_addaction类名:com.zit.action.studentActionmethod方法名:add成功页面:studentaddsuccess.jsp失败页面:studentadd.jsp五、OGNLOGNL表达式(<s:debug>标签的应用)1、Value Stack(可以直接访问,例:<s:property value="name" />)2、Action Context(访问时候需要加#号,例:<s:property value="#" />)掌握的三个符号#(1.访问非值栈的内容2.构造Map集合3.投影())%(和javascript中的eval用法类似)$(EL表达式所用)六、标签库需要掌握的标签:<s:property><s:date><s:debug><s:if><s:elseif><s:else><s:iterator><s:form><s:textfiled><s:password><s:hidden><s:radio><s:checkboxlist>七、上传下载上传文件1、编写页面代码参考struts2-core-2.3.3.jar\org.apache.struts2.interceptor\FileUploadInterceptor.class代码<form action="upload" method="post" enctype="multipart/form-data"><input type="file" name="file" /><input type="submit" value="上传" /></form>2、编写Actionpublic class UploadAction extends ActionSupport {//待上传的文件private File file;//文件名,注意命名private String fileFileName;//文件类型,注意命名private String fileContentType;@Overridepublic String execute() throws Exception {//获取项目所在根目录下的upload文件夹String path=ServletActionContext.getServletContext().getRealPath("/upload");//定义输入输出字节流InputStream is=null;OutputStream os=null;try {//指定待上传的文件is=new FileInputStream(file);//指定上传之后存放的路径os=new FileOutputStream(path+"//"+fileFileName);byte[] b=new byte[1024];int len=0;while((len=is.read(b, 0, 1024))>0){os.write(b, 0, len);}} catch (Exception e) {e.printStackTrace();}finally{os.close();is.close();}return SUCCESS;}//省略getter/setter}3、配置struts.xml<action name="upload" class="com.zit.action.UploadAction"><result><param name="location">index.jsp</param></result></action>配置上传文件限制大小(默认2M)参考:struts2-core-2.3.3.jar\org.apache.struts2\default.properties在package标签上面增加<constant name="struts.multipart.maxSize" value="2097152"></constant>,改变value值配置上传文件的临时存储空间<constant name="struts.multipart.saveDir" value="c://temp"></constant>上传文件注意事项:1、前台页面表单一定要修改属性enctype="multipart/form-data"和method="post"2、如果要使用多文件上传,修改上面action代码为数组类型(File[],String[]),下面用循环即可下载文件1、编写页面代码<form action="download" method="post" id="myform"><input type="hidden" name="name" id="myfile" /></form><s:iterator value="list" var="s"><div class="show" onclick="getName('<s:property value="s" />');"><s:property value="s" /></div></s:iterator>function getName(name){var myform=document.getElementById("myform");var myfile=document.getElementById("myfile");myfile.value=name;myform.submit();}2、编写Action代码public class DownLoadFileAction extends ActionSupport {private String name;public InputStream getInputStream() throws Exception{String path=ServletActionContext.getServletContext().getRealPath("/upload");return new FileInputStream(path+"//"+name);}public String getName() throws Exception {//转换编码return URLEncoder.encode(name,"utf-8");}public void setName(String name) { = name;}}3、配置struts.xml参考:struts2-core-2.3.3.jar/org.apache.struts2.dispatcher/StreamResult.class<action name="download" class="com.zit.action.DownLoadFileAction"><result type="stream">//${name}一定要和前台JSP中传递过来的名字保持一致<param name="contentDisposition">attachment;filename=${name}</param>//此参数的名字一定要和Action中的方法名保持一致,如:inputStream,action 中一定要有个方法叫做getInputStream<param name="inputName">inputStream</param></result></action>下载注意事项:1、下载文件编码问题(用post提交请求)2、配置文件和后台action的对应3、下载的时候配置文件中的结果类型要用stream。