STRUTS2.1.8 学习笔记


STRUTS 2.1.8 学习笔 记 2010-5-11 下载完 成 struts2.1.8 完成 jdk + eclipse + tomcat 环境配 置 下载 struts2 学习资 料 2010-5-12 1.HelloWord 实例 web.xml (/*所有请 求经过名 为 struts2 的过滤 器进行请 求的转发 处理等操 作) 基本用 到的 jar 默认 struts.xml 的位置 ,在 SRC 下,而 不是在 WEB-INF 下 默认的过滤器,和2.1.3 之前 (org.apache.Struts2.dispatcher.Fi lterDispatcher) 不同 ,特 注意 。 struts.xml(配置 各请求要 执行的 action) test.jsp HelloWorld.java URL:http://localhost:8080/TEST001/HelloWorld (HelloWorld 在Struts.xml中指 定actionname) 制定执 行的方法 名 Action 可以进 行按模块 进行区分 打包 请求的 名字 请求执 行的类 配置方法执行完毕后要转向的页 面 ,类 似 forward Struts 标签的 配置 ,此处不 需 进行 tld 文件的 导入 ,应该直 接包含 在上述的 jar 文件中 通过请 求返回的 现实内容 Struts.xml 中action 指定 method Struts.xml 中action 指定 resultname 5.14.2010 包 名查 找 Namespace 查找 YN 包中查action Y 执行action N 默认空包中 查action YN 提 示找 不到 包 名分 段截 取 Struts2Struts2Struts2Struts2 要点 笔记( 一) 一、 Struts2主要 几句话 : 1、Struts2是由webwork2发展 来的而 非Struts1,相比Struts1,Struts2编码 规范跟 类似 与webwork2 2、Struts2非侵 入式设 计、 Struts1属于 侵入式 设计 3、Struts1与ServletAPI、strutsAPI紧密 耦合; Struts1则不 4、Struts2利用 拦截器 进行 AOP编程 ,实现 如权限 拦截功 能 5、Struts2提供 了类型 转换器 6、Struts2提供 多种表 现层技 术,如 JSP/Freemarker/Velocity等 7、Struts2的输 入验证 可以对 指定方 法进行 验证, 解决 Struts1之痛 8、Struts2提供 了全局 范围、 包范围 和 Action范围 的国际 化资源 文件管 理实现 二、 Struts2需要 的最少 jar: Struts-core-2.xx.jar Xwork-2.xx.jar Ognl-2.6.x.jar对象 图导航 语言( ObjectGraphNavigationLanguage), Struts2通过 其读写 对象属 性 Freemarker-2.3.x.jar Commons-logging.jar Commons-fileupload.jar 切勿 全选所 以 jar,否 则你会 很痛苦 , Struts2 提供 其他框 架的支 持,所 以依赖 其他 jar、一 些配 置文件 。 三、 环境搭 建三部 曲: 1.找到 开发 Struts2 应用 需要使 用的 jar 文件 2.编写 Struts2 配置 文件 3.在web.xml 中加 入 Struts2MVC 框架 启动配 置 附: 2.1.8 版本 的配置 struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /* 四、 Struts.xml 配置 文件中 包的介 绍 /page/hello.jsp 管理 一组业 务功能 相关的 action,在实 际应用 中把一 组应用 功能相 关的 action 放在 一个包 下 1111.namenamenamename必须 ,其他 包要继 承该包 ,必须 经过该 属性进 行引用 2222.namespacenamespacenamespacenamespace定义 该包的 命名空 间,命 名空间 做为访 问该包 下 action 路径 的一部 分,如 上 action 访问 路径为 : /test/index.action 3.extends默认 继承了 struts-default包, 可使这 个包下 面默认 应用了 struts2一些 新功 能,如 拦截器 等 4.abstract当abstract=”true”则该 包内不 能有 action 五、 Struts2里Action名称 的搜索 顺序 http://localhost:8080/struts2/test/helloworld//配置 可访问 http://localhost:8080/struts2/test/sdf/dsf/as/helloworld//也可 访问 的 在Struts2中, 首先会 按照命 名空间 规则, 先查 /test/sdf/dsf/as这个 命名空 间下有 无 helloworld,没 有此 action后, 会在 /test/sdf/dsf这个 命名空 间查, 以此类 推,直 至 /test下查 到有该 action。还 有一点 ,如果 在 /test下还 是无法 查到该 action,则 会到默 认的 命名空 间( )去 查 六、 Action配置 中各项 默认值 1.如果 没有给 action配置 class,则 默认的 是 ActionSupport 2.如果 没有给 action配置 method,则 默认的 是 execute方法 3.如果 没有给 result配置 name,则 默认的 是 success 例如 :可以 利用各 种默认 项的搭 配,完 成 action转发 Struts1: /WEB-INF/page/employeeAdd.jsp Struts2: /WEB-INF/page/employeeAdd.jsp” 同样 访问 http://localhost:8080/XX/addUI.action就可 访问到 employeeAdd.jsp 七、 Struts2中result常用 的视图 转发类 型( dispatcher(默 认)、 redirect、 redirectAction、plainText) 1.转发 上面已 经介绍 了 2.重 定向 a). /index.jsp b).ognl表达 式,在 struts.xml中获 取 action中的 变量 /index.jsp?username=${username} http://localhost:8080/struts2/redirect.action将重 定向到 如下 URL http://localhost:8080/struts2/index.jsp?username=”action中定 义的值 ” 传中 文时候 请进行 编码: username=URLEncoder.encode(“李显 武 ”,“UTF-8”); 注意 用 get方式 传的中 文,在 页面显 示还需 要解密 : URLDecoder.decode[new String(request.getParameter(“username”).getBytes(“ISO8859-1”), “UTF-8”] 注: actionactionactionaction中要提 供该变量 的 gettergettergettergetter、settersettersettersetter方法 3.重定 向到 action(action在同 一个包 ) /WEB-INF/page/hello.jsp helloworld 当action不在 同一个 包时候 /WEB-INF/page/hello.jsp action名 需要 重定向 的 action所在 的包 4.plainText:显 示原始 文件内 容,例 如:当 我们需 要原样 显示 jsp文件 源代码 的时候 ,我 们可 以使用 此类型 /xxx.jsp UTF-8 八、 在 Struts2中公 用的视 图 /public.jsp 九、 为 Action属性 注入值 /images /WEB-INF/page/message.jsp 从配 置文件 将 value植入 action的属 性,再 用 EL表达 式将 action的属 性值显 示出来 注意 变量的 命名、 getter、setter方法 十、 指定 Struts2处理 的请求 后缀 默认 使用的 是处理 .action的请 求,其 实也可 以通过 常量 ”struts.action.extension”进 行修 改,如 我们可 以配置 Struts2只处 理以 .do为后 缀的请 求路径 : 也可 以指定 处理多 个后缀 请求 value之间 以 ”,”分开 如 :value=”do,action,jhtml” 十一 、细说 常量的 配置 Struts2中常 量可以 在多个 配置文 件中配 ,建议 在 struts.xml中配 置方式 如下: 因为 常量可 以在多 个配置 文件中 进行定 义,所 以我们 需要了 解 struts2加载 常量的 搜索顺 序 : struts-default.xml struts-plugin.xml struts.xml struts.properties web.xml 如果 在多个 文件中 配置了 同一个 常量 ,则后 一个配 置文件 中的常 量值将 会覆盖 前面文 件中配 置的 常量 值 Struts2Struts2Struts2Struts2 要点 笔记( 二) 十二 、 Struts2常量 一览( 常用的 以粗体 显示了 ) struts.configuration 该属 性指定 加载 Struts2配置 文件的 配置文 件管理 器。该 属性的 默认值 是 org.apache.Struts2.config.DefaultConfiguration,这是 Struts2默认 的配置 文 件管 理器。 如果需 要实现 自己的 配置管 理器, 开发者 则可以 实现一 个实现 Configuration接 口的 类,该 类可以 自己加 载 Struts2配置 文件。 struts.locale 指定 Web应用 的默认 Locale。 struts.i18n.encodingstruts.i18n.encodingstruts.i18n.encodingstruts.i18n.encoding 指定 WebWebWebWeb应用的 默认编码 集。该属 性对于处 理中文请 求参数非 常有用, 对于获取 中文请求 参数 值,应 该将该属 性值设置 为 GBKGBKGBKGBK或者 GB2312GB2312GB2312GB2312。 提示: 当设置该 参数为 GBKGBKGBKGBK时,相 当于调用 HttpServletRequestHttpServletRequestHttpServletRequestHttpServletRequest的 setCharacterEncodingsetCharacterEncodingsetCharacterEncodingsetCharacterEncoding方法。 struts.objectFactorystruts.objectFactorystruts.objectFactorystruts.objectFactory 指定 StrutsStrutsStrutsStruts2222默认的 ObjectFactoryObjectFactoryObjectFactoryObjectFactoryBeanBeanBeanBean,该属 性默认值 是 springspringspringspring。 struts.objectFactory.spring.autoWrite 指定 Spring框架 的自动 装配模 式 ,该属 性的默 认值是 name,即默 认根据 Bean的name属性 自动 装配。 struts.objectFactory.spring.useClassCache 该属 性指定 整合 Spring框架 时,是 否缓存 Bean实例 ,该属 性只允 许使用 true和false两 个属 性值, 它的默 认值是 true。通 常不建 议修改 该属性 值。 struts.objectTypeDeterminer 该属 性指定 Struts2的类 型检测 机制, 通常支 持 tiger和notiger两个 属性值 。 struts.multipart.parser 该属 性指定 处理 multipart/form-data的MIME类型 (文件 上传 )请求 的框架 ,该属 性支 持 cos、pell和jakarta等属 性值, 即分别 对应使 用 cos的文 件上传 框架、 pell上传 及 common-fileupload文件 上传框 架。该 属性的 默认值 为 jakarta。 注意 如果需 要使用 cos或者 pell的文 件上传 方式 ,则应 该将对 应的 JAR文件 复制到 Web应用 中。 例如, 使用 cos上传 方式, 则需要 自己下 载 cos框架 的 JAR文件 ,并将 该文件 放 在 WEB-INF/lib路径 下。 struts.multipart.saveDir 该属 性指定 上传文 件的临 时保存 路径, 该属性 的默认 值 是 javax.servlet.context.tempdir。 struts.multipart.maxSizestruts.multipart.maxSizestruts.multipart.maxSizestruts.multipart.maxSize 该属性 指定 StrutsStrutsStrutsStruts 2222文件上 传中整个 请求内容 允许的最 大字节数 。 struts.custom.properties 该属 性指定 Struts2应用 加载用 户自定 义的属 性文件 ,该自 定义属 性文件 指定的 属性不 会覆 盖struts.properties文件 中指定 的属性 。如果 需要加 载多个 自定义 属性文 件 ,多个 自定义 属性 文件的 文件名 以英文 逗号( ,)隔 开。 struts.mapper.class 指定 将 HTTP请求 映射到 指定 Action的映 射器, Struts2提供 了默认 的映射 器: org.apache.struts2.dispatcher.mapper.DefaultActionMapper。默认 映射器 根据 请求 的前缀 与 Action的name属性 完成映 射。 struts.action.extensionstruts.action.extensionstruts.action.extensionstruts.action.extension 该属性 指定需 要StrutsStrutsStrutsStruts 2222 处理的 请求后缀 ,该属性 的默认值 是actionactionactionaction,即所有 匹配 *.actio*.actio*.actio*.actionnnn 的请求 都由 StrutsStrutsStrutsStruts 2222处理 。如果用 户需要指 定多个请 求后缀 ,则多个 后缀之间 以英文逗 号 (,,,,) 隔开。 struts.serve.static 该属 性设置 是否通 过 JAR文件 提供静 态内容 服务 ,该属 性只支 持 true和false属性 值 ,该属 性的 默认属 性值是 true。 struts.serve.static.browserCachestruts.serve.static.browserCachestruts.serve.static.browserCachestruts.serve.static.browserCache 该属性 设置浏览 器是否缓 存静态内 容。当应 用处于开 发阶段时 ,我们希 望每次请 求都获得 服务 器的最 新响应, 则可设置 该属性为 falsefalsefalsefalse,生产 环境下可 以缓存。 struts.enable.DynamicMethodInvocationstruts.enable.DynamicMethodInvocationstruts.enable.DynamicMethodInvocationstruts.enable.DynamicMethodInvocation 该属性 设置 StrutsStrutsStrutsStruts2222是否支 持动态方 法调用, 该属性的 默认值是 truetruetruetrue。如果 需要关闭 动态 方法调 用,则可 设置该属 性为 falsefalsefalsefalse。 struts.enable.SlashesInActionNames 该属 性设置 Struts2是否 允许在 Action名中 使用斜 线,该 属性的 默认值 是 false。如 果开 发者 希望允 许在 Action名中 使用斜 线,则 可设置 该属性 为 true。 struts.tag.altSyntax 该属 性指定 是否允 许在 Struts2标签 中使用 表达式 语法, 因为通 常都需 要在标 签中使 用表达 式语 法,故 此属性 应该设 置为 true,该 属性的 默认值 是 true。 struts.devMode 该属 性设置 Struts2应用 是否使 用开发 模式 。如果 设置该 属性为 true,则可 以在应 用出错 时 显示 更多 、更友 好的出 错提示 。该属 性只接 受true和flase两个 值 ,该属 性的默 认值 是false。 通常 ,应用 在开发 阶段 ,将该 属性设 置为 true,当进 入产品 发布阶 段后 ,则该 属性设 置为 false。 struts.i18n.reload 该属 性设置 是否每 次 HTTP请求 到达时 ,系统 都重新 加载资 源文件 。该属 性默认 值是 false。 在开 发阶段 将该属 性设置 为 true会更 有利于 开发, 但在产 品发布 阶段应 将该属 性设置 为 false。 提示 :开发 阶段将 该属性 设置了 true,将可 以在每 次请求 时都重 新加载 国际化 资源文 件 ,从而 可以 让开发 者看到 实时开 发效果 ;产品 发布阶 段应该 将该属 性设置 为 false,是 为了提 供响应 性能 ,每次 请求都 需要重 新加载 资源文 件会大 大降低 应用的 性能。 struts.ui.themestruts.ui.themestruts.ui.themestruts.ui.theme 该属性 指定视图 标签默认 的视图主 题,该属 性的默认 值是 xhtmlxhtmlxhtmlxhtml。 struts.ui.templateDir 该属 性指定 视图主 题所需 要模板 文件的 位置, 该属性 的默认 值是 template,即 默认加 载 template路径 下的模 板文件 。 struts.ui.templateSuffix 该属 性指定 模板文 件的后 缀 ,该属 性的默 认属性 值是 ftl。该属 性还允 许使用 ftl、vm或jsp, 分别 对应 FreeMarker、Velocity和JSP模板 。 struts.configuration.xml.reloadstruts.configuration.xml.reloadstruts.configuration.xml.reloadstruts.configuration.xml.reload 该属性 设置当 struts.xmlstruts.xmlstruts.xmlstruts.xml文件改 变后,系 统是否自 动重新加 载该文件 。该属性 的默认值 是 falsefalsefalsefalse,开发 阶段很实 用。 struts.velocity.configfile 该属 性指定 Velocity框架 所需的 velocity.properties文件 的位置 。该属 性的默 认值 为 velocity.properties。 struts.velocity.contexts 该属 性指定 Velocity框架 的 Context位置 ,如果 该框架 有多个 Context,则多 个 Context 之间 以英文 逗号( ,)隔 开。 struts.velocity.toolboxlocation 该属 性指定 Velocity框架 的 toolbox的位 置。 struts.url.http.port 该属 性指定 Web应用 所在的 监听端 口。该 属性通 常没有 太大的 用处, 只是当 Struts2需要 生 成URL时( 例如 Url标签 ),该 属性才 提供 Web应用 的默认 端口。 struts.url.https.port 该属 性类似 于 struts.url.http.port属性 的作用 ,区别 是该属 性指定 的是 Web应用 的加密 服务 端口。 struts.url.includeParams 该属 性指定 Struts2生成 URL时是 否包含 请求参 数。该 属性接 受 none、get和all三个 属 性值 ,分别 对应于 不包含 、仅包 含 GET类型 请求参 数和包 含全部 请求参 数。 struts.custom.i18n.resources 该属 性指定 Struts2应用 所需要 的国际 化资源 文件, 如果有 多份国 际化资 源文件 ,则多 个资 源文 件的文 件名以 英文逗 号( ,)隔 开。 struts.dispatcher.parametersWorkaround 对于 某些 JavaEE服务 器,不 支持 HttpServletRequest调用 getParameterMap()方 法,此时 可以设 置该属 性值为 true来解 决该问 题 。该属 性的默 认值是 false。对于 WebLogic、 Orion和OC4J服务 器,通 常应该 设置该 属性为 true。 struts.freemarker.manager.classname 该属 性指定 Struts2使用 的 FreeMarker管理 器。该 属性的 默认值 是 org.apache.struts2.views.freemarker.FreemarkerManager,这 是 Struts2内 建的 FreeMarker管理 器。 struts.freemarker.wrapper.altMap 该属 性只支 持 true和false两个 属性值 ,默认 值是 true。通 常无需 修改该 属性值 。 struts.xslt.nocache 该属 性指定 XSLTResult是否 使用样 式表缓 存。当 应用处 于开发 阶段时 ,该属 性通常 被设置 为true;当 应用处 于产品 使用阶 段时, 该属性 通常被 设置为 false。 struts.configuration.files 该属 性指定 Struts2框架 默认加 载的配 置文件 ,如果 需要指 定默认 加载多 个配置 文件, 则多 个配 置文件 的文件 名之间 以英文 逗号( ,)隔 开。该 属性的 默认值 为 struts- default.xml,struts-plugin.xml,struts.xml,看 到该属 性值, 读者应 该明白 为什 么 Struts2框架 默认加 载 struts.xml文件 了。 Struts2Struts2Struts2Struts2 要点 笔记( 三) 十三 、 Struts2的处 理流程 request—>StrutsPrepareAndExecuteFilter�Interceptor(Struts2内置 的一些 拦 截器 或用户 自定义 拦截器 )�Action(用户 编写的 Action,类 似 Struts1中的 Action)�Result(类似 Struts1中的 forward)�Jsp/Html�response StrutsPrepareAndExccuterFilter是Struts2框架 的核心 控制器 ,它负 责拦截 由 /*指定 的所有 用户请 求,当 用户请 求到达 时,该 Filter 会过 滤用户 的请求 。默认 情况下 ,如果 用户请 求的路 径不带 后缀或 者后缀 以 .action结尾 ,这 时请 求将被 转入 Struts2框架 处理, 否则 Struts2框架 将过滤 该请求 的处理 。当请 求转 入 Struts2框架 处理时 会经过 一系列 的拦截 器 ,然后 再转 到Action。与StrutsStrutsStrutsStruts1111不同 ,StrutsStrutsStrutsStruts2222 对用户 每一次请 求都会创 建一个 ActionActionActionAction,所以 Struts2Struts2Struts2Struts2的ActionActionActionAction是线程 安全的 十四 、 Struts2指定 多个配 置文件 将配 置文件 以模块 进行划 分,然 后通过 include导入 十五 、 Struts2动态 方法调 用 (在Struts2.1版本 文档中 已经不 推荐使 用了 ) 如果 在 action中存 在多个 方法时 ,我们 可以使 用 !+方法 方法名 调用指 定的方 法,如 下: publicclassHelloWorldAction{ privateStringmessage; publicStringgetMessage(){ returnmessage; } publicStringexecute()throwsException{ this.message=“我是 execute方法 ” return“success”; } publicStringother()throwException{ this.message=“我是 other方法 ”; } } 假设 访问上 面的 action的URL路径 为: /struts2/test/helloworld.action 要访 问 action的other方法 ,我们 可以这 样调用 : /struts2/test/helloworld!other.action 如果 不想使 用动态 方法调 用,我 们可以 通过常 量 struts.enable.DynamicMethodInvocation关闭 动态方 法调用 . Struts2使用 通配符 定义 action(官方 推荐 ) /WEB-INF/page/message.jsp 注: a).a).a).a).****通配符 可以添加 多个如 ::::list_*_*_*list_*_*_*list_*_*_*list_*_*_* b).b).b).b).method=method=method=method=””””{1}{1}{1}{1}””””表示取 第一个 **** c).c).c).c).通配符 可以放置 多个地方 如 classclassclassclass、resultresultresultresult中 十六 、 Struts2请求 参数的 接受 以下 两种方 法,当 参数比 较多的 时候, 用第一 种方法 ,将会 发现 action中有 很多 setter、 getter方法 ,这样 不利于 阅读 action,所 以建议 使用第 二种。 a).采用 基本类 型接收 请求参 数 (get/post) 在Action类中 定义与 请求参 数同名 的属性 , Struts2便能 接受请 求参数 并赋值 给同名 属性 : 如: 请求路 径, http://localhost:8080/test/view.action?id=78 publicclassProductAction{ privateIntegerid; //struts2通过 反射技 术调用 与请求 参数同 名的属 性的 setter方法 来获取 请求参 数值 publicvoidsetId(Integerid){ this.id=id; } publicIntegergetId{ returnid; } } b).采用 符合类 型接收 请求参 数 如: 请求路 径, http://localhost:8080/test/view.action?product.id=78 publicclassProductAction{ privateProductproduct; publicvoidsetProduct(Productproduct){ this.product=product; } publicProductgetProduct(){ returnproduct; } } Struts2首先 通过反 射技术 调 用Product的默 认构造 器创 建product对象 然后在 通过反 射技 术调用 product中与 请求参 数同名 的属性 的 setter方法 来获取 请求参 数 十七 、 Struts2有两 种类型 转换器 局部 类型转 换器 /全部 类型转 换器 a).自定 义转换 类型 packagepackagepackagepackagecn.itcast.type.converter; importimportimportimportjava.text.ParseException; importimportimportimportjava.text.SimpleDateFormat; importimportimportimportjava.util.Date; importimportimportimportjava.util.Map; importimportimportimportcom.opensymphony.xwork2.conversion.impl.DefaultTypeConverter; publicclasspublicclasspublicclasspublicclassDateTypeConverterextendsextendsextendsextendsDefaultTypeConverter{ @Override publicpublicpublicpublicObjectconvertValue(Mapcontext,Objectvalue, ClasstoType){ SimpleDateFormatdateFormat=newnewnewnewSimpleDateFormat("yyyyMMdd"); trytrytrytry{ ifififif(toType==Date.classclassclassclass){//当字 符串向 Date类型 转换时 String[]params=(String[])value; //request.getParameterValues() returnreturnreturnreturndateFormat.parse(params[0]); }elseifelseifelseifelseif(toType==String.classclassclassclass){//当Date转换 成字符 串时 Datedate=(Date)value; returnreturnreturnreturndateFormat.format(date); } }catchcatchcatchcatch(ParseExceptione){} returnnullreturnnullreturnnullreturnnull; } } 完成 具体的 双向转 化代码 后,需 要将上 面的类 型注册 为局部 类型转 换器: 在Action类所 有的包 下放置 ActionClassName-conversion.properties文件 , ActionClassName是Action的类 名,后 面的 -conversion.properties是固 定写法 ,对 于本 例而言 ,文件 的名称 应为 HelloWroldAction-conversion.properties。 properties文件 中的内 容为: birthday=cn.itcast.type.converter.DateTypeConverter b).自定 义全局 类型转 换器 将上 面的局 部类型 转换器 注册为 全局类 型转换 器: 在WEB-INF/classes下放 置 xwork-conversion.properties文件 。在properties文 件中 的内容 为: 待转 换的类 型 =类型 转换器 的全类 名 java.util.Date=cn.itcast.conversion.DateConverter 十八 、访问 或添加 request/session/application属性 importjava.util.Arrays; importjavax.servlet.ServletContext; importjavax.servlet.http.HttpServletRequest; importorg.apache.struts2.ServletActionContext; importcom.opensymphony.xwork2.ActionContext; publicclassHelloWorldAction{ publicStringexecute(){ ActionContextctx=ActionContext.getContext(); ctx.getApplication().put("app","应用 范围 ");//往ServletContext里 放入 app ctx.getSession().put("ses","session范围 ");//往session里放 入 ses ctx.put("req","request范围 ");//往request里放 入 req ctx.put("names",Arrays.asList("老张 ","老黎 ","老方 ")); return"message"; } publicStringrsa()throwsException{ HttpServletRequestrequest=ServletActionContext.getRequest(); ServletContextservletContext= ServletActionContext.getServletContext(); request.setAttribute("req","请求 范围属 性 "); request.getSession().setAttribute("ses","会话 范围属 性 "); servletContext.setAttribute("app","应用 范围属 性 "); //HttpServletResponseresponse= ServletActionContext.getResponse(); return"message"; } } 备注 : ognl表达 式其实 完全可 以通过 JSTL、EL结合 来代替 ognl Struts2Struts2Struts2Struts2 要点 笔记( 四) 十九 、文件 上传三 部曲 第一 步、 jar文件 的准备 commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar 第二 步、把 form表的 enctype设置 为: multipart/form-data <%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%> MyJSP'employeeAdd.jsp'startingpage 文件 : 第三 步、在 Action类中 添加以 下属性 注意 : 可以 设置 Struts2的常 量 struts.multipart.maxSize来设 置上传 文件大 小 可以 得到上 传文件 类型 web上传 文件大 小注意 不要太 大,一 般的视 频网站 上传大 文件是 通过通 讯软件 上传的 ,即 socket通讯 多文 件上传 : packagecn.itcast.action; importjava.io.File; importorg.apache.commons.io.FileUtils; importorg.apache.struts2.ServletActionContext; importcom.opensymphony.xwork2.ActionContext; publicclassHelloWorldAction{ privateFile[]image; privateString[]imageFileName; publicFile[]getImage(){ returnimage; } publicvoidsetImage(File[]image){ this.image=image; } publicString[]getImageFileName(){ returnimageFileName; } publicvoidsetImageFileName(String[]imageFileName){ this.imageFileName=imageFileName; } publicStringaddUI(){ return"success"; } publicStringexecute()throwsException{ Stringrealpath= ServletActionContext.getServletContext().getRealPath("/images"); System.out.println(realpath); if(image!=null){ Filesavedir=newFile(realpath); if(!savedir.exists())savedir.mkdirs(); for(inti=0;i 4.一个 action可以 定义多 个拦截 器 拦截 器: packagecn.itcast.interceptor; importcom.opensymphony.xwork2.ActionContext; importcom.opensymphony.xwork2.ActionInvocation; importcom.opensymphony.xwork2.interceptor.Interceptor; publicclassPermissionInterceptorimplementsInterceptor{ publicvoiddestroy(){ } publicvoidinit(){ } publicStringintercept(ActionInvocationinvocation)throwsException{ Objectuser=ActionContext.getContext().getSession().get("user"); if(user!=null)returninvocation.invoke();//如果 user不为 null,代表 用户已 经登录 ,允许 执行 action中的 方法 ActionContext.getContext().put("message","你没 有权限 执行该 操作 "); return"success"; } } 部署 : /WEB-INF/page/message.jsp Struts2Struts2Struts2Struts2 要点 笔记( 五) 二十 一、 Struts2对action中所 有方法 进行输 入校验 在Struts2中, 我们可 以实现 对 action的所 有方法 进行校 验或者 对 action指定 方法进 行校验 对于 输入校 验 struts2提供 了两种 实现方 法: 1.采用 手工编 写代码 实现 重写 validate方法 ,validate方法 会校验 action中所 有与 execute方法 签名相 同的方 法 。当某 个数据 校验失 败 时, 我们应 该调用 addFieldError方法 往系统 的 fieldErrors添加 校验失 败信息 (为了 使用 addFieldError方 法action可以 继承 ActionSupport),如果 系统的 fieldErrors包含 失败信 息 ,struts2将会 请求转 发到 input 的result。在 input视图 中可以 通过 x显示 失败信 息。 action: packagecn.itcast.action; importjava.util.regex.Pattern; importcom.opensymphony.xwork2.ActionContext; importcom.opensymphony.xwork2.ActionSupport; publicclassPersonActionextendsActionSupport{ privateStringusername; privateStringmobile; publicStringgetUsername(){ returnusername; } publicvoidsetUsername(Stringusername){ this.username=username; } publicStringgetMobile(){ returnmobile; } publicvoidsetMobile(Stringmobile){ this.mobile=mobile; } publicStringupdate(){ ActionContext.getContext().put("message","更新 成功 "); return"message"; } publicStringsave(){ ActionContext.getContext().put("message","保存 成功 "); return"message"; } @Override publicvoidvalidate(){//会对 action中的 所有方 法校验 if(this.username==null||"".equals(this.username.trim())){ this.addFieldError("username","用户 名不能 为空 "); } if(this.mobile==null||"".equals(this.mobile.trim())){ this.addFieldError("mobile","手机 号不能 为空 "); }else{ if(!Pattern.compile("^1[358]""d{9}$").matcher(this.mobile).matches()){ this.addFieldError("mobile","手机 号格式 不正确 "); } } } } 配置 : /index.jsp /WEB-INF/page/message.jsp 视图 : <%@pagelanguage="java"pageEncoding="UTF-8"%> <%@tagliburi="/struts-tags"prefix="s"%> 输入 校验 用户 名 :不能 为空
手机 号 :不能 为空 ,并且 要符合 手机号 的格式 1,3/5/8,后 面是 9个数 字
注: 通过 validateXXX方法 实现对 指定方 法的校 验, validateXXX只会 校验 action中方 法名为 XXX的方 法 。 其中 xxx的第 一个字 母要大 写。 输入 校验的 流程: a).类型 转换器 对请求 参数执 行类型 转换, 并把转 换后的 值赋给 action中的 属性 b).如果 在执行 类型转 换的过 程中出 现异常 ,系统 会将异 常信息 保存到 ActionContext,conversionError拦截 器将 异常信 息装到 fieldErrors里, 不管类 型转换 是否出 现异常 ,都会 进入第 三步。 c).系统 通过反 射技术 先调用 action中的 validateXXX方法 , XXX为方 法名 d).在调 用 action中的 validate方法 e).经过 上面 4步,如果 系统中 的 fieldErrors存在 错误信 息 (即存 放错误 信息的 集合 size大于 0),系统 自动将 请求 转发至 名称为 input的视 图 。如果 系统中 的 fieldErrors没有 任何错 误信息 ,系统 将执行 action的处 理方法 。 2.基于 XML配置 文件方 式实现 二十 二、防 止表单 重复提 交 标签 防止重 复提交 第一 步:在 表单中 加入 <%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%> <%@tagliburi="/struts-tags"prefix="s"%> tokentest 姓名 :
第二 步:配 置 token拦截 器 /index.jsp /WEB-INF/page/message.jsp
还剩26页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 20 金币 [ 分享pdf获得金币 ] 2 人已下载

下载pdf

pdf贡献者

hqh3306

贡献于2010-12-30

下载需要 20 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf