1.
自定义的FileChecks类。主要是为了支持DispatchAction类的使用
- /**
- * Filename: MyFieldChecks.java
- * Author: qiujy
- * Createtime:Nov 16, 2008
- * Copyrights 2008 qjyong All rights reserved.
- * EMail: qjyong(a)gmail.com
- */
- package com.qiujy.web.validator;
- import javax.servlet.http.HttpServletRequest;
- import org.apache.commons.validator.Field;
- import org.apache.commons.validator.Validator;
- import org.apache.commons.validator.ValidatorAction;
- import org.apache.struts.Globals;
- import org.apache.struts.action.ActionMapping;
- import org.apache.struts.action.ActionMessages;
- import org.apache.struts.actions.DispatchAction;
- import org.apache.struts.validator.FieldChecks;
- /**
- *
- * 自定义的字段通用验证规则类,主要是为了支持DispatchAction类的使用
- * 某个字段在DispatchAction中需要的某个方法方法要进行验证,则validation.xml中进行如下配置
- * <p>
- * <field property="username" page="" depends="required">
- <arg0 key="login.username" />
- <var>
- <var-name>methodsNeedValidation</var-name>
- <var-value>login,registe</var-value>
- </var>
- </field>
- * </p>
- * 这表示username这个字段在login和registe方法中要进行验证
- * @author qiujy
- */
- public class MyFieldChecks extends FieldChecks {
- private static final long serialVersionUID = 2330916654638584139L;
- private static final String SEPARATOR = ",";
- /**
- * 方法说明: 判断in是否出现在source中
- *
- * @param source
- * @param in
- * @return
- */
- private static boolean isIn(String source, String in) {
- source = SEPARATOR + source + SEPARATOR;
- if (source.indexOf(SEPARATOR + in + SEPARATOR) != -1) {
- return true;
- } else {
- return false;
- }
- }
- /**
- * 判断需要验证
- *
- * @param field
- * @param request
- * @return
- */
- private static boolean isNeedValidate(Field field,
- HttpServletRequest request) {
- boolean flag = true;
- // 查找到当前请求对应的actionMapping
- ActionMapping mapping = (ActionMapping) request
- .getAttribute(Globals.MAPPING_KEY);
- // 得到处理该请求的Action类名
- String className = mapping.getType();
- String input = request.getHeader("Referer");
- if (input != null) {
- // mapping.setInput(input);
- }
- try {
- // 如果处理该请求的Action是DispatchAction的子类
- if (Class.forName(className).newInstance() instanceof DispatchAction) {
- // 得到<action>标记的parameter属性的值
- String parameter = mapping.getParameter();
- // 得到当前要执行方法名
- String currentMethodName = request.getParameter(parameter);
- // 获取配置文件中需要验证的方法名列表串
- String methods = field.getVarValue("methodsNeedValidation");
- // 如果没有配置需要验证的方法或不在需要验证的方法列表中,则把flag改为false
- if (null == methods || "".equals(methods)
- || !isIn(methods, currentMethodName)) {
- flag = false;
- }
- }
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (InstantiationException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- return flag;
- }
- public static boolean validateRequired(Object bean, ValidatorAction va,
- Field field, ActionMessages errors, Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateRequired(bean, va, field, errors,
- validator, request);
- } else {
- return true;
- }
- }
- public static boolean validateRequiredIf(Object bean, ValidatorAction va,
- Field field, ActionMessages errors, Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateRequiredIf(bean, va, field, errors,
- validator, request);
- } else {
- return true;
- }
- }
- public static boolean validateMask(Object bean, ValidatorAction va,
- Field field, ActionMessages errors, Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateMask(bean, va, field, errors, validator,
- request);
- } else {
- return true;
- }
- }
- public static Object validateByte(Object bean, ValidatorAction va,
- Field field, ActionMessages errors, Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateByte(bean, va, field, errors, validator,
- request);
- } else {
- return true;
- }
- }
- public static Object validateShort(Object bean, ValidatorAction va,
- Field field, ActionMessages errors, Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateShort(bean, va, field, errors,
- validator, request);
- } else {
- return true;
- }
- }
- public static Object validateInteger(Object bean,
- ValidatorAction va, Field field,
- ActionMessages errors,
- Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateInteger(bean, va, field, errors,
- validator, request);
- } else {
- return true;
- }
- }
- public static Object validateLong(Object bean,
- ValidatorAction va, Field field,
- ActionMessages errors,
- Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateLong(bean, va, field, errors,
- validator, request);
- } else {
- return true;
- }
- }
- public static Object validateFloat(Object bean,
- ValidatorAction va, Field field,
- ActionMessages errors,
- Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateLong(bean, va, field, errors,
- validator, request);
- } else {
- return true;
- }
- }
- public static Object validateDouble(Object bean,
- ValidatorAction va, Field field,
- ActionMessages errors,
- Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateDouble(bean, va, field, errors,
- validator, request);
- } else {
- return true;
- }
- }
- public static Object validateDate(Object bean,
- ValidatorAction va, Field field,
- ActionMessages errors,
- Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateDate(bean, va, field, errors,
- validator, request);
- } else {
- return true;
- }
- }
- public static boolean validateIntRange(Object bean,
- ValidatorAction va, Field field,
- ActionMessages errors,
- Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateIntRange(bean, va, field, errors,
- validator, request);
- } else {
- return true;
- }
- }
- public static boolean validateDoubleRange(Object bean,
- ValidatorAction va, Field field,
- ActionMessages errors,
- Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateDoubleRange(bean, va, field, errors,
- validator, request);
- } else {
- return true;
- }
- }
- public static boolean validateFloatRange(Object bean,
- ValidatorAction va, Field field,
- ActionMessages errors,
- Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateFloatRange(bean, va, field, errors,
- validator, request);
- } else {
- return true;
- }
- }
- public static Object validateCreditCard(Object bean,
- ValidatorAction va, Field field,
- ActionMessages errors,
- Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateCreditCard(bean, va, field, errors,
- validator, request);
- } else {
- return true;
- }
- }
- public static boolean validateEmail(Object bean,
- ValidatorAction va, Field field,
- ActionMessages errors,
- Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateEmail(bean, va, field, errors,
- validator, request);
- } else {
- return true;
- }
- }
- public static boolean validateMaxLength(Object bean,
- ValidatorAction va, Field field,
- ActionMessages errors,
- Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateMaxLength(bean, va, field, errors,
- validator, request);
- } else {
- return true;
- }
- }
- public static boolean validateMinLength(Object bean,
- ValidatorAction va, Field field,
- ActionMessages errors,
- Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateMinLength(bean, va, field, errors,
- validator, request);
- } else {
- return true;
- }
- }
- public static boolean validateUrl(Object bean,
- ValidatorAction va, Field field,
- ActionMessages errors,
- Validator validator,
- HttpServletRequest request) {
- if (isNeedValidate(field, request)) {
- return FieldChecks.validateUrl(bean, va, field, errors,
- validator, request);
- } else {
- return true;
- }
- }
- }
2. 修改validate-rules.xml,使用自定义的字段验证类:
- <!DOCTYPE form-validation PUBLIC
- "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
- "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
- <form-validation>
- <global>
- <validator name="required"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateRequired"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- msg="errors.required"/>
- <validator name="requiredif"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateRequiredIf"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- msg="errors.required"/>
- <validator name="validwhen"
- msg="errors.required"
- classname="org.apache.struts.validator.validwhen.ValidWhen"
- method="validateValidWhen"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"/>
- <validator name="minlength"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateMinLength"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- depends=""
- msg="errors.minlength"
- jsFunction="org.apache.commons.validator.javascript.validateMinLength"/>
- <validator name="maxlength"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateMaxLength"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- depends=""
- msg="errors.maxlength"
- jsFunction="org.apache.commons.validator.javascript.validateMaxLength"/>
- <validator name="mask"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateMask"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- depends=""
- msg="errors.invalid"/>
- <validator name="byte"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateByte"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- depends=""
- msg="errors.byte"
- jsFunctionName="ByteValidations"/>
- <validator name="short"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateShort"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- depends=""
- msg="errors.short"
- jsFunctionName="ShortValidations"/>
- <validator name="integer"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateInteger"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- depends=""
- msg="errors.integer"
- jsFunctionName="IntegerValidations"/>
- <validator name="long"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateLong"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- depends=""
- msg="errors.long"/>
- <validator name="float"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateFloat"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- depends=""
- msg="errors.float"
- jsFunctionName="FloatValidations"/>
- <validator name="double"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateDouble"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- depends=""
- msg="errors.double"/>
- <validator name="date"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateDate"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- depends=""
- msg="errors.date"
- jsFunctionName="DateValidations"/>
- <validator name="intRange"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateIntRange"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- depends="integer"
- msg="errors.range"/>
- <validator name="floatRange"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateFloatRange"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- depends="float"
- msg="errors.range"/>
- <validator name="doubleRange"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateDoubleRange"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- depends="double"
- msg="errors.range"/>
- <validator name="creditCard"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateCreditCard"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- depends=""
- msg="errors.creditcard"/>
- <validator name="email"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateEmail"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- depends=""
- msg="errors.email"/>
- <validator name="url"
- classname="com.qiujy.web.validator.MyFieldChecks"
- method="validateUrl"
- methodParams="java.lang.Object,
- org.apache.commons.validator.ValidatorAction,
- org.apache.commons.validator.Field,
- org.apache.struts.action.ActionMessages,
- org.apache.commons.validator.Validator,
- javax.servlet.http.HttpServletRequest"
- depends=""
- msg="errors.url"/>
- <!--
- This simply allows struts to include the validateUtilities into a page, it should
- not be used as a validation rule.
- -->
- <validator name="includeJavaScriptUtilities"
- classname=""
- method=""
- methodParams=""
- depends=""
- msg=""
- jsFunction="org.apache.commons.validator.javascript.validateUtilities"/>
- </global>
- </form-validation>
注意观察,验证字段使用的类。
3.配置具体的验证规则validation.xml:
- <?xml version="1.0" encoding="ISO-8859-1" ?>
- <!DOCTYPE form-validation PUBLIC
- "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
- "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
- <form-validation>
- <formset>
- <form name="/user">
- <field property="username" page="" depends="required">
- <arg0 key="login.username" />
- <var>
- <var-name>methodsNeedValidation</var-name>
- <var-value>login,registe</var-value>
- </var>
- </field>
- <field property="pwd" depends="required,mask">
- <arg0 key="login.pwd" />
- <var>
- <var-name>mask</var-name>
- <var-value>^/w{3,}$</var-value>
- </var>
- <var>
- <var-name>methodsNeedValidation</var-name>
- <var-value>login,registe</var-value>
- </var>
- </field>
- <field property="pwd2" depends="required,mask">
- <arg0 key="login.pwd" />
- <var>
- <var-name>mask</var-name>
- <var-value>^/w{3,}$</var-value>
- </var>
- <var>
- <var-name>methodsNeedValidation</var-name>
- <var-value>registe</var-value>
- </var>
- </field>
- </form>
- </formset>
- </form-validation>
4.struts-config.xml文件
- <?xml version="1.0" encoding="ISO-8859-1" ?>
- <!DOCTYPE struts-config PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
- "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
- <struts-config>
- <form-beans>
- <form-bean name="myForm"
- type="com.qiujy.web.formbeans.UserForm" />
- </form-beans>
- <!-- =========================================== Action Mapping Definitions -->
- <action-mappings>
- <action path="/user"
- type="com.qiujy.web.actions.UserAction"
- name="myForm"
- scope="request"
- validate="true"
- parameter="method"
- input="/validate_failure.jsp">
- <forward name="success" path="/success.jsp"></forward>
- <forward name="failure" path="/failure.jsp"></forward>
- </action>
- </action-mappings>
- <!-- ======================================== Message Resources Definitions -->
- <message-resources parameter="MessageResources" />
- <!-- =================================================== Validator plugin -->
- <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
- <set-property property="pathnames"
- value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
- </plug-in>
- </struts-config>
5.UserAction类
- /**
- * Filename: LoginAction.java
- * Author: qiujy
- * Createtime:Nov 6, 2008
- * Copyrights 2008 qjyong All rights reserved.
- * EMail: qjyong(a)gmail.com
- */
- package com.qiujy.web.actions;
- import java.util.Date;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.struts.action.ActionForm;
- import org.apache.struts.action.ActionForward;
- import org.apache.struts.action.ActionMapping;
- import com.qiujy.entity.User;
- import com.qiujy.service.UserService;
- import com.qiujy.web.formbeans.UserForm;
- /**
- * @author qiujy
- */
- public class UserAction extends BaseAction {
- public ActionForward login(ActionMapping mapping,
- ActionForm form,
- HttpServletRequest request,
- HttpServletResponse response)
- throws Exception {
- //step1:接收用户的请求数据
- UserForm myForm = (UserForm)form;
- String username = myForm.getUsername();
- String pwd = myForm.getPwd();
- //step2:调用业务逻辑类处理请求
- UserService service = new UserService();
- boolean flag = service.validate(username, pwd);
- //step3: 返回响应
- if(flag){
- //如果没有对应的forward页面,将返回一个空白页面给客户端
- return mapping.findForward("success");
- }else{
- return mapping.findForward("failure");
- }
- }
- public ActionForward registe(ActionMapping mapping,
- ActionForm form,
- HttpServletRequest request,
- HttpServletResponse response)
- throws Exception {
- UserForm rf = (UserForm)form;
- String username = rf.getUsername();
- String pwd = rf.getPwd();
- String email = rf.getEmail();
- User user = new User();
- user.setUsername(username);
- user.setPwd(pwd);
- user.setEmail(email);
- user.setDescription("");
- user.setRegitedTime(new Date());
- UserService service = new UserService();
- try{
- service.addUser(user);
- return mapping.findForward("success") ;
- }catch(RuntimeException re){
- re.printStackTrace();
- return mapping.findForward("failure");
- }
- }
- }
6.UserForm类
- /**
- * Filename: RegisteForm.java
- * Author: qiujy
- * Createtime:Nov 6, 2008
- * Copyrights 2008 qjyong All rights reserved.
- * EMail: qjyong(a)gmail.com
- */
- package com.qiujy.web.formbeans;
- import org.apache.struts.validator.ValidatorActionForm;
- /**
- * 用户表单Bean
- * @author qiujy
- */
- public class UserForm extends ValidatorActionForm {
- private static final long serialVersionUID = 1975878283533257467L;
- private String username;
- private String pwd;
- private String pwd2;
- private String email;
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPwd() {
- return pwd;
- }
- public void setPwd(String pwd) {
- this.pwd = pwd;
- }
- public String getPwd2() {
- return pwd2;
- }
- public void setPwd2(String pwd2) {
- this.pwd2 = pwd2;
- }
- public String getEmail() {
- return email;
- }
- public void setEmail(String email) {
- this.email = email;
- }
- }
7.页面及资源文件略。具体参见示例程序代码。到我的资源库去下载。