structs校验问题

转载 2006年05月24日 15:45:00
 本文我们来讨论一下Struts中的输入校验问题。我们知道,信息系统有垃圾进垃圾出的特点,为了避免垃圾数据的输入,对输入进行校验是任何信息系统都要面对的问题。在传统的编程实践中,我们往往在需要进行校验的地方分别对它们进行校验,而实际上需要校验的东西大多都很类似,如必需的字段、日期、范围等等。因此,应用程序中往往到处充斥着这样一些显得冗余的代码。而与此形成鲜明对照的是Struts采用Validator框架(Validator框架现在是Jakarta Commons项目的一部分)来解决校验问题,它将校验规则代码集中到外部的且对具体的应用程序中立的.xml文件中,这样,就将那些到处出现的校验逻辑从应用程序中分离出来,任何一个Struts应用都可以使用这个文件,同时还为校验规则的扩展提供了便利。更难能可贵的是由于Validator框架将校验中要用到的一些消息等信息与资源绑定有机结合在一起,使得校验部分的国际化编程变得十分的便捷和自然。

    Validator框架大致有如下几个主要组件:

    Validators:是Validator框架调用的一个Java类,它处理那些基本的通用的校验,包括required、mask(匹配正则表达式)、最小长度、最大长度、范围、日期等

    .xml配置文件:主要包括两个配置文件,一个是validator-rules.xml,另一个是validation.xml。前者的内容主要包含一些校验规则,后者则包含需要校验的一些form及其组件的集合。

    资源绑定:提供(本地化)标签和消息,缺省地共享struts的资源绑定。即校验所用到的一些标签与消息都写在ApplicationResources.properity文件中。

    Jsp tag:为给定的form或者action path生成JavaScript validations。

    ValidatorForm:它是ActionForm的一个子类。

    为了对Validator框架有一个比较直观的认识,我们还是以前面的登陆例子的输入来示范一下Validator框架的使用过程:

    首先,找一个validator-rules.xml文件放在mystruts/WEB-INF目录下,下面是该文件中涉及到的required验证部分代码的清单:

<validator name="required"
<!--①-->
            classname="org.apache.struts.validator.FieldChecks"
               method="validateRequired"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
<!--②-->
                  msg="errors.required">
<!--③-->
         <javascript><![CDATA[
            function validateRequired(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oRequired = new required();
                for (x in oRequired) {
                	var field = form[oRequired[x][0]];
                	
                    if (field.type == 'text' ||
                        field.type == 'textarea' ||
                        field.type == 'file' ||
                        field.type == 'select-one' ||
                        field.type == 'radio' ||
                        field.type == 'password') {
                        
                        var value = '';
				// get field's value
				if (field.type == "select-one") {
				var si = field.selectedIndex;
				if (si >= 0) {
				value = field.options[si].value;
							}
						} else {
							value = field.value;
						}
                        
                        if (trim(value).length == 0) {
                        
	                        if (i == 0) {
	                            focusField = field;
	                        }
	                        fields[i++] = oRequired[x][1];
	                        isValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('/n'));
                }
                return isValid;
            }
            
            // Trim whitespace from left and right sides of s.
            function trim(s) {
                return s.replace( /^/s*/, "" ).replace( //s*$/, "" );
            }
            
            ]]>
         </javascript>

</validator>

    ① 节的代码是引用一个服务器边的验证器,其对应的代码清单如下:

public static boolean validateRequired(Object bean,
                                           ValidatorAction va, Field field,
                                           ActionErrors errors,
                                           HttpServletRequest request) {

        String value = null;
        if (isString(bean)) {
            value = (String) bean;
        } else {
            value = ValidatorUtil.getValueAsString(bean, field.getProperty());
        }
        
        if (GenericValidator.isBlankOrNull(value)) {
            errors.add(field.getKey(), Resources.getActionError(request, va, field));
            return false;
        } else {
            return true;
        }
}

    ② 节是验证失败后的出错信息,要将对应这些键值的信息写入到ApplicationResources.properity文件中,常见的错误信息如下:

# Standard error messages for validator framework checks
errors.required={0} is required.
errors.minlength={0} can not be less than {1} characters.
errors.maxlength={0} can not be greater than {1} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be a byte.
errors.short={0} must be a short.
errors.integer={0} must be an integer.
errors.long={0} must be a long.
errors.float={0} must be a float.
errors.double={0} must be a double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is an invalid credit card number.
errors.email={0} is an invalid e-mail address.

    ③ 节的代码用于客户边的JavaScript验证

其次,在validation.xml文件中配置要验证的form极其相应的字段,下面是该文件中的代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation
//DTD Commons Validator Rules Configuration 1.0//EN" 
"http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
<form-validation>
<formset>
<form name="userInfoForm">
<field property="username"
depends="required,mask,minlength,maxlength">
<arg0 key="logon.jsp.prompt.username" resource="true"/>
<arg1 name="minlength" key="${var:minlength}" resource="false"/>
<arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
<var>
<var-name>mask</var-name>
<var-value>^/w</var-value>
</var>
<var>
<var-name>minlength</var-name>
<var-value>2</var-value>
</var>
<var>
<var-name>maxlength</var-name>
<var-value>16</var-value>
</var>
</field>
<field property="password"
depends="required,minlength,maxlength">
<arg0 key="logon.jsp.prompt.password" resource="true"/>
<arg1 name="minlength" key="${var:minlength}" resource="false"/>
<arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
<var>
<var-name>minlength</var-name>
<var-value>2</var-value>
</var>
<var>
<var-name>maxlength</var-name>
<var-value>16</var-value>
</var>
</field>
</form>
</formset>
</form-validation>

    这里要注意的是:该文中的和中的键值都是取自资源绑定中的。前面还讲到了出错信息也是写入ApplicationResources.properity文件中,因此,这就为国际化提供了一个很好的基础。

    再次,为了使服务器边的验证能够进行,将用到的formBean从ActionForm的子类改为ValidatorForm的子类,即:
    将public class UserInfoForm extends ActionForm改为:public class UserInfoForm extends ValidatorForm

    到此,进行服务器边的验证工作已经一切准备得差不多了,此时,只要完成最后步骤就可以实验服务器边的验证了。但大多数情况下,人们总希望把这些基本的简单验证放在客户边进行。

    为了能进行客户边的验证,我们还要对logon.jsp文件做适当的修改。

    将

<html:form action="/logonAction.do" focus="username">
改为
    
<html:form action="/logonAction.do" focus="username" onsubmit="return validateUserInfoForm(this)">

    在标签后加上:
    

<html:javascript dynamicJavascript="true" staticJavascript="true" formName="userInfoForm"/>

    最后,对struts的配置文件struts-config.xml作适当的修改:
    1、将

<action input="/logon.jsp" name="userInfoForm"
 path="/logonAction" scope="session" type="action.LogonAction" validate="false" >
改为
<action input="/logon.jsp" name="userInfoForm" 
path="/logonAction" scope="session" type="action.LogonAction" validate="true" >
其作用是要求进行校验

    2、将下列代码放在struts-config.xml文件中的标签前。其作用是将用于校验的各个组件结合在一起。

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames"
	value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>

    到此为止,我们的一切工作准备就绪,您可以享受自己的劳动成果了,试着输入各种组合的用户名和口令,看看它们的验证效果。仔细体会你会发现,服务器边的验证要更全面一些,比如对password的字符长度的验证。

MyEclipse+MVC(Struts)实现登录验证(含工程源码)

本文实现了用在MyEclipse下用MVC实现登录验证,适合新手入门,文末提供工程文件源码下载。 1. 新建工程Web Project工程0624mvc 2.选中工程,右键—》MyEclipse—...
  • u010887744
  • u010887744
  • 2015年06月26日 00:38
  • 3130

Https证书校验不当引起的安全问题

1. 使用Webview进行HTTPs通信Android系统内置了一些可信机构办法的证书,可用于作HTTPs证书校验。实际上,使用Webview组件进行HTTPs通信,其证书验证环节也是系统默认会去做...
  • Hubert_bing
  • Hubert_bing
  • 2017年02月16日 14:28
  • 2557

Struts2输入校验之用校验框架校验

在上一篇的学习记录中,我们学习了在Struts2项目中自己手动编写代码校验用户输入的合法性,通过LoginAction中复写validate()方法,进而判断用户提交的表单字段是否合法,这一篇中,我记...
  • yubo_725
  • yubo_725
  • 2015年03月15日 18:46
  • 1120

Structs2或SSH项目中解决乱码问题

最近做项目遇到了乱码问题,稍微研究了下,总结了点自己的心得,轻喷。 第一种方式:配置拦截器,推荐。 package com.guigu.store.utils; import java.io.I...
  • Kiss_Fly
  • Kiss_Fly
  • 2016年01月23日 18:57
  • 475

一个关于 Structs 校验器失效的故事

最近学习 Java EE,用到了 Structs 框架,准备写一个小的 Demo 来展示 validation。问题描述:这是由一个小小的警告引发的故事: 在写用户表单提交验证时创建了一个 Logi...
  • qq_20480611
  • qq_20480611
  • 2016年04月22日 22:23
  • 378

Structs2 输入校验,Action中校验,在xml中校验

输入校验在Structs2中,我们可以实现对action的所有方法进行校验或者对action的指定方法进行校验。校验示例1-在action中验证 对一个form表单进行数据校验,运用action中...
  • Peng_Hong_fu
  • Peng_Hong_fu
  • 2016年11月15日 22:24
  • 526

Java Web开发使用Structs2和Spring框架的好处

今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑...
  • haidaochuanzhanglh
  • haidaochuanzhanglh
  • 2016年04月14日 11:37
  • 1493

Structs1配置文件 详解+示例

详解:   是struts的根元素,它主要有8个子元素,DTD定义如下:     (data-sources?,form-beans?,global-exceptions?,global-f...
  • king_shenmewangyier
  • king_shenmewangyier
  • 2012年02月27日 20:04
  • 737

如何在structs2中使用servlet

紧接着遇到的就是这个问题,另一个哥们使用的是struct2写的具体产品显示页面,而我这边的整体构架并没有采用struct,而是使用servlet,这样要是把他写的页面和我的接起来的话,我也是需要配置s...
  • qqbli
  • qqbli
  • 2014年11月03日 20:08
  • 388

Android设备与structs2服务器程序进行json型数据交互

软件支持:androidADT 4.4.2            Myeclipse  10 注:本程序服务器程序是从利用网上现有程序,由于android版本差异,导致原android程序实现时...
  • canghaiyisulc
  • canghaiyisulc
  • 2014年08月21日 23:26
  • 326
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:structs校验问题
举报原因:
原因补充:

(最多只允许输入30个字)