对客户端的数据进行验证有两种方式:
一种是客户端验证,一种是服务端验证。对于客户端验证主要有javascript,但这种验证有可能被禁用或绕过,所以有必要对数据进行
服务端验证:
第一种方式:(自定义ActionErrors对象)
①在Action里面做验证:
【第1步】
==Action中的execute方法==
public ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm,
HttpServletRequest servletRequest,
HttpServletResponse servletResponse)
{
UserActionForm userActionForm = (UserActionForm) actionForm;
String username = userActionForm.getUserName();//从ActionForm中获取姓名
String password = userActionForm.getPassword();//从ActionForm中获取密码
if(username.equals("")||password.equals(""))//判断用户名是否为空或者密码是否为空
{
ActionErrors errors=new ActionErrors();//创建错误集合对象
errors.add("error_key",new ActionError("errores"));//★★创建错误对象放入集合中,"error_key"是键值,表明
//错误对象要在页面输出的键。new ActionError("error2")是个错误
//对象,"error2"是资源文件(属性文件)中的键值
this.saveErrors(servletRequest,errors);//★★将错误集合放入request里面
// return new ActionForward(actionMapping.getInput());//★★通过ActionForward类跳转,这里跳转到struts-config.xml
//配置文件中配置好的页面 :<action input="/error2.jsp"/>
return actionMapping.findForward("error");//★★跳转到"error"映射的页面<forward name="error" path="/error.jsp" />
}
else//表示验证通过,继续执行下面的语句
{
... ...
}
}
说明:上面有两种跳转,都是可行的。另外this.saveErrors(servletRequest,errors);是将错误集合放入Request,这一步是必须的
【第2步】
==struts-config.xml==
<struts-config>
<form-beans>
... ... ...
</form-beans>
<action-mappings>
<action input="/error2.jsp" ... ...">★1
<forward name="error" path="/error.jsp" />★2
</action>
</action-mappings>
<message-resources parameter="ApplicationResources" />★3
</struts-config>
说明:
★1:这里设置了input属性为error2.jsp,表示当在Action中用return new ActionForward(actionMapping.getInput())方式
跳转时将调转到error2.jsp
★2:这是跳转页面的映射关系,表示当在Action中用return actionMapping.findForward("error")方式
跳转时将调转到error.jsp
★3:这个配置很重要,表示错误对应的资源文件是src/ApplicationResources.properties属性文件
【第3步】
==ApplicationResources.properties==
errores= UserName or password is Required
error2=You name or password is not right
说明:
属性文件都是以键值对的方式存储,其中键值对应程序中的错误参数例如,上面的程序中的
errors.add("error_key",new ActionError("errores"))。就是将属性文件中对应的键值为errores的信息对应到"error_key"
错误对象中,页面将错误打印到页面的时候就将显示 "UserName or password is Required".
【第4步】
==error.jsp==
<html:errors property="error_key"/>
说明:
这里用的是Struts标签,输出错误信息。property参数将会找到errors集合中对应的键值的错误对象,并将错误打印出来
程序流程:
首先是有属性文件ApplicationResources.properties,属性文件中存储所有的错误提示信息。通过struts-config.xml配置,将属性
文件加载为资源文件,配置如下<message-resources parameter="ApplicationResources" />,在程序中对客户端提交的数据进行验证
当验证没有通过的时候,将产生错误对象,并将错误对象添加到错误集合中
ActionErrors errors=new ActionErrors();
errors.add("error_key",new ActionError("errores"));
"error_key"为添加到错误集合中的错误对象的键值, "errores"为属性文件中错误提示信息的键值。
在把错误集合添加到Request里面
this.saveErrors(servletRequest,errors);
最后通过Struts标签,把错误信息打印出来
<html:errors property="error_key"/>
在显示错误信息时,程序会通过property属性去错误集合中找键值为"error_key"的错误对象,找到错误对象后,又通过错误对象的
"errores"参数去属性文件中的找匹配的错误提示信息,最后将相对应的错误信息打印出来。
最后,如果数据没通过验证,页面将输出:UserName or password is Required
===================================================================
②在ActionForm里面做验证
在ActionForm里面做验证与在Action里面做验证基本上相同,只是在做逻辑判断的位置不同而已,在ActionForm里面实现validate方法
其他的步骤都一样。
==Action中的execute方法==
public ActionErrors validate(ActionMapping actionMapping, HttpServletRequest httpServletRequest)
{
ActionErrors errors=new ActionErrors();
if((userName==null)||(userName.equals("")))
{
errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionError("error.name"));
//errors.add("error_key",new ActionError("error.name"));
}
return errors;
}
注意:这里不需要指明验证不通过的话,将要跳转的页面,也不要将验证的错误集合放入Request里面,这是与上面验证不同的地方,
当验证不通过的话,系统会自动跳转到<action input="/**.jsp" ... ...">所指定的页面。
说明:这里是验证用户名是否为空,如果为空的话,创建错误对象放入错误集合,最后将错误集合返回,注意,这里用的是错误常量
来做错误键值,这样做的话,可以在页面输出错误信息时可以省略键值,例如:<html:errors />,这样做的话,会将所有错误
信息全部打印出来,如果只要显示特定的错误信息,最好指定错误对象的键值。
其他步骤都相同,故省略 ... ...
========================================================================================
第二种方式:(使用Struts Validator验证框架)
1
【第1步】继承至ValidatorForm
FormAction应该为
import org.apache.struts.validator.ValidatorForm;
public class LoginForm extends ValidatorForm{
... ...
去掉validator() 和 reset()方法
}
==================================================
2
【第2步】创建validation.xml文件
<?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="loginForm">
<field property="userName" depends="minlength">
<arg0 key="loginForm.userName"/>
<arg1 key="${var:minlength}" name="minlength" resource="false"/>
<var>
<var-name>minlength</var-name>
<var-value>6</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
说明:
每一个表单验证都在<formset></formset>中配置验证信息。
<form name="loginForm">表示要对具体哪个表单进行验证。
name="loginForm"属性对应struts-config.xml的<action name="loginForm" ... .../>配置
而每一个表单中的表单数据都在<field></field>中配置验证信息。
<field property="userName" depends="minlength">表示要对表单中的userName属性进行验证,验证的是长度验证,
depends="minlength"对应validator-rules.xml中的配置(validator-rules.xml文件是Struts自带的)。
<arg0 .../>是子标签,是给配置文件中的占位符在指定参数,下标是从0开始,
属性说明:
resource表示参数值是否从属性文件中取得,默认的情况下是true,当设置为true时,得在属性文件中设置相对应的键值对。
key表示要传值的键值,如果resource设置为true时,键值为属性文件中的键值名,如果resource设置为false时,key对应的
是validator-rules.xml文件中配置好的参数名,写法如上:<arg1 key="${var:minlength}" name="minlength" resource="false"/>
name="minlength"对应validator-rules.xml文件中配置好的参数名。
<var .../>也是子标签,是给validator-rules.xml文件中配置好的参数传具体的值,上面的配置是给最小的长度设置为6
上面的这段的配置的内容如下:
给对应于struts-config.xml配置文件中名称为:loginForm表单中的userName属性做验证,最小长度不能小于6,如果验证不通过,则
跳转到struts-config.xml配置文件中的<action input="/***.jsp"/>页面。页面中显示的错误信息是属性文件中对应于
validator-rules.xml中配置的<validator name="minlength" ... .... msg="****key">键值
详细说明:
下面介绍一下validation.xml配置文件的标签:
<form-validation></form-validation>是总框架
<formset></formset>是对Form里的数据进行配置
<form name="ActionForm对应的名称"></form>对一个ActionForm里的数据进行验证配置
<field property="ActionForm里的属性名" depends="验证规则,
可以是Validation-rules里定义好的也可以是自定义的验证规则">这里配置一个属性的验证内容
<arg0 name="对应的验证规则名称" key="可以直接填入数值,也可填入变量表达式:
${var:变量名}" resource="true/false"(代表是否从资源文件中读取信息,否则Key的值以参数的形式返回)>
<var></var>定义一个变量的标签体,可以在里面具体设置变量的名称以及数值
<var-name>对应Key里定义的变量名称</var-name>
<var-value>值</var-value>
<msg name="对应的验证规则名称" key="资源文件中定义的变量名称">这里定义了信息变量后,会默认定义的信息变量。
在验证规则中大部分可以使用已经预定义好的规则,它们在validator-rules.xml里,当然我们自己也可以定义规则。
其实,这个文件名可以是任意的,可以起成别的名字,比如:validators.xml,不过,
也要相应修改struts-config.xml文件中的加入validator框架PlugIn中的value属性。
这个value属性用来指定validator-rules文件和具体的验证文件。
==================================================
3
【第3步】配置struts-config.xml配置文件,插入插件,但服务启动时加载validator-rules.xml配置与validation.xml配置
==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>
==================================================
4
【第4步】在ApplicationResources.properties 属性文件中添加struts-config.xml已经定义好的错误信息
==ApplicationResources.properties==
errors.minlength={0} can not be less than {1} characters.
==================================================
5
【第4步】页面输出错误信息
在页面上添加
<html:errors property="username"/>
========================================================================================
第三种方式:(使用自定义Struts Validator验证框架)
1.
【第1步】在validator-rules.xml 文件中添加自定义的信息配置
validator-rules.xml 这个文件包含了一组验证规则,对所有struts应用都适用。一般情况不用修改这个文件,除非要修改或扩展默认规则。
例如添加的信息如下:
== validator-rules.xml ==
<validator
name="startsWith"
classname="self.SelfValidator"
method="validateStartsWith"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.startsWith">
<javascript>
... ... ...
</javascript>
</validator>
说明:
通用的验证规则都在<validator>标签内配置,他有7个属性:
Name属性:name属性指定验证规则的逻辑名,这个名字必须是唯一的。
Classname和method属性:classname和method属性分别指定实现验证规则逻辑的类和方法。
MethodParams:属性用来指定验证方法包含的参数,多个参数之间以逗号隔开(这些参数类型是固定的)。
Msg属性:msg属性指定来自于Resource Bundle中的消息key。当验证失败时,
Validator框架将根据这个消息key到resource Bundle中查找匹配的消息文本,对应属性文件中错误消息的键值。
Depends属性:depends属性指定在调用当前验证规则之前必须先调用的其他验证规则。
2.
【第2步】在ApplicationResources.properties属性文件中添加对应的错误信息
== ApplicationResources.properties ==
errors.startsWith = BAD STARTS ! SHOULD BE 'Mr.' !
说明:这里的键值对应validator-rules.xml配置中的Msg属性
3.
【第3步】在validation.xml文件中对表单进行具体的验证
== validation.xml ==
<form-validation >
<formset>
<form name="userActionForm">
<field property="userName" depends="startsWith">★
</field>
</form>
</formset>
</form-validation>
说明:这里是对userActionForm表单中的userName进行验证,depends属性对应validator-rules.xml配置好的逻辑名,表示,验证的规则
对应validator-rules.xml中逻辑名为"startsWith"的配置信息。
4.
【第4步】编写自定义的类对数据进行验证,但类名与方法名必须对应validator-rules.xml中的Classname和method属性
//自定义验证类
package self;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.ValidatorUtil;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.validator.Resources;
public class SelfValidator {
//验证方法。Object指FormBean,封装要验证的字段;
//ValidatorAction封装validator-rules.xml中此项验证的<validator>定义;
//Field封装validation.xml中要验证字段的<field>定义;
//ActionErrors用于存放错误
public static boolean validateStartsWith (Object formBean,
ValidatorAction action,
Field field,
ActionErrors errors,
HttpServletRequest request) {
//从FormBean中取字段的值,field.getProperty()可获得字段名
String value = ValidatorUtil.getValueAsString(formBean,field.getProperty());
//验证。。。
if(value.startsWith("Mr."))★★//自定义验证规则,这里是验证要验证的字符串是否是以"Mr."开头的。
{
return true;
}else {
//添加错误
errors.add(field.getKey(),Resources.getActionError(request,action,field));
return false;
}
}
}
说明:
这个类的写法是通用的,唯一要变的话,就是在验证规则这里做改变