2019独角兽企业重金招聘Python工程师标准>>>

truts2 校验框架

Struts2 和Struts1同样也提供了校验框架,但在Struts2 已经不再把校验框架做为一个插件,而是已经内置到了Struts2中,而且配置起来更为简单方便,功能也更强大。

下面以一个例子来说明Struts2校验框架的使用。

1在myeclipse 中创建一个web工程,在src目录下创建struts.xml 配置文件,添加好xml标头,配置web.xml文件。

1-1.了解一下我做的简单例子需求,实现一个用户注册的功能,用户信息包括用户名,密码,确认密码,年龄,出生日期,毕业日期等信息。在注册过程需要提供以下校验规则:

[1] 用户必填,长度在6-10之间

[2] 密码和确认密码必填,两次输入密码要一致长度,在6-10之间

[3] 年龄必须是数字 界于1-150之间

[4] 出生日期和毕业日期必填,且出生日期必须早于毕业日期

要求:使用struts2 提供的xml配置方式进行校验。

1-2.首先创建一个register.jsp 页面,代码如下:

<%@ page language="java"  pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>register page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">   <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><SCRIPT type="text/javascript">function validate(){var usernameValue=document.getElementById("username").value;var passwordValue=document.getElementById("password").value;var repasswordValue=document.getElementById("repassword").value;if(usernameValue.length==0){alert("username should not be blank!");return false;}else if(usernameValue.length<6 || usernameValue.length>10){alert("username should be between 6 and 10 !");return false;}return true;}</SCRIPT></head><body><s:fielderror cssStyle="color:red;"/><s:form action="register2" theme="simple"><table border="1" cellpadding="0" cellspacing="0"><tr><td>username</td><td><s:textfield name="username"  label="usernmae" id="username"/></td></tr><tr><td>password</td><td><s:password name="password" label="password" id="password"/></td></tr><tr><td>repassword</td><td><s:password name="repassword" label="repassword" /></td></tr><tr><td>age</td><td><s:textfield  name="age" label="age"/></td></tr><tr><td>birthday</td><td><s:textfield name="birthday" label="birthday"/></td></tr><tr><td>graduation</td><td><s:textfield name="graduation" label="graduation"/></td></tr><tr><td>&nbsp;</td><td><s:submit /></td></tr></table></s:form></body></html>

显示如下:

1-3.创建RegisterAction 代码如下:

package com.snt.struts2.action;import java.util.Calendar;import java.util.Date;import com.opensymphony.xwork2.ActionSupport;public class RegisterAction extends ActionSupport {private String username;private String password;private String repassword;private int age;private Date birthday;private Date graduation;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public Date getGraduation() {return graduation;}public void setGraduation(Date graduation) {this.graduation = graduation;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getRepassword() {return repassword;}public void setRepassword(String repassword) {this.repassword = repassword;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String execute() throws Exception {return SUCCESS;}/*** 注册1方法* @return* @throws Exception*/public String register1() throws Exception {return SUCCESS;}public String abc()throws Exception{System.out.println("abc method invoke!");return SUCCESS;}public String xyz()throws Exception{System.out.println("abc method invoke!");return SUCCESS;}public void validateAbc(){System.out.println("valide abc()");}public void validateXyz(){System.out.println("valide xyz()");}/**** 当遇到类型转化时,struts2自动生成一条错误信息,放到* fielderrors 中*/public void validateExecute() {//当用户直接访问action时,action的属性都是null//防止NullPointExceptionSystem.out.println("validate()...........");if(null==username || username.length()<6 || username.length()>10){this.addActionError("username invalid!");}if(null==password ||  password.length()<6 || password.length()>10){this.addActionError("password is invalid!");}else if(null==repassword ||  repassword.length()<6 || repassword.length()>10){this.addActionError("password is invalid!");}else if(!password.equals(repassword)){this.addActionError( "tow password is not be same!");}if(age<=0 || age>150){System.out.println("ERROR");this.addActionError( "age is invalid!");}if(null!=birthday && null!=graduation){Calendar c1=Calendar.getInstance();c1.setTime(birthday);Calendar c2=Calendar.getInstance();c2.setTime(graduation);if(!c1.before(c2)){this.addActionError("birthday shoud before graduation!");}}}public void validateRegister1() {//当用户直接访问action时,action的属性都是null//防止NullPointExceptionSystem.out.println("validate()...........");       System.out.println("validate()...........");if(null==username || username.length()<6 || username.length()>10){this.addFieldError("username", "username is invalid");}if(null==password ||  password.length()<6 || password.length()>10){this.addFieldError("password", "password is invalid!");}else if(null==repassword ||  repassword.length()<6 || repassword.length()>10){this.addFieldError("password", "password is invalid!");}else if(!password.equals(repassword)){this.addFieldError("password", "tow password is not be same!");}if(age<0 || age>150){this.addFieldError("age", "age is invalid!");}if(null==birthday){this.addFieldError("birthday", "birthday invalid!");}if(null==graduation){this.addFieldError("graduation", "graduation  invalid!");}if(null!=birthday && null!=graduation){Calendar c1=Calendar.getInstance();c1.setTime(birthday);Calendar c2=Calendar.getInstance();c2.setTime(graduation);if(!c1.before(c2)){this.addFieldError("birthday","birthday shoud before graduation!");}}}}

1-4.采用Struts2的检验框架需要创建一个配置文件,规则如下,我们需要在与所有要进行校验的Action同级别目录下创建一个xml文件,命名必须遵守规则:Action名-validation.xml 文件,对于这个例子就是:RegisterAction-validation.xml 做为校验的配置文件,下面我创建这个文件:代码如下:

<?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" short-circuit="false"><param name="trim">true</param><message>username shoudld not be blank!</message></field-validator><field-validator type="stringlength"><param name="minLength">6</param><param name="maxLength">10</param><message>username should be between ${minLength} and ${maxLength}</message></field-validator></field><field name="password"><field-validator type="requiredstring"><message>password should not be balank!</message></field-validator><field-validator type="stringlength"><param name="minLength">6</param><param name="maxLength">10</param><message>password should be between ${minLength} and ${maxLength}</message></field-validator></field><field name="repassword"><field-validator type="requiredstring"><message>repassword should not be balank!</message></field-validator><field-validator type="stringlength"><param name="minLength">6</param><param name="maxLength">10</param><message>repassword should be between ${minLength} and ${maxLength}</message></field-validator></field><field name="repassword"><field-validator type="fieldexpression"><param name="expression"> <![CDATA[(password==repassword)]]></param><message>two password should be the same! </message></field-validator></field><field name="age"><field-validator type="int"><param name="min">1</param><param name="max">150</param><message>age should be between ${min} and ${max}</message></field-validator></field><field name="birthday"><field-validator type="required"><message>birthday should not be blank!</message></field-validator><field-validator type="date"><param name="min">2001-01-01</param><param name="max">2004-01-01</param><message>birthday should be between ${min} and ${max}</message></field-validator></field><field name="graduation"><field-validator type="required"><message>graduation should not be blank!</message></field-validator><field-validator type="date"><param name="min">2005-01-01</param><param name="max">2008-01-01</param><message>birthday should be between ${min} and ${max}</message></field-validator></field></validators>对于Struts2提供的校验方式有两种:1 字段校验   2 非字段校验针对字段校验就如上面xml文件所写,是针对字段,字段中再配置各种校验规则。而对于非字段指的是:先定义好校验器,校验器中再配置针对那个字段进行校验。其实两种校验方式底层使用机制都是一样。比如上面针对用户的校验,如下定义:<field name="username"><field-validator type="requiredstring" short-circuit="false"><param name="trim">true</param><message>username shoudld not be blank!</message></field-validator><field-validator type="stringlength"><param name="minLength">6</param><param name="maxLength">10</param><message>username should be between ${minLength} and ${maxLength}</message></field-validator></field>

先用 <field> 标签描述要校验的字段,里面定义校验器 , 使用 <field-vaidator> 标签,这个标签中有个 type 属性,这个属性指是就是校验规则,比如: requiredstring  就代表必填表的字符串,表明这个信息是用户必须输入的。需要注意的是 type 属性不是随便写的,这个名字会对应 struts2 提供的各样校验器类。我们查找 strust2 原代码会在 xwork jar 包中的 com.opensymphony.xwork2.validator.validators 包下面找到一个 default.xml 配置文件,里面代码如下:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator Config 1.0//EN""http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd"><!-- START SNIPPET: validators-default --><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><!--  END SNIPPET: validators-default -->

这里面大家可以很清楚的看到,配置是每个校验器对应的名称和校验需要的类,每个校验都有一个 name 属性,这个属性就是我们在 ActionName-validation.xml 配置文件中 <field-validator> 标签 type 属性要可以使用的值,同样我们也可心在 com.opensymphony.validator.validators 包中找到对应的校验器类,比如:我们可以打开

com.opensymphony.validator.validators.RequiredStringValidator 类源代码如下:/** Copyright (c) 2002-2006 by OpenSymphony* All rights reserved.*/package com.opensymphony.xwork2.validator.validators;import com.opensymphony.xwork2.validator.ValidationException;public class RequiredStringValidator extends FieldValidatorSupport {private boolean doTrim = true;public void setTrim(boolean trim) {doTrim = trim;}public boolean getTrim() {return doTrim;}public void validate(Object object) throws ValidationException {String fieldName = getFieldName();Object value = this.getFieldValue(fieldName, object);if (!(value instanceof String)) {addFieldError(fieldName, object);} else {String s = (String) value;if (doTrim) {s = s.trim();}if (s.length() == 0) {addFieldError(fieldName, object);}}}}

在 usrename 的必须字段校验串中有这样一段配置

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

大家再年,上面红色背景显示的一段代码,就可以明白,这个参数就是赋值为这个属性的。表明校验时要去掉字符串两边的空格。当然如果有其它方法,也可以这样使用<param>标签传参数。<message>标签中信息是校验失败后要显示的信息。

上面为username 定义了一个必填字段校验器外,还添加了一个长度限制的校验器stringlength 校验器。其它配置都是一样的!

上面说过了,字段校验有两种,一种是上面所说的字段校验,另一种是非字段校验,下面我们看一下:

针对 username 的非字段校验配置如下:

<validator type="requiredstring"><param name="fieldName">username</param><message>username should not be blank</message></validator><validator type="stringlength"><param name="fieldName">username</param><param name="minLength">6</param><param name="maxLength">10</param><message>username should  be between ${minLength} and${maxLength}</message></validator>

看上面的配置,先定义一个校验器,使用 <validator> 标签,然后在标签里配置的参数

<param name="fieldName">username</param>

name 属性是不变的,使用fieldName 代表字段名,标签中间的值代表要校验的字段,下面的<message>标签中信息是校验失败后要显示的信息。其实非字段校验和这字段校验没什么区别,只是配置文件不一样而已,在开发中建议使用字段校验,会更清晰一点!

1-5.OK这样配置,整个配置文件都可以生产了,运行测试应用,显示如下:

OK,校验测试成功。

另外在校验过程中还要注意一些问题:

多方法Action情况如何使用配置文件进行校验?

我们知道大多数据情况下,Action可能会有多个方法,面我们上面所说的都是针对execute()方法进行的校验,如果存在多方法的情况下,需要进行校验的信息肯定是不样的,一个配置文件肯定解决不了问题,所有在多方式需要校验的情况下,我们需要在Action同级别的目录下,创建命名规则如下的配置文件:ActionName-method-validation.xml 配置文件,比如:RegisterAction中有个test()方法需要校验,可以创建

RegisterAction-test-validation.xml 配置文件进行配置,这个文件就会针对tets()方法进行校验,但是需要注意的是:在调用test()方法时,使用RegisterAction-test-vaidation.xml  文件进行校验后,还会调用RegisterAction-vaidation.xml 文件进行校验,这样的话,肯定会产生干扰,为了解决这样问题,可以在开发过程中,不提供RegisterAction-validtion.xml 这样的文件,对于execute()方法,可以提供一个RegisterAction-execute-validation.xml 文件进行配置校验。

 XML方式校验与硬编码方式校验的选择|

我们采用了XML 配置文件的方式进行校验,介是Action中的validate()方法同时也会被执行的,这时一些校验就可能会重复!所以在开发过程中,我们只采用一种方式,要么使用XML方式进行校验,要么采用硬编码的方式进行校验,而不建议混合使用的方式;一般情况下,我们采用XML方式进行校验,而且XML方式可以满足我们的需求,在业务特别复杂或校验粒度比较细的情况下我们可以采用硬编码的方式校验。

1 . 6 . Struts2 XML 配置方式进行是服务器端校验,当然在开发过程中我们经常会需要客户端校验, Struts2 也提供了客户端校验功能,使用客户端校验,首先页面中 Struts2 标签的主题不能设为 simple 主题,另外 form 标签的 validate 属性要改为 true 。但是 Struts2 提供的这种客户端校验功能是非常有限的,所有在需要使用客户端校验的情况,可以采用 javascript 或 Ajax 的方式进行校验,会更灵活一点。

转载于:https://my.oschina.net/zhongwenhao/blog/209335

Struts2 校验框架学习笔记相关推荐

  1. SpringMVC框架--学习笔记(上)

    1.SpringMVC入门程序: (1)导入jar包:spring核心jar包.spring-webmvc整合Jar包 (2)配置前端控制器:web.xml文件中 <?xml version=& ...

  2. SpringMVC框架--学习笔记(下)

    接上篇:SpirngMVC框架--学习笔记(上):https://blog.csdn.net/a745233700/article/details/81038382 17.全局异常处理: 系统中异常包 ...

  3. JeeSite 框架学习笔记

    JeeSite 框架学习笔记 目录 JeeSite 框架学习笔记 一.全局配置 1. 获取 Resource资源实际路径 DefaultResourceLoader 2. 配置前端 js css 二. ...

  4. Spring Boot 框架学习笔记(二)(配置文件与数据注入 yaml基本语法 JSR303数据验证 多环境切换 )

    Spring Boot 框架学习笔记(二) 六.appliaction.properties配置与数据注入 6.1 `@Value`注解 测试注入数据 读取输入流 6.2 读取配置文件数据注入 单文件 ...

  5. 27Vert.X框架学习笔记

    vert.x框架学习笔记 文章目录 1 Vert.x简明介绍 1.1 Vert.x能干什么 1.2 Vert.x快速体验 1.3 Vert.x的简单介绍 1.4 Vert.x的一些优势 1.4.1 异 ...

  6. mybatis框架--学习笔记(下)

    上篇:mybatis框架--学习笔记(上):https://blog.csdn.net/a745233700/article/details/81034021 8.高级映射: (1)一对一查询: ①使 ...

  7. mybatis框架--学习笔记(上)

    使用JDBC操作数据库的问题总结: (1)数据库连接,使用时创建,不使用时立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 设想:使用数据库连接池管理数据库连接. (2) ...

  8. JavaSE中Map框架学习笔记

    前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...

  9. python表单提交的两种方式_Flask框架学习笔记之表单基础介绍与表单提交方式

    本文实例讲述了Flask框架学习笔记之表单基础介绍与表单提交方式.分享给大家供大家参考,具体如下: 表单介绍 表单是HTML页面中负责数据采集功能的部件.由表单标签,表单域和表单按钮组成.通过表单,将 ...

最新文章

  1. java读取配置文件的几种方法
  2. UWP 剪贴板 Clipboard
  3. 《Python语言程序设计》——1.2 什么是计算机
  4. 应用Mongoose开发MongoDB(1)数据库连接
  5. 工具类App原型制作分享-WizNote
  6. 职业培训学校计算机培训计划,职业技能学校关于计算机应用一级MS-Office培训开班计划.doc...
  7. 归并算法(Java实现)
  8. 元宵节动画贺卡制作_2017鸡年元宵节flash电子贺卡模板下载-2017元宵节电子贺卡flash动画模板完整打包下载-东坡下载...
  9. 《开源安全运维平台-OSSIM最佳实践》于2016年1月出版
  10. 计算机的就业指导论文,★计算机就业指导论文题目计算机就业指导毕业论文题目大全计算机就业指导论文选题参考...
  11. 江南大学c语言课程绩点评分,江南大学无锡医学院课程考核档案管理办法
  12. 社区论坛小程序开发制作(同城圈子小程序)
  13. 电磁兼容(EMC):工程师必备之硬件EMC设计规范
  14. 解决安装office2016后文件图标显示空白图标
  15. Web前端——表格表单练习
  16. 用于通过声波捕获显示视觉,触觉和音频的全息显示(A volumetric display for visual, tactile and audio presentation using acous)
  17. 代码回滚,你真的理解吗?
  18. 计算机实战项目之 论文辩论PPT+源码等]精品微信小程序ssm培训机构管理系统+后台管理系统
  19. Centos8 配置DNF代理方法
  20. Android设计模式详解之解释器模式

热门文章

  1. 2017/12/29
  2. 5. 使用字符串库函数
  3. linux 每日学一点《Linux挂载NTFS分区方法》
  4. 一名计算机专业新生代农民工的五年求学之路,从“低谷”到“山峰”
  5. 负载均衡和故障转移的使用案例
  6. 郴州大数据产业招商会在深举行,中琛源科技签约智慧水务项目
  7. excel vlookup多个条件匹配多列_Excel教程第12课:VLOOKUP函数近似匹配到底怎么回事,原理+操作...
  8. 双电容单相电机接线图解_拿走不谢!75例自动控制原理图、接线图
  9. C语言记录元音字母的位置,求元音字母
  10. java如何实现下载_java 如何实现下载功能