struts2数据验证
- 格式:docx
- 大小:52.09 KB
- 文档页数:7
1 Struts2极速表单验证框架使用说明书struts ‐plusStruts enhancement, includes quick form validation, permission mgmt. Struts 框架增强, 包括极速表单验证, 权限管理等.子模块之Struts 2 极速表单验证框架作者: 刘长炯(beansoft@)日期: 2010‐01‐20版本: 0.1修订历史2010‐01‐20 初始版1 Struts2极速表单验证框架使用说明书..................................................................................1 2 Struts 2 极速表单验证框架简介...........................................................................................2 3 项目许可...................................................................................................................................3 4 下载本项目...............................................................................................................................3 5 演示应用...................................................................................................................................4 6 整合步骤step by step...............................................................................................................8 7 验证规则表达式详解.............................................................................................................12 8 和RapidValidation 配合实现前后台一致验证.......................................................................13 9 如何扩展验证规则.................................................................................................................14 10 下一版本开发计划 (17)2 Struts 2 极速表单验证框架简介Struts Plus, Struts + 项目, 计划包含极速表单验证框架, 权限管理等子模块. 目前主要关注于 Struts 2 方面的生产力提高项目, 主要基于注解方式进行增强, 并提供抽象层, 使项目仅仅依赖于 Struts 本身, 而不需要强制您使用某种业务层和数据层框架. 项目的许可采用MIT协议, 您可自由的使用本项目, 但需遵循MIT协议保留本人版权签名及MIT协议本身.本文主要讲述子模块Struts 2 极速表单验证框架(Struts 2 QuickFormValidation).本验证机制基于表达式和注解(Annotation), 验证规则的扩展通过实现验证接口进行.诞生历史:2009年12月18日晚提出框架原理, 并于2009年12月19日晨提出实现思路, 最终框架核心初步完成于2009年12月20日(周日), 2010‐01‐20日整理发布.在项目的开发中, 表单验证需要用去开发者大量的时间, 尤其是为了保证前后台的验证规则一致时, 更是需要大量的人力物力. 虽然Struts 2本身的验证框架可以保证前后台一致, 但在使用和整合方式上, 需要编写大量的Validation XML文件, 费力费时容易出错, 尤其是实际开发中需要反复调整各种验证规则及其组合, 这时就更加困难; 扩展Struts 2的验证框架更是需要比较繁琐的步骤. 针对这些挑战, 笔者试图提供一种简便易用的方式来进行表单验证, 即基于Java注解和验证规则表达式.如下面的代码即可实现如下的验证要求: 1) 用户名不能为空, 最小长度5, 最大长度10, 只能输入英文字母; 2) 年龄字段只能输入数字, 最小值为18, 最大值为100; 验证失败时, 转向input页面并显示出错信息: ${validationErrors}.@FormValidator(input="form_tag", value=",用户名,required min-length-5 max-length-10 validate-alpha;" +"age,年龄,validate-digits min-value-18 max-value-100;") public String form_tag() throws Exception {return SUCCESS;}•最快速的后台表单验证框架•简洁,快速的验证语法•无需编写验证提示信息•错误消息在指定地方显示•支持组合验证•易于扩展•基于标准的Java Annotation添加验证,易于和现有项目的无缝集成•特殊应用场景支持,如:密码确认,结束日期必须大于开始日期•支持前后台一致的验证规则本框架主要是为了和前台基于JavaScript的开源验证框架RapidValidation(/p/rapid‐validation/ )使用统一的验证规则, 最大限度的减少重复的后台验证代码, 使用方式简便, 扩展方便.本框架依赖于:z Struts 2z Java 5或者更高版本3项目许可The MIT LicenseCopyright (c) 2010 刘长炯(beansoft@)Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS INTHE SOFTWARE.4下载本项目您可访问/p/struts‐plus/downloads/list 来获取最新源代码包文件名说明大小struts2-quickvalidation-plugin-1.0-src.jar Struts 2 QuickFormValidation 26.81.0 sources 源码Featured KBstruts2-quickvalidation-plugin-1.0.jar Struts 2 QuickFormValidation1.0 jar Featured 26.8 KBstruts2-quickvalidation-demo.war 演示war包,部署至Tomcat6运行Featured 3.4 MBJavascript_RapidValidation.pdf JavaScript Rapid Validation框架的详细使用及规则说明文档(转载)176KB5演示应用可下载示例应用来体验Struts极速验证框架, 下载地址为:http://struts‐/files/struts2‐quickvalidation‐demo.war . 放入Tomcat后即可查看运行效果. 您可以本demo应用为基础快速的进行开发.本演示包含三个内容:纯后台表单验证前后台一致表单验证(前台验证基于RaplidValidation)前后台一致表单验证(Struts 2 Form 标签)本war包中的唯一的.java文件源码如下:package actions;import com.opensymphony.xwork2.ActionSupport;import common.validation.FormValidator;public class HelloWorldAction extends ActionSupport {// 或者implements Action {@FormValidator(input="form", value=",用户名,required min-length-5 max-length-10 validate-alpha;" +"age,年龄,validate-digits min-value-18 max-value-100;" +"password,密码,required;" +"password2,重复密码,required equals-password-原始密码;" +"email,,validate-email;" +"gender,性别,validate-one-required;" +"ip,,validate-ip;" +"date,生日,validate-date;" +"num1,数字1,validate-number;" +"num2,数字2,validate-number less-than-num1-数字1;" +"float,数字范围,float-range-1-10;" +"address,地址,validate-chinese;" +"zip,邮编,validate-zip;" +"id_num,身份证,validate-id")public String form() throws Exception {return SUCCESS;}@FormValidator(input="form_js", value=",用户名,required min-length-5 max-length-10 validate-alpha;" +"age,年龄,validate-digits min-value-18 max-value-100;" +"password,密码,required;" +"password2,重复密码,required equals-password-原始密码;" +"email,,validate-email;" +"gender,性别,validate-one-required;" +"ip,,validate-ip;" +"date,生日,validate-date;" +"num1,数字1,validate-number;" +"num2,数字2,validate-number less-than-num1-数字1;" +"float,数字范围,float-range-1-10;" +"address,地址,validate-chinese;" +"zip,邮编,validate-zip;" +"id_num,身份证,validate-id")public String form_js() throws Exception {return SUCCESS;}@FormValidator(input="form_tag", value=",用户名,required min-length-5 max-length-10 validate-alpha;" +"age,年龄,validate-digits min-value-18 max-value-100;") public String form_tag() throws Exception {return SUCCESS;}}下面是三个演示的效果:6整合步骤step by step1. 将文件struts2‐quickvalidation‐plugin‐1.0.jar放入Web项目的WEB‐INF/lib目录下;2. 修改您自己的代码的src/struts.xml中的package定义继承自quickValidation;示例代码:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><package name="test" namespace="" extends="quickValidation"> <action name="helloworld" class="actions.HelloWorldAction"> <result name="index">/index.jsp</result><result name="success">/helloworld.jsp</result></action></package></struts>3. 使用注解加入验证规则表达式;在每个需要调用的Action的入口方法处, 加入@FormValidator注解.注解的完整语法如下:@common.validation.FormValidator(input="出错时需要返回的result别名", enabled=true/false, value="表单参数名称1,表单参数中文提示信息1,规则1 规则2…; 表单参数名称2,表单参数中文提示信息2,规则1 规则2…;更多字段验证信息")input参数: 可选. 如果不指定, 则出错时仍然继续进入到Action方法中; 如果指定, 则在表单验证出错时, 返回到给定的result中, 例如: 原始表单输入页面或者统一的错误输出页面; enabled参数: 可选. 是否启用此验证规则, 如果不指定, 则忽略解析注解, 不进行任何验证; value参数: 必填选项, 可输入一个或者多个表单参数验证规则. 简单说就是: [字段1验证配置];[字段2验证配置];…. 虽然不建议, 然而字段验证配置可以留空, 此时不会进行任何验证处理.而每个验证配置的格式如下:表单参数名称: 必填选项. 指向输入的表单控件的名称(input的name);表单参数中文提示信息: 可选. 如果为空, 则和表单参数名称相同. 不为空时, 则显示在出错时的信息提示的开头位置;规则1 规则2…: 可选. 理论上可加入任意多个验证规则, 以单个空格隔开. 在验证开始后, 依次进行每个规则的验证并加入提示信息. 需要注意的是, 除required规则之外的所有规则只有当用户输入的字段值非空时, 才进行有效性验证, 如此便可避免所有字段都成为必填字段的问题发生.每个规则本身则由两部分组成: 规则名‐规则子名‐参数1‐参数2‐参数3‐….规则名和规则子名是固定名称, 不能任意填写, 这两个名称对应一个具体的规则实现类.其中参数是必填选项, 参数的意义则需要参考下一节的验证规则表达式中的说明. 下面举例说明若干验证规则:required 这是特殊规则, 不带规则子名, 也没有额外的参数;float‐range‐1‐20 其中float‐range分别是规则名和规则子名, 而1和20则分别是两个参数. 特别需要注意的是有负数时的情况此时参数列表变为: float-range--1--20, 此时参数值分别为‐1和‐20.如果需要给另一字段加入验证规则, 则以分号隔开.下面是若干验证的示例及其解释:规则 解释@FormValidator 空的验证规则, 不进行任何操作@FormValidator("username,用户名,required min‐length‐5") 对username字段进行验证, 规则为必填, 最小长度为5; 出错时分别提示:用户名不能为空用户名的长度不能小于5, 当前长度为1.由于没有指定input参数, 所以当验证失败时, 仍然会继续进入到业务逻辑处理, 相关的错误信息则存入request 的attribute中.@FormValidator("username, ,required min‐length‐5")由于没有指定字段的中文提示, 因此出错时将提示:username的长度不能小于5, 当前长度为1.@FormValidator(input="index",value=" username,用户名,required min‐length‐5”) 这大概是最常用格式的验证规则的写法了. 此例和上例的区别为: 所以当验证失败时, 将进入input参数所指定的出错信息显示页面.@FormValidator(input="index",enabled=false,value=" username,用户名,required min‐length‐5”) 忽略所有验证规则处理, 常用于调试阶段.@FormValidator(input="index",value=" username,用户名,required min‐length‐5;password2,重复密码,required equals‐password‐原始密码;”) 此规则加入了对重复密码字段的验证, 出错时将提示:重复密码和原始密码的输入不一致@FormValidator(input="index",value="username,用户名,required min‐length‐5;password2,重复密码,required equals‐password;”) 此规则省略了另一字段的中文描述, 出错时将提示:重复密码和前面的输入不一致以下为一个完整的Action类示例代码:import com.opensymphony.xwork2.ActionSupport;import common.validation.FormValidator;public class HelloWorldAction extends ActionSupport {@FormValidator(input="index", value="username,用户名,requiredmin-length-5 max-length-10 validate-alpha;" +"age,年龄,validate-digits min-value-18max-value-100;password,密码,required;" +"password2,重复密码,required equals-password-原始密码;" +"gender,性别, validate-one-required")public String execute() throws Exception {return SUCCESS;}}4. 修改前台显示验证结果.根据Action的不同, 前台的显示划分为两类:普通的错误显示:所有错误信息: ${validationErrors}返回的内容是一个字符串, 显示了所有的出错信息, 而出错字体的颜色则需要用户自己去设置.出错信息的显示格式是以<br>分开的, 例如:用户名不能为空<br>密码不能为空<br>重复密码不能为空<br>性别必须至少选中一项<br>另一种推荐的做法是让Action继承自Struts2中的ActionSupport, 此时则可用Struts 2的标签来显示出错信息, 可定位到具体的字段:<%@ taglib prefix="s" uri="/struts-tags" %><s:actionerror /><s:fielderror/><s:form action="helloworld.action" method="post"><s:textfield name="username" label="用户名" /><s:password name="password" label="密码" /><s:submit/></s:form>或者使用纯JSP来编写页面来定位到单条错误:用户名: <input name=username value=${ername}> ${ername[0]}下面给出这两种写法的完整示例:<%@ page pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags" %><html><head><style>.errorMessage {color:red;}.errorLabel {font-weight:bold}</style><title>测试页面</title></head><body><s:actionerror /><form action="helloworld.action" method=postenctype="multipart/form-data">用户名: <input name=username value=${ername}>${ername[0]} <br>年龄: <input name=age value=${param.age}><br>密码: <input name=password><br>密码重复: <input name=password2><br>邮件: <input name=email><br>性别: <input type=checkbox name=a>男<input type=checkbox name=a>女<br> IP地址: <input name=ip><br>数字1: <input name=num1>数字2: <input name=num2><br>日期:<input name=date><br>附件: <input name=file type=file><br><input type=submit value="提交"></form><span class="errorMessage">${validationErrors}</span>Struts 2表单标签示例:<s:fielderror/><s:form action="helloworld.action" method="post"><s:textfield name="username" label="用户名" /><s:password name="password" label="密码" /><s:submit/></s:form></body></html>7验证规则表达式详解说明: 加红色背景的部分是目前尚不支持的验证规则; 加黄色背景的是增加了第二个可选参数的规则(和前台验证规则略有变动).验证表达式 描述 示例 required 非空域,全部空格也算空validate-number 一个有效数validate-digits 只能包含0-9任意个数字validate-alpha 只能是字母a-z, A-Zvalidate-alphanum 只能是字母和数字的组合validate-email 只能是有效的emailvalidate-url 只能是有效的url地址validate-one-required 至少有一个被选中,例如一组checkbox, radiobutton,它们最好包含在一个div和span中validate-integer 只能是整数,可以有正负号validate-ip 有效的IP地址min-length-$number 最小长度是$number (此处$some表示一个特定的值)最小长度为8: min-length-8max-length-$number 最大长度是$number 最大长度为8:max-length-8 max-value-$number 输入域的最大值是$number 最大值为8.1:max-value-8.1 min-value-$number 输入域的最小值是$number 最大值为-8.1:max-value--8.1equals-$otherInputId-$othe rInputLabel 必须和某个input field相等,用于密码两次输入验证等,$otherInputLabel是可选项,用来描述另一字段信息equals-password重复密码和原始密码输入不一致:equals-password-原始密码less-than-$otherInputId-$o therInputLabel 小于某个input fieldless-than-otherInputId,多用于结束日期不能小于开始日期的需求,$otherInputLabel是可注:相等时也不能通过选项,用来描述另一字段信息great-than-$otherInputId-$ otherInputLabel 大于某个input fieldless-than-otherInputId,$o therInputLabel是可选项,用来描述另一字段信息validate-date-$dateFormat 只能是日期,$dateFormat为日期格式,$dateFormat的可选,默认格式为yyyy-MM-DD validate-date-yyyy年MM月dd 日validate-file-$type1-$type 2-$typeX 验证文件输入域选择的文件类型只能为声明的$type1 –$typeX中的一种validate-file-png-jpegfloat-range-$minValue-$max Value 必须是$minValue到$maxValue的一个浮点数1至20:float-range-1-20int-range-$minValue-$maxVa lue 必须是$minValue到$maxValue的一个整数length-range-$minLength-$m axLength 输入字符串的长度必须在$minLength到$maxLength之间validate-pattern-$RegExp 通过自定义正则表达式$RegExp来验证输入域的正确性 vaidate-patter n-/a/givalidate-chinese 只能是中文(以下为中国的相关验证)validate-phone 有效的电话validate-mobile-phone 有效的手机号validate-id-number 验证是否有效的身份证号码validate-zip 验证邮政编码validate-qq 验证QQ号码8和RapidValidation配合实现前后台一致验证RapidValidation (/p/rapid‐validation/) 是专注于前台的验证框架, 例如下面的例子:<!-- 为form增加required-validate class,标识需要验证form --><form id='helloworld' action="#" class='required-validate'> helloworld:</br><!--通过class添加验证: required表示不能为空,min-length-15表示最小长度为15 --><textarea name='content' class='requiredmin-length-15'></textarea></br><input type='submit' value='Submit'/><input type='reset' value='Reset'/></form>其对应的后台验证规则为:@FormValidator(input="index",value=" content,helloworld,required min‐length‐15”)请注意比较异同, 不同部分已经以红色粗体进行了区分, 相同部分则以绿色粗体标识.大家可以看到, 两者很容易就实现了一致的前后台验证规则.相关的说明文档请访问: /p/rapid‐framework/wiki/rapid_validation , 另外本项目也提供了一份完整文档的转载, 包含详细的规则说明文档和整合步骤:(http://struts‐/files/Javascript_RapidValidation.pdf ).9如何扩展验证规则要扩展验证只需要实现IValidator即可即可, 并将实现类放入包 common.quickvalid.validators下. 下面是IValidator接口定义:package common.quickvalid.validators;import java.util.Map;/***所有验证器的抽象接口.*@author beansoft*日期:2009-12-20*/public interface IValidator {/***实现验证方法.*@param fieldName字段name*@param fieldDescription出错时的字段描述信息*@param params参数列表<String key, String[] values>表单参数Map *@param args参数列表*@return验证信息,为空时表示没有任何出错信息,通过验证*/public String doValidation(String fieldName, String fieldDescription, Map<String, String[]> params, String... args) ;/***获取验证器本身的参数列表.*@return*/public String[] getArgs();/***设置验证器本身的参数列表*@param args-一个或者多个参数,允许为null*/public void setArgs(String[] args);/***获取原始表达式.*@return*/public String getExpression();/***设置原始表达式,用于日期,正则等验证方式,避免和-号冲突.*@param Expression*/public void setExpression(String expression);}在实践中, 已经提供了几种比较常见的实现类的抽象基类, 它们是:BaseValidator, 抽象的验证器实现, 仅实现了 setter和getter;BaseRegexValidator(继承自BaseValidator), 基于正则表达式验证的基类; BaseTwoNumberValidator(继承自BaseValidator), 提供基于两个数字规则的验证, 可获取两个参数(含‐号).类名有一定规则, 将第一个减号替换为下划线即可, 例如:float-range-$minLength-$maxLength 对应的类名是: length_range.下面则给出一些实现类, 供参考:手机号的验证:package common.quickvalid.validators;/***手机号验证*TODO更多号段的支持?*@author beansoft**/public class validate_mobile extends BaseRegexValidator {@Overridepublic String getMessage() {return"只能输入正确的手机号码,如:138********";}@Overridepublic String getRegEx() {return"(^0?[1][35][0-9]{9}$)";}}数字范围的验证:package common.quickvalid.validators;import java.util.Map;/***表单域取值浮点数验证*@author beansoft**/public class float_range extends BaseTwoNumberValidator {public String doValidation(String fieldName, String fieldDescription,Map<String, String[]> params, String... args) { super.setParams(params);String value = getValue(fieldName);super.parseTwoNumberArgs();//重新分析=args// 非空时进行验证if(value != null && value.length() > 0) {boolean result = false;try {(Double.parseDouble(value) <=resultDouble.parseDouble(args[0])) ||(Double.parseDouble(value) >Double.parseDouble(args[1]));} catch(Exception ex) {return fieldDescription + "的输入值不是有效的数字";}if(result) {return fieldDescription + "的输入值" + value + "应该为" + args[0] + "到" + args[1] + "之间的数字";}}return null;}}10下一版本开发计划z将验证规则表达式解析和执行部分独立出来作为核心引擎z兼容JDK 1.4 并提供独立调用的接口z提供Struts 1下的插件机制z提示文字国际化z增强前台验证, 提供时分秒的验证功能如果您对本项目有兴趣, 欢迎加入.。
简单的数据验证及⾃定义验证规则⽅法⼀: 此⽅法是在Action的execute()⽅法中使⽤super.addFieldError("", "姓名不能为空 !");将验证过后的错误信息保存下来(查源码知道, 保存在Map<List(User)>中), 然后转发到页⾯进⾏验证展⽰.此⽅法的缺点: Action中的代码量会⼤⼤增加!具体实现: 为空验证UserAction.java:// 为空验证if (user.getName() == null || "".equals(user.getName())) {super.addFieldError("", "姓名不能为空 !");flag = false;}if (user.getAge() == null) {super.addFieldError("user.age", "年龄不能为空 !");flag = false;}if (user.getSalary() == null) {super.addFieldError("user.salary", "⼯资不能为空 !");flag = false;}if (user.getDate() == null) {super.addFieldError("user.date", "⽣⽇不能为空 !");flag = false;}struts.xml:package name="user" namespace="/" extends="struts-default"><action name="user" class="erAction"><result>user_show.jsp</result><result name="input">user_insert.jsp</result></action></package>user_insert.jsp:<!-- 说明: value="<s:property value="" />", 添加这个是为了在验证为空过后保留⽤户输⼊的信息 <s:property value="fieldErrors[''][0]" />, 这个是验证的错误信息展⽰--><form action="user.action" method="post">姓名: <input type="text" name="" value="<s:property value="" />" /> <s:property value="fieldErrors[''][0]" /> <br>年龄: <input type="text" name="user.age" value="<s:property value="user.age" />" /> <s:property value="fieldErrors['user.age'][0]" /><br> ⼯资: <input type="text" name="user.salary" value="<s:property value="user.salary" />" /> <s:property value="fieldErrors['user.salary'][0]" /> <br>⽣⽇: <input type="text" name="user.date" value="<s:property value="user.date" />" /> <s:property value="fieldErrors['user.date'][0]" /><br> <br><input type="submit" value="提交" /><input type="reset" value="重置" /></form>测试:⽅法⼆: 使⽤struts2框架提供的validate()⽅法进⾏验证此⽅法是针对在接收数据之后进⾏验证, ⽽如果想要在接收数据之前进⾏验证, 就使⽤验证框架进⾏验证(见⽅法三).在Action中重写validate()⽅法:// 不需要判断标识flag, 此⽅法⼀旦发现有错误, 就⾃动跳转到到input所映射的路径中去,// 如果没有错误, 那么就执⾏return ActionSupport.SUCCESS;@Overridepublic void validate() {// 为空验证if (user.getName() == null || "".equals(user.getName())) {super.addFieldError("", "姓名不能为空 !");}if (user.getAge() == null) {super.addFieldError("user.age", "年龄不能为空 !");}if (user.getSalary() == null) {super.addFieldError("user.salary", "⼯资不能为空 !");}if (user.getDate() == null) {super.addFieldError("user.date", "⽣⽇不能为空 !");}super.validate();}@Overridepublic String execute() throws Exception {// 根据flag结果跳转, 这⾥的代码量变少return ActionSupport.SUCCESS;}测试:⽅法三: 使⽤struts2的框架规则进⾏验证操作从struts2的jar包: \apps\struts2-portlet-2.1.8.1.war\WEB-INF\classes中找到validators.xml⽂件, 此⽂件是struts2的框架验证规则,validators.xml:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator Config 1.0//EN""/xwork/xwork-validator-config-1.0.dtd"><validators><validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/><validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/><validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/><validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/><validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/><validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/><validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/> <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/><validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/><validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/><validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/> </validators>此时UserAction.java中不需要validate()⽅法, UserAction.java:@SuppressWarnings("serial")public class UserAction extends ActionSupport {private User user = new User();@Overridepublic String execute() throws Exception {// 根据flag结果跳转return ActionSupport.SUCCESS;}public User getUser() {return user;}public void setUser(User user) {er = user;}}在与UserAction.java同级包下创建: UserAction-validation.xml找到\apps\struts2-portlet-2.1.8.1.war\WEB-INF\classes\org\apache\struts2\portlet\example⽬录下的FormExample-formExamplePrg-validation.xml⽂件, 拷贝如下内容:<field name="firstName"> <field-validator type="requiredstring"> <message>You must enter a first name</message> </field-validator></field>进⾏修改: 修改之后的UserAction-validation.xml:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator Config 1.0//EN""/xwork/xwork-validator-config-1.0.dtd"><validators> <field name=""> <field-validator type="requiredstring"> <message>姓名不允许为空!</message> </field-validator> </field> <field name="user.age"> <field-validator type="requiredstring"> <message>年龄不允许为空!</message> </field-validator> <field-validator type="int"> <message>年龄必须是整数!</message> </field-validator> </field> <field name="user.salary"> <field-validator type="requiredstring"> <message>⼯资不允许为空!</message> </field-validator> <field-validator type="double"> <message>⼯资必须是数字!</message> </field-validator> </field> <field name="user.date"> <field-validator type="requiredstring"> <message>⽣⽇不允许为空!</message> </field-validator> <field-validator type="date"> <message>⽣⽇必须是⽇期!</message> </field-validator> </field></validators>user_insert.jsp不需要修改:<form action="user.action" method="post">姓名: <input type="text" name="" value="<s:property value="" />" /> <s:property value="fieldErrors[''][0]" /> <br>年龄: <input type="text" name="user.age" value="<s:property value="user.age" />" /> <s:property value="fieldErrors['user.age'][0]" /><br> ⼯资: <input type="text" name="user.salary" value="<s:property value="user.salary" />" /> <s:property value="fieldErrors['user.salary'][0]" /> <br>⽣⽇: <input type="text" name="user.date" value="<s:property value="user.date" />" /> <s:property value="fieldErrors['user.date'][0]" /><br> <br><input type="submit" value="提交" /><input type="reset" value="重置" /></form>测试: 直接保持为空, 提交的结果页⾯, 后台报错:报错信息:Caught exception while loading file org/lxh/struts2demo/action/UserAction-validation.xmlConnection timed out: connect - [unknown location]发现⽂件头的dtd版本不对, 换版本之后:以前的版本:<!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator Config 1.0//EN""/xwork/xwork-validator-config-1.0.dtd">现在的版本:<!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.0.2//EN""/xwork/xwork-validator-1.0.2.dtd">再次测试:填写两个属性, 再测试: 报错了此时要想显⽰⽤户⾃定义的验证错误的信息, 就要针对每⼀个Action定义个*.properties资源⽂件,在UserAction.java的同级包下创建UserAction.properties:注意: 这个资源⽂件的格式要固定写成: invalid.fieldvalue.字段名称 = 内容# 年龄必须是整数er.age = \u5E74\u9F84\u5FC5\u987B\u662F\u6570\u5B57!# ⼯资必须是数字er.salary = \u5DE5\u8D44\u5FC5\u987B\u662F\u6570\u5B57!# ⽣⽇必须是⽇期格式(yyyy-MM-dd)er.date = \u751F\u65E5\u5FC5\u987B\u662F\u65E5\u671F\u683C\u5F0F(yyyy-MM-dd)再次测试: 发现提交不过去了, ⽽且后⾯的提⽰信息根本不对这是struts2.1.8造成的bug, 在struts2.0中不会出现这个问题.范例: 限制输⼊的长度范围修改: UserAction-validation.xml, 把为空验证放在最后, 但还有有问题<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.0.2//EN""/xwork/xwork-validator-1.0.2.dtd"><validators><field name=""><field-validator type="stringlength"><param name="minLength">6</param><param name="maxLength">10</param><message>姓名的长度应该在${minLength}-${maxLength}之间!</message></field-validator><field-validator type="requiredstring"><message>姓名不允许为空!</message></field-validator></field><field name="user.age"><field-validator type="int"><param name="min">1</param><param name="max">250</param><message>年龄必须在${min}-${max}之间!</message></field-validator><field-validator type="requiredstring"><message>年龄不允许为空!</message></field-validator></field><field name="user.salary"><field-validator type="double"><message>⼯资必须是数字!</message></field-validator><field-validator type="requiredstring"><message>⼯资不允许为空!</message></field-validator></field><field name="user.date"><field-validator type="date"><message>⽣⽇必须是⽇期!</message></field-validator><field-validator type="requiredstring"><message>⽣⽇不允许为空!</message></field-validator></field></validators>-----------------------------------------------------------------⾃定义的验证规则:⾃定义的验证规则包含以下⼏个内容:1. 验证规则的操作类;2. 在validators.xml中注册此规则;3. 编写使⽤此规则的验证的资源的配置⽂件: XxxAction-validation.xml 使⽤正则表达式时最⽅便的⼀种做法范例: 验证数字创建包org.lxh.struts2demo.validator, 此包下创建类RegexValidator.java public class RegexValidator extends FieldValidatorSupport {@Overridepublic void validate(Object arg0) throws ValidationException { System.out.println("***********" + arg0); // 做个测试}}修改UserAction-validation.xml:<field name="user.age"><!-- 编写⾃定义的验证规则 --><field-validator type="regex"><message>年龄必须是数字!</message></field-validator><field-validator type="requiredstring"><message>年龄不允许为空!</message></field-validator></field>在src下创建validators.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator Config 1.0//EN""/xwork/xwork-validator-config-1.0.dtd"><validators><validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/><validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/><validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/><validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/><validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/><validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/><validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/> <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/><validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/><validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/><validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/> <!-- 注册⾃定义的验证规则 --><validator name="regex" class="org.lxh.struts2demo.validator.RegexValidator"/></validators>测试: http://localhost:8080/Struts2.1Project/user_insert.jsp, 点提交控制台打印: ***********erAction@5e8fa0ec说明⾃定义的验证规则起作⽤了!继续修改RegexValidator.javaSystem.out.println("***********" + super.getFieldName() + " ---> "+ super.getFieldValue(super.getFieldName(), arg0));1> 保持年龄为空, 提交, 打印: ***********user.age ---> null2> 年龄输⼊20, 提交, 打印: ***********user.age ---> 34说明通过这两个⽅法可以获取属性名和属性值, 继续修改:String fieldName = super.getFieldName();String value = "" + super.getFieldValue(super.getFieldName(), arg0);if (!(value.matches("^\\d+$"))) { // 正则判断super.addFieldError(fieldName, arg0);}但是这样正则在action中就硬编码了, 希望添加⼀个变量接收正则表达式, 然后在配置⽂件中接收正则进⾏设置添加属性private String express;并⽣成getter/setter⽅法private String express;@Overridepublic void validate(Object arg0) throws ValidationException {String fieldName = super.getFieldName();String value = "" + super.getFieldValue(super.getFieldName(), arg0);if (!(value.matches(this.express))) {super.addFieldError(fieldName, arg0);}}UserAction-validation.xml<!-- 编写⾃定义的验证规则 --><field-validator type="regex"> <param name="express">^\d{1, 3}$</param> <message>年龄必须是数字!</message></field-validator>测试:。
Struts2校验器类型详解一、Struts2内建校验器位于xwork-2.0.4.jar压缩包中(com.opensymphony.xwork2.validator.validators)有个文件default.xml ,该文件中定义了Struts2框架内建的校验器。
default.xml文件定义了常用的校验器类型。
首先搞清楚:struts2字段校验器与非字段校验器的区别字段校验器配置格式:<field name="被校验的字段"><field-validator type="校验器名"><!--此处需要为不同校验器指定数量不等的校验规则--><param name="参数名">参数值</param>....................<!--校验失败后的提示信息,其中key指定国际化信息的key--><message key="I18Nkey">校验失败后的提示信息</message><!--校验失败后的提示信息:建议用getText("I18Nkey"),否则可能出现Freemarker template Error--></field-vallidator><!-- 如果校验字段满足多个规则,下面可以配置多个校验器--></field>非字段校验器配置格式:<validator type="校验器名"><param name="fieldName">需要被校验的字段</param><!--此处需要为不同校验器指定数量不等的校验规则--><param name="参数名">参数值</param><!--校验失败后的提示信息,其中key指定国际化信息的key--><message key="I18Nkey">校验失败后的提示信息</message><!--校验失败后的提示信息:建议用getText("I18Nkey"),否则可能出现Freemarker template Error--></validator>非字段校验:先指定校验器:由谁来校验,来校验谁!字段校验器:先指定校验的属性:我来校验谁,由谁来校验!下面是对应在包中的类:<validators><validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/><validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/><validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/><validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/><validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/><validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/><validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/><validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/><validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/><validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/><validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/><validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/><validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/><validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/><validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/><validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/></validators>二、各种类型校验器1、类型转换检验器:(1)非字段校验:<validator type="conversion"><param name="fieldName">myField</param><message>类型转换错误</message><param name ="repopulateField">true</param></validator>(2)字段校验:<field name="myField"><field-validator type="conversion"><message>类型转换错误</message><param name ="repopulateField">true</param></field-validator></field>fieldName:该参数指定检查是否存在转换异常的字段名称,如果是字段校验,则不用指定该参数。
Struts2在WebWork基础上发展起来的,可扩展的JAVA EE web框架。
框架设计的目标贯穿整个开发周期,从开发到发布,包括维护的整个过程。
Action类:Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。
Struts2提供一个ActionSupport基类去实现常用的接口。
Action接口不是必须的,任何有execute标识的POJO 对象都可以用作Struts2的Action对象。
线程模式:Struts2Action对象为每一个请求产生一个实例,因此没有线程安全问题。
Servlet依赖:Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。
如果需要,Struts2 Action仍然可以访问初始的request和response。
但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
可测试性:Struts2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
捕获输入:Struts2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。
Action属性能够通过web页面上的taglibs访问。
表达式语言:Struts 2 使用"ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。
ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
Struts2不仅支持JSTL,Struts2 还可使用OGNL进行类型转换。
提供基本和常用对象的转换器。
校验:Struts2支持通过validate方法和XWork校验框架来进行校验。
XWork 校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性。
struts2框架特征Struts2框架特征Struts2是一种流行的Java Web应用程序开发框架,其特征使其成为许多开发者的首选。
本文将介绍Struts2框架的特征,包括MVC 架构、强大的标签库、拦截器、数据验证、国际化支持以及灵活的配置等。
一、MVC架构Struts2采用了MVC(Model-View-Controller)架构,将应用程序的业务逻辑、数据模型和用户界面分离。
这种架构使开发者能够更好地组织代码、提高代码的可维护性,并能够更容易地进行代码重用和测试。
在Struts2中,Model代表数据模型,可以是POJO(Plain Old Java Object)或者是与数据库交互的实体类;View代表用户界面,通常是JSP页面;Controller则负责处理用户请求、调用业务逻辑,并将处理结果返回给用户。
二、强大的标签库Struts2提供了丰富的标签库,使开发者能够更轻松地构建用户界面。
这些标签库包括表单标签、数据展示标签、控制流标签等,可以大大简化页面开发的工作量。
例如,开发者可以使用Struts2的表单标签库来生成表单,并自动处理表单的数据绑定、验证和错误提示。
这样,开发者无需手动编写大量的HTML和JavaScript代码,能够更快速地完成表单开发。
三、拦截器Struts2的拦截器是其核心特性之一,可用于在请求到达Controller之前和之后执行一些通用的处理逻辑,如日志记录、权限验证、异常处理等。
开发者可以通过配置拦截器栈,将多个拦截器按照特定的顺序组合起来,实现复杂的请求处理流程。
拦截器的使用使得开发者能够将通用的处理逻辑从业务逻辑中分离出来,提高了代码的可维护性和重用性。
同时,Struts2还提供了许多内置的拦截器,如参数封装拦截器、文件上传拦截器等,方便开发者处理不同类型的请求。
四、数据验证在Web应用程序中,数据验证是一项重要的任务。
Struts2提供了强大的数据验证机制,开发者可以通过简单的配置实现对表单数据的验证。
1. Struts2简介1.1. 什么是Struts21.1.1. Struts2的概念Struts2是轻量级的MVC框架,它主要解决了请求分发的问题,重心在于控制层和表现层。
轻量级,指的是Struts2具有较低的侵入性,就是它对我们业务代码的依赖程度很低,简单来说,在使用Struts2框架时,我们的业务代码中基本上不需要import它的包。
Struts2实现了MVC,满足了MVC设计思想。
在我们使用Struts2做开发的时候,就相当于使用了MVC,这是Struts2自动帮助我们实现的,是默认的、隐含的,我们不需要再写特别的代码来实现MVC了。
作为一个框架,Struts2提供了一系列的API,我们可以使用它们来简化代码的编写,从而提升开发效率。
这些API复用程度很高,对业务代码的依赖性也很小,甚至很多是Struts2自动调用的,因此在很大程度上,我们的开发变得可以复用。
Struts2解决请求分发的问题,我们会在后面为什么使用Struts2中讲解。
重心在控制层和表现层,是纵观整个Struts2理论课程来看的,从中我们会体会到这一点,随着大家对Struts2的逐步了解,届时我们再回顾这一点。
1.1.2. 什么是MVCMVC是代码的分层思想,是软件设计领域经典的设计模式。
它根据代码功能的不同,将一个软件的代码分为3部分,即模型、视图、控制器,这3部分代码的含义和功能如下。
1、M-Model 模型模型(Model)的职责是负责业务逻辑。
包含两层:业务数据和业务处理逻辑。
比如实体类、DAO、Service都属于模型层。
2、V-View 视图视图(View)的职责是负责显示界面和用户交互(收集用户信息)。
属于视图的组件是不包含业务逻辑和控制逻辑的JSP。
3、C-Controller 控制器控制器是模型层M和视图层V之间的桥梁,用于控制流程。
比如:在Servlet项目中的单一控制器ActionServlet。
Struts2(上)一、经典的MVC模式二、Struts1.x对MVC的实现三、Struts1.x的主要组件和作用组件作用ActionServlet 中央控制器Action 分控制器,调用JavaBean实现业务逻辑,Action可以分为Action、DispatchAction等不同类型ActionForm 封装参数,实现服务器验证,文件上传等Forward 转发到目的地,可以是JSP,也可以是另一个ActionStruts-config.xml 配置文件,配置有ActionForm,Action,Forward等,通过XML解析,然后使用反射技术使用该文件Struts标签库和JSTL类似,和Struts-config.xml、ActionForm、Action等对象可以紧密集成四、Struts1.x 开发实例-登录程序见案例。
五、Struts2(WebWork)的MVCStruts2的MVC架构六、Struts2的主要组件组件作用FilterDispatcher 起中央控制器作用的过滤器Action 处于Model层的Action,调用JavaBean实现业务逻辑struts.xml 核心配置文件,配置有Action、Result等result 和forward类似,转发的目的地,支持多种视图技术。
七、Struts2的实例-登录在MyEclipse环境中建立一个新的web工程,名称“Struts2Login”,存放路径“f:\Struts2Login”。
在Struts2.0.11版本中找到war包struts2-blank-2.0.11.war,解开该war包,在WEB-INF/lib 目录下复制出所有的jar包,这些jar包就是一个Struts2程序所需要的基础jar包,把它们复制到新建的web工程的WEB-INF/lib目录中。
在src目录下建立一个类,包名mypack,类名UserAction,其代码如下:package mypack;import com.opensymphony.xwork2.ActionSupport;public class UserAction extends ActionSupport {private String username;private String userpass;public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getUserpass() {return userpass;}public void setUserpass(String userpass) {erpass = userpass;}@Overridepublic String execute() throws Exception {if ("Mike".equals(username) && "123".equals(userpass)|| "张三".equals(username) && "abc".equals(userpass))return "success";elsereturn "error";}}在src目录下建立Struts2的配置文件struts.xml,内容如下:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><!-- 定义包管理配置的action 继承struts-default.xml中的配置 --><package name="actions" extends="struts-default"><!-- 定义Action(login.action) --><action name="login" class="erAction"><!-- 定义转发路径对应的字符串名 --><result name="success">/Success.jsp</result><result name="error">/Error.jsp</result></action></package></struts>修改web.xml,在其中加入一个过滤器,过滤/*路径。
前言其实神马都是浮云。
相关软件下载1.下载Struts2.2.1.1 /download.cgi#struts217(选择下载fulldistribution)2.下载eclipse,/downloads/(选择下载Eclipse IDE for Java EEDevelopers Windows 32 Bit)3.下载tomcat6.0,4.下载JDK1.6,/download/jdk6安装与设置1.解压struts-2.2.1.1-all.zip2.安装Eclipse(解压即可)3.假设你已经安装好jdk和tomcat了,如C:\JAVA_TOOLS\apache-tomcat-6.0.16和C:\JAVA_TOOLS\JDK\ jdk1.6.0_02HelloWorld1.Eclipse中设定servera)Window –Preferences –Server –Runtime Environments –Add –Apache –ApacheTomcat v6.0(注意选中对话框下方的Create a new local server复选框)b)选择Tomcat installation directoryc)选择JREd)Finishe)双击下方Servers选项卡中的Tomcat v6.0 Server at localhost,设置Server Locations中的Deploy path为Tomcat安装目录下的webapps目录,注意保存文件。
2.Eclipse中建立项目a)打开eclipseb)新建项目c)选择web节点下的Dynamic Web Projectd)项目名称:struts2HelloWorld(注意选中Target runtime为设定好的Server)3.Eclipse中部署运行项目a)右击Servers选项卡中的Tomcat v6.0 Server at localhost,选择Add and Remove添加需要部署的Java web项目。
Struts2集成指南关于Struts2Struts是Apache软件基金会(ASF)赞助的一个开源项目。
它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。
它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller〔MVC〕设计模式的应用框架〔Web Framework〕,是MVC经典设计模式中的一个经典产品。
Struts,a history在Java EE的Web应用发展的初期,除了使用Servlet技术以外,普遍是在JavaServer Pages(JSP)的源代码中,采用HTML与Java代码混合的方式进行开发。
因为这两种方式不可避免的要把表现与业务逻辑代码混合在一起,都给前期开发与后期维护带来巨大的复杂度。
为了摆脱上述的约束与局限,把业务逻辑代码从表现层中清晰的分离出来,2000年,Craig McClanahan采用了MVC的设计模式开发Struts。
后来该框架产品一度被认为是最广泛、最流行JAVA的WEB应用框架。
Craig McClanahan2006年,WebWork与Struts这两个优秀的Java EE Web框架(Web Framework〕的团体,决定合作共同开发一个新的,整合了WebWork与Struts优点,并且更加优雅、扩展性更强的框架,命名为“Struts 2”,原Struts的1.x版本产品称为“Struts 1”。
至此,Struts项目并行提供与维护两个主要版本的框架产品——Struts 1与Struts 2。
Struts1 vs. Struts2侵入性Struts 1在编程方面是面向抽象类编程,而不是面向接口编程。
Struts 1要求自定义Action 类继承一个特定的抽象基类Action。
另一方面,Struts 1的 Action 依赖于 Servlet API,因为Struts 1 Action 的execute 方法中有HttpServletRequest 和HttpServletResponse 方法。
struts2的核心是从webwork演变来的,其数据验证框架其实就是原webwork的那一套东西。
一,Struts2数据验证的整体框架介绍struts2的action都要继承ActionSupprot类,这个类实现了Validateable 与ValidationAware这两个跟数据验证有关的接口。
其中Validateable只有一个方法validate()用于数据验证;ValidationAware则用于记录验证出错时的相关信息。
而数据验证在什么时候被调用呢?数据验证的调用是包装在workflow拦截器里,我们看看workflow拦截器在struts_default.xml中的定义,它是放在默认的defaultStack拦截器组里,相关顺序如下:<interceptor-ref name="params"/><interceptor-ref name="conversionError"/><interceptor-ref name="validation"/><interceptor-ref name="workflow"/>params与conversionError这两个拦截器在workflow的前面,它们的工作是从request中把数据转成正确的Java类型数据,以供后面处理。
validation 拦截器实质是AnnotationValidationInterceptor与我们这里谈的数据验证不是一回事,它只判断有没有@SkipValidation注解,如果有就不会路过数据验证,只是起一个开关作用。
当workflow拦截器触发时,它先检查当前请求的action是否实现了Validateable接口,如果实现了该接口,则调用validate()方法:如果这个方法处理时发现有数据验证不通过,则会生成一个错误信息并交给ValidationAware的方法去存储这些出错信息。
当validate()方法执行完毕,workflow拦截器还要调用ValidationAware的hasErrors()方法,看看是否有出错信息生成,如果有出错信息,就中断当前action的执行流程,返回"input"字符串,一般我们是在配置文件struts.xml里配置"input"返回结果的跳转页面。
二,数据验证的方式1,在action类里实现validate()方法这是最简单的方法了,直接在actionClass中实现Validateable接口的方法,如:public class RegUser extends ActionSupport {public String execute(){return SUCCESS;}private String username;private String password;// Getters and setters omittedpublic voidvalidate(){if ( getPassword().length() ==0 ){addFieldError( "password", getText("密码不能为空") );}if ( getUsername().length() ==0 ){addFieldError( "username", getText("用户名不能为空") );}. . .}}配置文件:<action name="regUser"><result name="success">/WEB-INF/pages/regsucc.jsp</result><result name="input">/WEB-INF/pages/regerror.jsp</result></action>把所有的判断逻辑直接写到action类里,如果有验证错误,直接返回"input"。
2,使用xml配置文件:ActionClass-validations.xml其实struts2已经内置了一些基本的数据验证,完全可以省去我们日常的一些数据验证需求,通过配置文件的方式。
在ActionClass所在的目录下,新建一个以ActionClass名字组合成的特定xml:ActionClass- validations.xml(例,我的ActionClass名为RegUser,则我应该在同目录下建一名为RegUser- validations.xml的文件),其内容如下:<?xml version="1.0″ encoding="UTF-8″?><!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN""/xwork/xwork-validator-1.0.2.dtd"><validators> <!- 表明这是一个验证器 -><field name="username"> <!- 声明要验证的字段 -><field-validator type="requiredstring"> <!- 声明该字段验证器的类型为"必填的字符串" -><message>用户名不能为空</message> <!- 如果验证不通过时的出错信息 -></field-validator></field><field name="password"><field-validator type="requiredstring"><message>密码不能为空</message></field-validator></field><!-<field name="age"><field-validator type="int"> <!- 声明该字段验证器的类型为"必须是整数" -><param name="min">13</param> <!- 声明该字段最小值是13 -><param name="max">20</param> <!- 声明该字段最大值是20 -><message>必须在 13至20之间</message></field-validator></field>-></validators>以下是目前struts2所支持的内置的验证器说明,我们可以直接在xml 文件里声明拿来使用:3,使用自己定义的验证器做数据验证前面介绍过的第2种方式,是利用struts自带的验证器,通过xml配置文件来进行数据验证的,但如果我们的验证要求比较特殊,比如对一个参数的复杂数据、字符组合要求,则可能会考虑自己写一个验证器,如果是这样,那为什么不彩第1种方式,直接在action里实现validate方法呢?是的,当然这样也可以,但我们的目标是尽可能重用代码,或许这个类型的数据验证会用在多个action,甚至于提供给后来的同学们使用,抽象成一个独立的验证器,通过配置文件来声明,以达到复用。
下面就介绍如果新建一个可复用的自定义验证器。
一般新建自定义的验证器,我们要继承ValidatorSupport或FieldValidatorSupport类。
下面以一个密码验证的代码例子为说明:所需验证的密码数据要满足下面条件:1,密码中要包含字母,大小写均可2,密码中要包含数字,0-93,密码中要包含至少一个特殊字符参见以下代码:1,我们要先继承FieldValidatorSupport(该类已经继承ValidatorSupport)类2,为我们的验证声明几个正则表达式的pattern:对数字的,普通字符,以及特殊字符3,实现validate()方法,在这里实现验证的逻辑代码4,利用继承自FieldValidatorSupport中的getFileName()和getFileValue()方法获取要进行验证的数据5,如果验证不通过,要调用addFieldError()方法,继承自ValidatorSupport类,以声明错误public classPasswordIntegrityValidator extends FieldValidatorSupport {static Pattern digitPattern =pile( "[0-9]");static Pattern letterPattern =pile( "[a-zA-Z]");static Pattern specialCharsDefaultPattern =pile( "!@#$");public void validate(Object object) throws ValidationException { String fieldName= getFieldName();String fieldValue = (String) getFieldValue(fieldName, object ); fieldValue = fieldValue.trim(); Matcher digitMatcher = digitPattern.matcher(fieldValue); Matcher letterMatcher =letterPattern.matcher(fieldValue);MatcherspecialCharacterMatcher;if ( getSpecialCharacters() !=null ){Pattern specialPattern =pile("[" + getSpecialCharacters() +"]" );specialCharacterMatcher =specialPattern.matcher( fieldValue );} else{specialCharacterMatcher =specialCharsDefaultPattern.matcher( fieldValue ) ;}if ( !digitMatcher.find() ) { addFieldError( fieldName, object );}else if ( !letterMatcher.find() ) {addFieldError( fieldName, object );}else if ( !specialCharacterMatcher.find() ) {addFieldError( fieldName, object );}}private String specialCharacters;public String getSpecialCharacters() {return specialCharacters;}public void setSpecialCharacters(String specialCharacters) { this.specialCharacters = specialCharacters;}}在建完主体的验证器代码,就要在配置文件中声明它,以便我们使用:在WEB-INF/classes/下新建或编辑validators.xml文件,声明我们上面创建的验证器:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator Config 1.0//EN""/xwork/xwork-validator-config-1.0.dtd"><validators><validator name="passwordintegrity"class="manning.utils.PasswordIntegrityValidator"/></validators>完成了声明,我们就可以使用前面介绍过的使用xml配置文件:ActionClass-validations.xml的方式来使用这个验证器了:在为要使用的类的目录下建立ActionClass-validations.xml的文件,增加如下内容:<field-validator type="passwordintegrity"><param name="specialCharacters">$!@#?</param><message>您的密码必须包括至少一个数字,字符,并包括如下的特殊的字符: "${specialCharacters}".</message></field-validator>。