Struts2数据校验

1.常见数据校验方法

表单数据的校验方式:

表单中的数据必须被效验以后才能够被使用,常用的效验方式分为两种:

前台校验:也称之为客户端效验,主要是通过JS编程的方式进行表单数据的验证

后台校验:也称之为服务器端校验,这里指的是使用Struts2通过xml配置的方式进行表单数据验证

Struts2也提供了数据校验的方式:

Struts2数据校验通过拦截器完成:

<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>

Struts使用拦截器实现数据校验的原理:jsp页面中的表单数据提交之后是被Action类处理,例如登录提交之后,action的中先进行validate()的一个方法来验证数据,如果数据验证成功,则继续执行action的处理程序,如果数据验证不成功,则补再执行action的处理程序。但是如果让每一个的提交都先执行validate()呢?并且如何判断validate()失败之后不在执行处理程序呢?

这里就可以使用拦截器,因为拦截器是在action对象创建之后执行,执行拦截器之后再执行action类。所有,可以让拦截器先执行validate()方法,如果校验不成功,就不再执行action处理程序。

2.Struts数据校验方式

2.1.代码方式验证Action中所有的方法

使用代码方法校验Action中的所有方法,只需要在Action中重写一个固定方法:validate(),把校验规则现在这里里面即可。拦截器会自动对Action中的所有处理方法执行这个验证。

代码示例:

package b_vaild;

import com.opensymphony.xwork2.ActionSupport;

/**
* 注意:如果要想使用Struts的数据校验功能,就必须继承ActionSupport
*/
public class UserAction extends ActionSupport{ //封装请求数据
private User user; public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} //重写数据验证的方法
@Override
public void validate() {
//用户名非空
if (user.getUserName()==null || "".equals(user.getUserName())){
//保存错误信息
super.addFieldError("userName","用户名必须填写!");
} //密码
if (user.getPwd()==null || "".equals(user.getPwd())){
super.addFieldError("pwd","密码必填");
}
} //业务方法
public String register(){
System.out.println(user);
return SUCCESSuu;
}
}

需要注意两点:

1.必须要继承ActionSupport。

2.验证方法的名字必须是validate().

2.2.代码方式验证Action中指定的方法

上面的方法会对Action中的所有处理程序执行数据校验,但是很多时候只需要对个别处理程序校验,其他方法不需要校验,例如对数据表单的提交处理程序就必须提供校验,但是对转发或者列表展示等是不需要数据校验的。

这个时候就需要对Action中指定的方法进行数据校验,具体操作方法只需要修改验证方法的名字,原本是validate()修改为:validate()+要验证的方法

例如:

public void validateRegister() {……}

只会验证当前action的register方法!

2.3.XML方式验证Action中所有的方法

使用上面的代校验Action方法非常的繁琐,需要重复写校验逻辑,例如:非空验证,数值验证,email验证,日期等

更推荐的是使用Struts的xml方式验证,因为这种方式验证时Struts已经对常用的验证进行了封装,即提供了一些常用的验证器,直接使用即可

常用验证器的位置:

xwork-core-2.3.4.1.jar/com/opensymphony/xwork2/validator/validators/default.xml

常用的验证器:

<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>

required:

确保某给定字段的值不是空值 null

requiredstring:

确保某给定字段的值既不是空值 null, 也不是空白.

trim 参数. 默认为 true, 表示 struts 在验证该字段值之前先剔除前后空格.

stringlength:

验证一个非空的字段值是不是有足够的长度.

minLength: 相关字段的最小长度. 若没有给出这个参数, 该字段将没有最小长度限制

maxLength:相关字段的最大长度. 若没有给出这个参数, 该字段将没有最大长度限制

trim: 在验证之前是否去除前后空格

int:

检查给定字段的值是否可以被转换为一个整数且在一定范围

min: 相关字段的最小值. 若没给出这个参数, 该字段将没有最小值限制

max: 相关字段的最大值. 若没给出这个参数, 该字段将没有最大值限制

date:

确保某给定日期字段的值落在一个给定的范围内

max:相关字段的最大值. 若没给出这个参数, 该字段将没有最大值限制

min:相关字段的最小值. 若没给出这个参数, 该字段将没有最小值限制

email:

检查给定 String 值是否是一个合法的 email

url:

检查给定 String 值是否是一个合法的 url

regex:

检查某给定字段的值是否与一个给定的正则表达式模式相匹配.

expresssion*: 用来匹配的正则表达式

caseSensitive: 是否区分字母的大小写. 默认为 true

trim: 是否去除前后空格. 默认为 true

conversion:

转换校验器,指定在类型转换失败时,提示的错误信息

visitor:

用于校验action中的复合属性,它指定一个校验文件用于校验复合属性中的属性

expression:

OGNL表达式校验器,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中

double:

双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值 `

具体配置方法:

1.创建配置文件,文件名命名语法:ActionClassName-validation.xml

注意:此xml需要与当前要验证的action在同一个目录

举例:UserAction-validation.xml

2.写XML

<?xml version="1.0" encoding="UTF-8"?>

  <!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators>
<!--验证的每一个字段用filed表示--> <!--验证用户名-->
<field name="user.userName">
<!--指定使用的验证器,此处选择非空验证-->
<field-validator type="requiredstring">
<!--验证失败的错误提示信息-->
<message>用户名不能为空</message>
</field-validator>
</field> <!--验证pwd-->
<field name="user.pwd">
<!--密码非空-->
<field-validator type="requiredstring">
<message>密码不能为空</message>
</field-validator> <!--密码长度验证-->
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">8</param>
<message>密码必须为6-8位!</message>
</field-validator>
</field> <!--验证日期-->
<field name="user.birth">
<field-validator type="date">
<message>日期格式不对!</message>
</field-validator>
</field> <!--验证email-->
<field name="user.email">
<field-validator type="email">
<message>邮箱格式错误!</message>
</field-validator>
</field>
</validators>

2.4.XML方式验证Action中指定的方法

验证Action中指定方法与上面xml验证方式大致相同:验证xml内容不变,修改文件名:

语法:ActionClassName-ActionName-validation.xml

举例只验证UserAction中的register方法,则文件命名为:UserAction-user_register-validation.xml,user_register是xml中action的name

2.5.验证总结

代码:

重写validate(),验证action所有方法

validate(),验证指定“方法名”的方法

XML:

验证所有方法:ActionClassName-validation.xml

验证指定方法:ActionClassName-actionName-validation.xml

代码验证:

比较灵活,可以满足所有要求

比较繁琐,要写重复的验证判断逻辑

适合:表单字段较少的情况用!

XML验证:

通用,但不够灵活,可以验证特定简单的业务

适合:验证表单字段较多,可以大大简化代码!(配置文件过多)

3.验证错误处理

Struts2在进行数据校验的时候,验证失败,会返回input视图,要求我们要在struts.xml中配置input视图对应的错误页面!

struts.xml中配置:

<!-- 注册失败跳转到注册页面,显示失败信息 -->
<global-results>
<result name="input">/register.jsp</result>
</global-results> ``
**JSP页面显示错误:**
方式1:显示所有错误:
```jsp
<%@taglib prefix="s" uri="/struts-tags" %>
<%--显示的是struts在运行时期间产生的所有错误--%>
<s:fielderror fieldName="user.userName"/>
<s:fielderror fieldName="user.pwd"/>
<s:fielderror fieldName="user.email"/>
<s:fielderror fieldName="user.birth"/>

方式2:显示指定的错误:

方式1 中会在表单砂上面显示,一般我们希望的是能够在表单后面显示错误信息,但是验证器又默认是带有换行操作的,所以可以通过css来取消换行操作,然后把错误信息放在每个表单后面:

<!-- 修改struts标签默认的样式: 不让换行 -->
<style type="text/css">
ul{
display: inline;
}
ul li{
display: inline;
color: red;
}
</style>

显示指定错误信息:

<s:fielderror fieldName="user.userName"></s:fielderror>

方式3:

既然默认是带有换行操作的,那么也可以修改源码取消换行,这样就不用写css了

具体操作方式是:

找到fielderror标签定义的模板文件:

Struts-core.jar\template\simple\ fielderror.ftl

把修改后的fielderror.ftl文件,放到src/ template/ simple/ fielderror.ftl

这样标签显示的样式就修改了!

Struts2数据校验的更多相关文章

  1. struts2 数据校验

    通过struts2中延续自xwork框架的validation.xml配置方式进行数据校验,因struts2 下存在三种请求参数的注入方式,固按照不同注入方式对validation.xml的配置进行总 ...

  2. 第六章、Struts2数据校验

    一.三种实现方式 ① 用validate()方法实现数据校验 继承ActionSupport类,该类实现了Validateable接口,该接口中定义了一个validate()方法,在自定义的Actio ...

  3. 06章 Struts2数据校验

    一.三种实现方式 ① 用validate()方法实现数据校验 继承ActionSupport类,该类实现了Validateable接口,该接口中定义了一个validate()方法,在自定义的Actio ...

  4. struts2 之 struts2数据校验

    1. 数据校验一般分为2类:前端的校验(js校验),后端的校验(java代码):实际开发中大部分情况下都是采用js校验.在对数据安全要求较高的情况下可能会采用后端验证. 2.  Struts2提供了后 ...

  5. struts2数据校验与国际化

    数据校验: Action里的validate()方法能校验action类所有的方法,如果有错,如:addFieldError,会自动返回到workflow校验拦截器不向下继续进行,不用return i ...

  6. Struts2数据校验方法

    方法: 1.在Action类中execute()方法中进行校验. 优点:Action类无需继承框架中的类. 缺点:(1)当有多个校验时,代码重复,违反高内聚,低耦合. 2.重写框架ActionSupp ...

  7. Struts2 数据校验之四兄弟

    现在是科技的时代,大多数人都在网上购物了, 我们都碰到过相同的问题,各大网站弄的那些各种各样的注册页面,相信大家都深有体会. 有了这验证就很好的保证了我们的信息的准确性和安全性. 接下来我给大家讲解一 ...

  8. Struts2 数据校验流程

  9. Struts2第十篇【数据校验、代码方式、XML配置方式、错误信息返回样式】

    回顾以前的数据校验 使用一个FormBean对象来封装着web端来过来的数据 维护一个Map集合保存着错误信息-对各个字段进行逻辑判断 //表单提交过来的数据全都是String类型的,birthday ...

随机推荐

  1. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  2. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  3. C#4.0泛型的协变,逆变深入剖析

    C#4.0中有一个新特性:协变与逆变.可能很多人在开发过程中不常用到,但是深入的了解他们,肯定是有好处的. 协变和逆变体现在泛型的接口和委托上面,也就是对泛型参数的声明,可以声明为协变,或者逆变.什么 ...

  4. 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查。。。

    异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Ser ...

  5. submit text3常用快捷键

    在网上找了一些submit text的快捷键: Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选择需要合并的 ...

  6. 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~

    最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...

  7. ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案

    好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...

  8. PHP获取客户端IP

    /** * 获取客户端IP */ function getClientIp() { $ip = 'unknown'; $unknown = 'unknown'; if (isset($_SERVER[ ...

  9. bzoj1723--前缀和(水题)

    题目大意: 你难以想象贝茜看到一只妖精在牧场出现时是多么的惊讶.她不是傻瓜,立即猛扑过去,用她那灵活的牛蹄抓住了那只妖精.     "你可以许一个愿望,傻大个儿!"妖精说.     ...

  10. java中if和switch哪个效率快

    首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断:而 switch 只能对基本类型进行数值比较.两者的可比性就仅限在两个基本类型比较的范围内.说到基本类型 ...