9 Struts 2的输入校验

输入校验有两种:客户端和服务器端校验。客户端校验一般是通过JavaScript来完成,这种校验可减轻服务器压力。服务器校验主要通过服务器端编程的方式来完成。

(1) 客户端校验

客户端校验一般是通过JavaScript来完成,这种校验可减轻服务器压力。

(2) 服务器端校验

有了客户端验证为何还要服务器端验证? —— 为了防止客户端验证失败。

服务器端验证一般是通过后台的硬编码Servlet来实现的。

9.1 Struts 2中手工实现输入校验

Struts 2中最底层、最原始的数据校验方法——手工实现数据校验。

(1) 重写validate方法校验单个处理逻辑

重写ActionSupport类的validate方法校验单个处理逻辑,如下Action中重写validate的代码:

/** Struts2手工验证:实现ActionSupport类的validate方法

* 先执行到validate方法,再执行到execute方法*/

@Override

publicvoid validate() {

if(user.getName()==null||"".equals(user.getName().trim())){

this.addFieldError("user", "user name is not null!");

//addFieldError添加错误信息,在JSP页面中用<s:fielderror>标记取出

}else{

Pattern p = Pattern.compile("\\w{6,20}");

Matcher m = p.matcher(user.getName().trim());

if(m.matches()==false){

this.addFieldError("user","用户名必须是字母数字下划线6-20个字符!");}}}

JSP页面显示错误信息的代码:

<!--<s:fielderror>标记用来显示Action中的addFieldError方法封装的错误信息  -->

<s:fielderror></s:fielderror>

(2) 重写validateXX方法校验多个处理逻辑

多个表单对应一个Action可以减少类的数量。

在同一个Action类中添加validateXX方法可实现同一个Action中对不同表单的校验

Action示例:

publicclass OneAction extends ActionSupport{

/** * 多个表单对应一个Action类:重写validateXX方法 */

privatestaticfinallongserialVersionUID = 1L;

private User user;//领域对象,在JSP页面中用user.name来获取name

get/set方法

@Override

public String execute() throws Exception {

returnsuper.execute();

}

public String login(){

returnSUCCESS;

}

public String reg(){

returnSUCCESS;

}

/**

* 添加validateXX方法,在同一个Action中实现对不同的表单的校验

*/

publicvoid validateReg(){//对reg的方法进行校验

if(user.getName()==null||"".equals(user.getName().trim())){

this.addFieldError("user","用户名不能为空");

}

}

publicvoid validateLogin(){//对login方法校验

if(!"admin".equals(user.getName())||!"000".equals(user.getPass())){this.addFieldError("user","用户名或密码错误");

}}}

Action类中:this.addFieldError("user","用户名或密码错误");

将错误信息添加到fielderror中,在JSP中用s:fielderror来显示。

s:fielderror标记,用来显示Action页面中添加进去的错误信息:

在Action类中写法:this.addFieldError("user","用户名不能为空");

<s:fielderror></s:fielderror>

9.2 基于Struts 2验证框架的输入校验

Struts 2提供了更高效,简易的校验框架,用户只需设置校验配置文件即可完成输入校验。基于验证框架来完成输入校验,只需在与Action同目录下下创建一个xml格式的验证文件即可,而无需validate方法。

实现了Action类与配置文件的分离,在配置文件中实现对Action类中某字段的校验。

(1) 编辑校验规则文件

校验文件是XML格式,命名规则:<Action类名>-validation.xml ,每一个Action都可以对应有一个这样的校验配置文件,用来对当前Action进行校验。

field用来指定Action中要校验的属性字段,属性字段名称应该与field的name属性值相同 ,在field中一般添加field-validator标记,用来指定验证规则(是否为空规则、字符组成规则)param用来指定正则表达式,message指定不符合规则的错误提示信息。

<Action>-validation.xml文件示例:

(2) 字段校验和非字段校验:

<validators>

<!-- 字段校验field -->

<fieldname="name">

<field-validatortype="requiredstring">

//requiredstring指的是必填字符串校验器 ,也就是说校验规则是必填字符串校验器

<paramname="trim">true</param>

<message>必须输入用户名!!!</message>

</field-validator>

<field-validatortype="regex">

<paramname="expression"><![CDATA[(\w{4,25})]]></param>

<message>用户名只能是字母和数字,且长度在4-25之间</message>

</field-validator>

</field>

<!-- 非字段校验 validator-->

<validatortype="校验器名称">

<paramname="fieldName">要被校验的字段</param>

<paramname="参数名">参数值</param>

<message>校验错误提示信息</message>

</validator>

</validators>

字段校验和非字段校验可混合在同一个XX-validation.xml文件中,但是有顺序:所有非字段优于字段,非字段先校验,若某个字段的非字段校验失败,则字段方式校验都不执行,反之,字段校验却不会影响非字段。

(3) 配置校验文件

XX-validation.xml校验文件示例:

<!DOCTYPEvalidatorsPUBLIC"-//OpenSymphony Group//XWork Validator 1.0.2//EN"

"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators>

//字段校验field

<fieldname="password">

<field-validatortype="requiredstring">

<messagekey="error.password.required"/>

</field-validator>

<field-validatortype="stringlength">

<paramname="trim">true</param>

<paramname="minLength">4</param>

<paramname="maxLength">10</param>

<messagekey="errors.range"/>

</field-validator>

</field>

<fieldname="password2">

<field-validatortype="requiredstring">

<messagekey="error.password2.required"/>

</field-validator>

</field>

//非字段校验validator

<validatortype="expression">

<paramname="expression">password eq password2</param>

<messagekey="error.password.match"/>

</validator>

</validators>

配置中的两个问题:

一、验证器名称

xwork-2.0.4.jar 包中/com/opensymphony/xwork2/validator/validators 路径下default.xml文件中有所有 Struts2 自带的输入校验器定义

分为以下几种:

1.required必填

2.requiredstring必填字符串

3.int整数

4.long

5.short

6.double

7.date日期

8.expression

9.fieldexpression字段表达式

10.email邮件地址

11.url网址

12.visitor

13.conversion

14.stringlength字符串长度

15.regex正则表达式

16.conditionalvisitor

二、用于输出的提示信息用一个key来表示

message标签的key属性,其实是在一个用户自定义的资源文件中提前定义好了的,方便实现国际化。

***用法:

首先自定义一个资源文件errorMsgs.properties

spacer.gif

然后,将该资源文件在struts.xml中进行配置:

<constantname="struts.custom.i18n.resources"value="errorMsgs"></constant>

最后才可以在验证文件中使用:

<fieldname="pass">

<field-validatortype="requiredstring">

<paramname="trim">true</param>

<messagekey="pass.required"/>

</field-validator>

</field>

9.3 使用客户端校验

Struts2要完成客户端校验,视图页面就必须使用Struts2标签库。然后在<s:form>标签中添加validate=true属性即可。formtheme不能是simple

<s:formaction="validateAction"validate="true"></s:form>

其他任何文件不作改动,查看页面源码发现多了两个JS文件,但效果并无太大区别。

<script type="text/javascript" src="/Struts2_Validate_ByFrame/struts/xhtml/validation.js"></script>

<script type="text/javascript" src="/Struts2_Validate_ByFrame/struts/utils.js"></script>

9 Struts 2的输入校验

输入校验有两种:客户端和服务器端校验。客户端校验一般是通过JavaScript来完成,这种校验可减轻服务器压力。服务器校验主要通过服务器端编程的方式来完成。

(1) 客户端校验

客户端校验一般是通过JavaScript来完成,这种校验可减轻服务器压力。

(2) 服务器端校验

有了客户端验证为何还要服务器端验证? —— 为了防止客户端验证失败。

服务器端验证一般是通过后台的硬编码Servlet来实现的。

9.1 Struts 2中手工实现输入校验

Struts 2中最底层、最原始的数据校验方法——手工实现数据校验。

(1) 重写validate方法校验单个处理逻辑

重写ActionSupport类的validate方法校验单个处理逻辑,如下Action中重写validate的代码:

/** Struts2手工验证:实现ActionSupport类的validate方法

* 先执行到validate方法,再执行到execute方法*/

@Override

publicvoid validate() {

if(user.getName()==null||"".equals(user.getName().trim())){

this.addFieldError("user", "user name is not null!");

//addFieldError添加错误信息,在JSP页面中用<s:fielderror>标记取出

}else{

Pattern p = Pattern.compile("\\w{6,20}");

Matcher m = p.matcher(user.getName().trim());

if(m.matches()==false){

this.addFieldError("user","用户名必须是字母数字下划线6-20个字符!");}}}

JSP页面显示错误信息的代码:

<!--<s:fielderror>标记用来显示Action中的addFieldError方法封装的错误信息  -->

<s:fielderror></s:fielderror>

(2) 重写validateXX方法校验多个处理逻辑

多个表单对应一个Action可以减少类的数量。

在同一个Action类中添加validateXX方法可实现同一个Action中对不同表单的校验

Action示例:

publicclass OneAction extends ActionSupport{

/** * 多个表单对应一个Action类:重写validateXX方法 */

privatestaticfinallongserialVersionUID = 1L;

private User user;//领域对象,在JSP页面中用user.name来获取name

get/set方法

@Override

public String execute() throws Exception {

returnsuper.execute();

}

public String login(){

returnSUCCESS;

}

public String reg(){

returnSUCCESS;

}

/**

* 添加validateXX方法,在同一个Action中实现对不同的表单的校验

*/

publicvoid validateReg(){//对reg的方法进行校验

if(user.getName()==null||"".equals(user.getName().trim())){

this.addFieldError("user","用户名不能为空");

}

}

publicvoid validateLogin(){//对login方法校验

if(!"admin".equals(user.getName())||!"000".equals(user.getPass())){this.addFieldError("user","用户名或密码错误");

}}}

Action类中:this.addFieldError("user","用户名或密码错误");

将错误信息添加到fielderror中,在JSP中用s:fielderror来显示。

s:fielderror标记,用来显示Action页面中添加进去的错误信息:

在Action类中写法:this.addFieldError("user","用户名不能为空");

<s:fielderror></s:fielderror>