- 浏览: 31511 次
- 性别:
- 来自: 西安
文章分类
最新评论
进行数据验证的action的执行流程:
当Client端发送请求给Server端时,首先将请求中的参数转换action中的字段,然后执行action中的validate方法
当action中的fielderror 或 actionerror为空时,才会执行execute方法,否则不会执行execute方法.
struts2中两种数据验证框架是:
1.通过重写ActionSupport类中的validate方法进行验证或在调用的方法中直接验证
2.通过数据验证框架进行验证
a.用validate进行数据验证:
这种验证方法相对于第二种方法来说比较灵活,通过判断actionerror和fielderror中内容来判断是否验证成功。
假如fielderror 或者 actionerror有一个不是空的集合,就会跳转到当先action 的 result中 name="input"所对应的页面。
实例:
在validate.jps中有一个form,当提交后会给ValidateAction处理,假如username的长度小于4或者大于6就会将错误加入到fielderror中,并且跳转到input对应的页面,否则就会叫转到success对应的页面.
validate.jsp 部分源码
struts.xml中的配置
ValidateAction类部分源码
b.通过数据验证框架验证
这种验证方法是通过一个配置文件自动的进行数据校验,配置文件的命名规则是‘action的名字''-''validation.xml'.
在与XXXAction同级的目录下,建立配置文件,即为该Action的校验逻辑。该校验XML的dtd格式文件为 http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd
数据校验XML的根元素<validator>下面可以包含两种 子元素:field和validator
1、前者field 是针对字段进行的校验;
2、后者validator 是非字段或者说全局范围的校验。
在介绍完校验是怎么回事后,后面会简单比较一下两种校验方式的区别。
一、字段校验:(field)
有几个地方需要注意一下的。
1、field-validator的type在哪里定义的?
struts2校验框架预设的类在包com.opensymphony.xwork2.validator.validators中,同一目录下的default.xml中定义了field-validator中type的名称和对应的处理类。
其中,name是上面type需要引用的名字,而后面的class则是这些validator对应的类。这些类中大部分都是自解释的,其中fieldexpression比较特殊,它提供了一种多个field之间比较值的机制。
2、param的值又是在哪里找到的呢?
param中的name值在上述类中被定义为属性。譬如说在类com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator中(也就是stringLength对应的处理类),就定义了
boolean trim;
int minLength,maxLength;
及它们的get/set方法。
3、message的注意事项
(1)每个field都必须拥有一个message;message错误信息最后是以addFieldError实现的,也就是说是field一级的错误。
(2)message中可以引用param变量,引用格式为${param1},如上面的例子中对password验证失败的报错信息。
(3)message的内容可以放到全局i18n属性文件中,并在message中以key属性值指定,比如上面例子中对username验证失败的报错信息。
二、非字段校验/全局校验
全局校验和字段校验其实类似,使用的验证器也是那些。区别在于校验的方式和关注点不同:
1、字段校验先指定那个字段要校验,再指定用那些校验器来校验该字段;
2、全局校验不针对特定字段,先指定验证器,再来指定用该校验器校验那些字段。
示例很简单,第一个validator是校验“不为空的字符串”,校验“用户名字段,第二个校验器校验“字符串长度6-10”,校验“密码两个字段。
很明显,如果页面中存在一些共性的验证要求,用这种方式就比针对字段的验证要方便。但这种方式可能不如前一种方式清晰易读。
上面这段话是错误的。
我原以为第二种验证器优先的方式可以一次验证多个field,但经验证struts(ver2.1.6)并不支持多个field的批量验证,只能一个一个写,比较遗憾。
两种验证方式可以混用。
三、其他问题
1、对多验证和跳转逻辑的支持
和《Struts2 数据输入校验(1) —— 函数验证 》中所说内容一样,校验框架也支持多验证和跳转逻辑。比如说在struts.xml文件中配置了
<action name="XXXAction" class="com.myspace.myname.XXXAction" method="newExcuteName">
<result>success.jsp</result>
</action>
则校验文件的名字为XXXAction-newExcuteName-validation.xml
当然,在执行了上面的校验之后,如果存在XXXAction-validation.xml,则还会执行这个文件中定义的校验。
同时需要注意的是,如果该Action存在父类,则会先行执行父类的相应校验。
2、客户端校验
客户端校验是不安全的,但struts仍然提供了客户端的校验
方法是在<s:form>中设置validate属性为true,如果该属性被设置,则struts不会在服务器端验证,取而代之的是在客户端生成Javascript代码。但这些Js代码功能较弱,灵活度也比较低,且不会刷新。因此不推荐使用。
其实struts的控件本身和一般的HTML控件一样,如果想做客户端验证,可以触发它们的onXXX()事件,和通常的HTML页面做法一样。
当Client端发送请求给Server端时,首先将请求中的参数转换action中的字段,然后执行action中的validate方法
当action中的fielderror 或 actionerror为空时,才会执行execute方法,否则不会执行execute方法.
struts2中两种数据验证框架是:
1.通过重写ActionSupport类中的validate方法进行验证或在调用的方法中直接验证
2.通过数据验证框架进行验证
a.用validate进行数据验证:
这种验证方法相对于第二种方法来说比较灵活,通过判断actionerror和fielderror中内容来判断是否验证成功。
假如fielderror 或者 actionerror有一个不是空的集合,就会跳转到当先action 的 result中 name="input"所对应的页面。
实例:
在validate.jps中有一个form,当提交后会给ValidateAction处理,假如username的长度小于4或者大于6就会将错误加入到fielderror中,并且跳转到input对应的页面,否则就会叫转到success对应的页面.
validate.jsp 部分源码
<body> <center> <s:fielderror value="username"/> <form action="validate" method="get"> username: <input type="text" name="username"/> <br/> <input type="submit" value="validate"/> </form> </center> </body>
struts.xml中的配置
<action name="validate" class="ValidateAction"> <result name="success">validateresult.jsp</result> <result name="input">validate.jsp</result> </action>
ValidateAction类部分源码
@SuppressWarnings("serial") public class ValidateAction extends ActionSupport{ private String username; private String password; private String repassword; private Date birthday; private Date graduation; //setXXX getXXX省略 @Override public String execute() throws Exception { return "success"; } @Override public void validate() { if(username.length() < 4 || username.length() > 6) { this.addFieldError("username", "the length of username should between 4 and 6"); } } }
b.通过数据验证框架验证
这种验证方法是通过一个配置文件自动的进行数据校验,配置文件的命名规则是‘action的名字''-''validation.xml'.
在与XXXAction同级的目录下,建立配置文件,即为该Action的校验逻辑。该校验XML的dtd格式文件为 http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd
数据校验XML的根元素<validator>下面可以包含两种 子元素:field和validator
1、前者field 是针对字段进行的校验;
2、后者validator 是非字段或者说全局范围的校验。
在介绍完校验是怎么回事后,后面会简单比较一下两种校验方式的区别。
一、字段校验:(field)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <field name="username"> <field-validator type="requiredstring"> <message key="error.username.required"/> </field-validator> </field> <field name="password"> <field-validator type="stringlength"> <param name="trim">true</param> <param name="minLength">4</param> <param name="maxLength">10</param> <message>password should be ${minLength} to ${maxLength} characters long.</message> </field-validator> </field> <!-- 如果使用DomainModel方式接受表单数据,则为如下形式 <field name="user.username"> --> </validators>
有几个地方需要注意一下的。
1、field-validator的type在哪里定义的?
struts2校验框架预设的类在包com.opensymphony.xwork2.validator.validators中,同一目录下的default.xml中定义了field-validator中type的名称和对应的处理类。
<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="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"/> </validators>
其中,name是上面type需要引用的名字,而后面的class则是这些validator对应的类。这些类中大部分都是自解释的,其中fieldexpression比较特殊,它提供了一种多个field之间比较值的机制。
2、param的值又是在哪里找到的呢?
param中的name值在上述类中被定义为属性。譬如说在类com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator中(也就是stringLength对应的处理类),就定义了
boolean trim;
int minLength,maxLength;
及它们的get/set方法。
3、message的注意事项
(1)每个field都必须拥有一个message;message错误信息最后是以addFieldError实现的,也就是说是field一级的错误。
(2)message中可以引用param变量,引用格式为${param1},如上面的例子中对password验证失败的报错信息。
(3)message的内容可以放到全局i18n属性文件中,并在message中以key属性值指定,比如上面例子中对username验证失败的报错信息。
二、非字段校验/全局校验
全局校验和字段校验其实类似,使用的验证器也是那些。区别在于校验的方式和关注点不同:
1、字段校验先指定那个字段要校验,再指定用那些校验器来校验该字段;
2、全局校验不针对特定字段,先指定验证器,再来指定用该校验器校验那些字段。
<validators> <validator type="requiredstring" short-circuit="true"> <param name="fieldName">username</param> <message key="error.field.required"/> </validator> <validator type="stringlength"> <param name="trim">true</param> <param name="minLength">4</param> <param name="maxLength">10</param> <param name="fieldName">password</param> <message>password should be ${minLength} to ${maxLength} characters long.</message> </validator> </validators>
示例很简单,第一个validator是校验“不为空的字符串”,校验“用户名字段,第二个校验器校验“字符串长度6-10”,校验“密码两个字段。
很明显,如果页面中存在一些共性的验证要求,用这种方式就比针对字段的验证要方便。但这种方式可能不如前一种方式清晰易读。
上面这段话是错误的。
我原以为第二种验证器优先的方式可以一次验证多个field,但经验证struts(ver2.1.6)并不支持多个field的批量验证,只能一个一个写,比较遗憾。
两种验证方式可以混用。
三、其他问题
1、对多验证和跳转逻辑的支持
和《Struts2 数据输入校验(1) —— 函数验证 》中所说内容一样,校验框架也支持多验证和跳转逻辑。比如说在struts.xml文件中配置了
<action name="XXXAction" class="com.myspace.myname.XXXAction" method="newExcuteName">
<result>success.jsp</result>
</action>
则校验文件的名字为XXXAction-newExcuteName-validation.xml
当然,在执行了上面的校验之后,如果存在XXXAction-validation.xml,则还会执行这个文件中定义的校验。
同时需要注意的是,如果该Action存在父类,则会先行执行父类的相应校验。
2、客户端校验
客户端校验是不安全的,但struts仍然提供了客户端的校验
方法是在<s:form>中设置validate属性为true,如果该属性被设置,则struts不会在服务器端验证,取而代之的是在客户端生成Javascript代码。但这些Js代码功能较弱,灵活度也比较低,且不会刷新。因此不推荐使用。
其实struts的控件本身和一般的HTML控件一样,如果想做客户端验证,可以触发它们的onXXX()事件,和通常的HTML页面做法一样。
发表评论
-
8、struts2拦截器
2012-09-05 20:58 652转载自http://downpour.iteye.com/bl ... -
7、OGNL表达式
2012-09-01 11:37 663<li>访问值栈中的action的普通属性: ... -
5、struts2 action获取参数的三种方法
2012-08-31 10:58 8231:ModelDriven方式: <body> ... -
6、Struts2_访问Web元素(request session application等)
2012-08-31 13:11 1084struts2后台的Action跟我们前台的页面来通讯的时候, ... -
0、Struts2的运行机制
2012-08-31 10:10 654当你在客户端敲http://localhost:8080/st ... -
4、配置struts2中调用action的方法
2012-08-31 09:56 746Action执行的时候并不一定要执行execute方法 1.配 ... -
2.2、Struts2数据验证续
2012-08-31 06:53 758用struts2标签库来实现Str ... -
2.3、struts freemarker
2012-08-30 07:39 954FreeMarker是一个非常优秀 ... -
3、struts2中的jsp页面链接的路径问题
2012-08-30 07:18 800struts2中的jsp页面链接的路径问题是根据action的 ... -
2、struts2的action及result总结
2012-08-29 17:58 12141、action 具体视图的返回可以由用户自己定义的Actio ... -
1、struts2 namespace总结
2012-08-29 17:09 798struts2.2.1 1.namespace namesp ...
相关推荐
10.3.2 使用自定义数据验证器 229 10.4 验证框架的高级主题 230 10.4.1 在域对象级别验证 231 10.4.2 使用验证上下文优化验证 233 10.4.3 验证继承 235 10.4.4 验证短路效应 236 10.4.5 使用注解声明验证 237 10.5 ...
5.7 Struts2自定义标签实现图形验证功能 121 第6章 Struts2非JSP视图技术 125 6.1 velocity视图技术使用介绍 125 6.2 freemarker视图技术使用介绍 128 6.3 JasperReports报表视图技术使用介绍 130 第7章 Struts2类型...
作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,如数据类型转换、文件上传和下载、提高Struts 2应用的安全性、调试与性能分析、FreeMarker、Velocity、Ajax,等等。跟随作者一道深入Struts 2,聆听...
因为上传时文件不能大于15MB,所以我删掉了一些jar包,要是出错了,请自己添加jar包,但是源码是不会出错的。
书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。...
主要是为了引入时间等字段,来试验一下struts2的时间标签是否好用.这次为了做成一个好点的实例.所以换掉了表结构.为歌词表.并附带2万首歌词的数据库.因为歌词插入数据太大.所以单另上传了.如果不需要这两万条数据的...
2.1 初识mvc新秀struts 2 33 2.1.1 mvc概述 33 .2.1.2 struts 2的mvc实现 35 2.1.3 struts 2的基本组成 36 2.1.4 struts 2的常用类介绍 38 2.1.5 struts 2的业务控制器action实现 39 2.1.6 struts 2的处理...
2.1人介绍应用框架 mvc和model2 8 2.2 Struts原理、开发及项目实施 8 2.3使用STRUST控制流 8 2.4讨论STRUTS的优缺点 9 2.5 Struts入门经验 9 2.6用strtus制作登陆页面: 9 第3章Struts 基础学习 9 3.1Struts标记库 9...
案例5-6 使用Validator验证框架实现注册表单的数据验证 201 5.4.4 Struts标记库 206 案例5-7 采用Struts标记库实现身份验证应用相关页面 207 第6章 Eclipse中Hibernate的开发 211 6.1 Hibernate概述 211 ...
5 数据验证...........................................................................................................................14 5.1 validate 方法验证..............................................
第20章 数据格式转换(struts 2.x+hibernate+dom4j) 20.1 关于xml文件基础知识 20.2 下载dom4j 20.3 数据格式转换功能前期准备 20.4 数据格式转换功能具体开发 20.5 多学两招——其他操作xml文件...
提供典型应用案例,剖析JSP/Servret技术与Struts 2技术在Web开发中的不同 提供完整的应用案例,使读者可以深入体会SSH开发模式的精髓 所有开发工具和框架均使用目前的最新版本,紧跟技术发展的趋势 提供230个实例和4...
16.2 协同使用Spring和WebWork 2/Struts 2 16.3 集成Spring和Tapestry 16.3.1 集成Spring和Tapestry 3 16.3.2 集成Spring和Tapestry 4 16.4 协同使用Spring和JSF 16.4.1 解析JSF管理的属性 16.4.2 解析Spring...
提供典型应用案例,剖析JSP/Servret技术与Struts 2技术在Web开发中的不同 提供完整的应用案例,使读者可以深入体会SSH开发模式的精髓 所有开发工具和框架均使用目前的最新版本,紧跟技术发展的趋势 提供230个实例...
16.2协同使用spring和webwork2/struts2 16.3集成spring和tapestry 16.3.1集成spring和tapestry3 16.3.2集成spring和tapestry4 16.4协同使用spring和jsf 16.4.1解析jsf管理的属性 16.4.2解析springbean 16.4.3...
2.1 数据库新技术 3 2.2 物联网技术 3 2.3 不确定数据管理 4 2.4 非PC\Windows下的计算机应用 4 3. 企业参观体会 6 4. 基于JSP的美文欣赏查询系统设计与实现 8 4.1 系统需求分析 8 4.1.1 用例分析 8 4.1.2 数据逻辑...
16.2 协同使用Spring和WebWork 2/Struts 2 16.3 集成Spring和Tapestry 16.3.1 集成Spring和Tapestry 3 16.3.2 集成Spring和Tapestry 4 16.4 协同使用Spring和JSF 16.4.1 解析JSF管理的属性 16.4.2 解析Spring...