- 浏览: 33012 次
- 性别:
- 来自: 西安
文章分类
最新评论
进行数据验证的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 721转载自http://downpour.iteye.com/bl ... -
7、OGNL表达式
2012-09-01 11:37 694<li>访问值栈中的action的普通属性: ... -
5、struts2 action获取参数的三种方法
2012-08-31 10:58 8781:ModelDriven方式: <body> ... -
6、Struts2_访问Web元素(request session application等)
2012-08-31 13:11 1152struts2后台的Action跟我们前台的页面来通讯的时候, ... -
0、Struts2的运行机制
2012-08-31 10:10 701当你在客户端敲http://localhost:8080/st ... -
4、配置struts2中调用action的方法
2012-08-31 09:56 787Action执行的时候并不一定要执行execute方法 1.配 ... -
2.2、Struts2数据验证续
2012-08-31 06:53 798用struts2标签库来实现Str ... -
2.3、struts freemarker
2012-08-30 07:39 1012FreeMarker是一个非常优秀 ... -
3、struts2中的jsp页面链接的路径问题
2012-08-30 07:18 854struts2中的jsp页面链接的路径问题是根据action的 ... -
2、struts2的action及result总结
2012-08-29 17:58 12501、action 具体视图的返回可以由用户自己定义的Actio ... -
1、struts2 namespace总结
2012-08-29 17:09 846struts2.2.1 1.namespace namesp ...
相关推荐
在Struts2中,Model代表应用程序的核心业务逻辑,View负责展示数据,而Controller则是这两者之间的桥梁,接收用户的请求并控制应用程序的流程。 Hibernate,另一方面,是一个强大的对象关系映射(ORM)框架,它允许...
9. **Validation框架**:Struts 2提供了内置的验证框架,可以在客户端和服务器端进行数据验证,确保输入的有效性。 10. **Internationalization(国际化)**:Struts 2支持多语言环境,可以方便地实现应用的国际化...
19_黑马程序员_struts2.1视频教程_对Action中所有方法进行输入校验.rar和22_黑马程序员_struts2.1视频教程_基于XML配置方式实现对action的所有方法进行校验.rar这两部分将详细介绍Struts2的验证机制。无论是基于注解...
标题中的"struts2-core-2.1.8.1.jar"是Struts2框架的核心库,包含了实现框架功能的关键组件。 在描述中提到了"最新版本的struts2-core-2.1.8.1",这意味着该版本是在发布时的最新稳定版。Struts2的核心库包括了...
- **Validation框架**:Struts 2提供了基于注解或XML的验证机制,可以对Action属性进行验证,确保输入数据的有效性。 总的来说,Struts 2.1.8.1+xwork-2.1.6源码分析可以深入了解其内部工作原理,包括请求处理流程...
在Struts2中,我们可以利用其内建的Ajax支持,如Dojo Taglib,来实现异步数据验证。 在标题提及的“基于dojo的ajax标签的即时验证小程序”中,开发者可能创建了一个简单的Web应用,用于演示如何在Struts2中使用Dojo...
这个压缩包包含了两个关键的组件:json-lib-2.1.jar和struts2-json-plugin-2.1.8.1.jar,它们是Struts2支持JSON(JavaScript Object Notation)序列化和反序列化的关键。 1. **json-lib-2.1.jar**: JSON是一种轻...
这个“struts2.1包”是该框架的一个旧版本,可能包含了Struts2的核心库和其他相关的依赖库,用于支持开发人员按照教程中的步骤进行编程实践。 在Web开发中,Struts2框架提供了强大的控制层,使得开发者能够更加专注...
- OGNL(Object-Graph Navigation Language):Struts2的默认表示层语言,用于数据绑定和表达式处理,使得在视图和模型之间传递数据更加方便。 -拦截器(Interceptors):Struts2的拦截器机制类似于AOP(面向切面...
2. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为默认表达式语言,用于在Action对象和视图之间传递数据。开发者可以通过OGNL轻松地访问和修改模型中的属性,以及执行复杂的表达式。 3. **...
6. **类型转换(Type Conversion)**:Struts2自动处理表单数据的类型转换,减少了开发者手动处理数据格式化的工作。 7. **验证框架**:内置的验证框架可以方便地对用户输入进行验证,提供了一套灵活的验证规则和...
2. **xwork-core.jar**:XWork是Struts 2的前身,其提供的许多组件被Struts 2重用,如对象容器、类型转换、验证框架等。 3. **ognl.jar**:Object-Graph Navigation Language (OGNL) 是Struts 2中的表达式语言,...
Struts2提供了强大的数据验证框架,使得开发者能够方便地实现客户端和服务器端的数据验证。下面我们将深入探讨Struts2数据校验的相关知识点。 一、Struts2数据校验概述 Struts2的数据验证分为两种类型:客户端验证...
- 使用Struts 2提供的验证规则简化验证过程。 - 自定义错误信息提高用户体验。 - **文件上传与下载**: - 利用FileUpload拦截器实现文件上传功能。 - 设计Action处理文件存储和访问逻辑。 - 支持大文件上传和...
1. **拦截器机制**:Struts2的核心特性之一是其强大的拦截器链,它允许我们在请求处理过程中插入自定义的逻辑,如日志记录、权限验证、性能监控等。 2. **动态方法调用**:Struts2支持动态方法调用,使得可以根据...
4. **OGNL(Object-Graph Navigation Language)表达式语言**:Struts2默认使用OGNL作为视图和模型之间的数据交换语言,允许在JSP页面中动态访问和修改对象属性,提高了视图的灵活性。 5. **插件体系**:Struts2...
2. **Interceptor**:拦截器是Struts 2的一大特色,它们允许开发者在请求处理流程中插入自定义逻辑,如日志、权限验证、事务管理等。`xwork-core.jar`通常包含拦截器的基础实现。 3. **Plug-ins**:Struts 2支持...
本教学方案V2.1专注于介绍如何使用Struts2进行实际项目开发,旨在帮助初学者快速掌握该框架的核心概念和技术。 在Struts2框架中,核心组件包括Action类、配置文件(struts.xml)、拦截器(Interceptors)以及结果...
总结来说,Struts2提供了完善的框架和工具,使得开发登录注册功能变得容易,同时通过验证机制保证了数据的准确性和安全性。通过学习和实践这个主题,开发者可以掌握Struts2的核心概念和实际操作,提升在企业级应用...
6. **数据验证框架**:为了确保输入数据的正确性,项目可能采用了Struts2内置的数据验证机制,或者结合第三方库如Hibernate Validator,定义验证规则并在提交表单时进行校验,防止无效数据进入数据库。 7. **缺失的...