首页 > 其他分享 >Struts2输入校验以及错误信息处理(2)——用Struts2定义好的校验框架进行校验

Struts2输入校验以及错误信息处理(2)——用Struts2定义好的校验框架进行校验

时间:2023-08-27 11:02:59浏览次数:34  
标签:xml 文件 信息处理 package 校验 Struts2 piao properties


Struts2的输入校验有两种方式:一种是用Action中定义的validate()方法进行校验,一种是用Struts2定义好的校验框架进行校验。前者里面的逻辑判断要自己写,而后者只需要传递相应的参数即可。

不管是哪种方式,程序执行的流程都是一样的,执行流程如下:

1、对表单传递过来的数据,先进行类型转换

2、执行校验

3、若校验不合法,则跳转到以input命名的result页面,若合法,则跳转到指定的页面

第一种方法,已经在上一篇博客中介绍了,现在介绍第二种方法:

校验框架中又有两种方法,一种是字段优先,一种是校验器优先,这里只介绍字段优先

字段优先就是以字段作为参照物进行校验

首先在要校验的Action所在的包中,新建一个以该Action的类名为文件名的xml文件,然后引进<!DOCTYPE …xwork-validator-1.0.2.dtd>元素,在该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">
			<message>username can't be blank !</message>
		</field-validator>
		<field-validator type="stringlength">
			<param name="minLength">4</param>
			<param name="maxLength">6</param>
			<message key="username.length"></message>
		</field-validator>
	</field>
	
	<field name="password">
		<field-validator type="requiredstring">
			<message>password can't be blank !</message>
		</field-validator>
		<field-validator type="stringlength">
			<param name="minLength">4</param>
			<param name="maxLength">6</param>
			<message>password should be between ${minLength} and ${maxLength}</message>
		</field-validator>
	</field>
	
	<field name="repassword">
		<field-validator type="requiredstring">
			<message>repassword can't be blank !</message>
		</field-validator>
		<field-validator type="stringlength">
			<param name="minLength">4</param>
			<param name="maxLength">6</param>
			<message>repassword should be between ${minLength} and ${maxLength}</message>
		</field-validator>
	</field>
	
	<field name="age">
		<field-validator type="required">
			<message>age can not be blank !</message>
		</field-validator>
		<field-validator type="int">
			<param name="min">10</param>
			<param name="max">50</param>
			<message>age should be between ${min} and ${max}</message>
		</field-validator>
	</field>
	
	<field name="birthday">
		<field-validator type="required">
			<message>birthday can't be blank !</message>
		</field-validator>
		
		<field-validator type="date">
			<param name="min">2005-05-01</param>
			<param name="max">2011-11-12</param>
			<message>birthday should be between ${min} and ${max}</message>
		</field-validator>
	</field>
</validators>

说明:

① 每一个field-validator的type对应一个具体的类,这个对应关系,在com.opensymphony.xwork2.validator.validators包下的default.xml文件中定义。


② 每一个类处理对特定类型的数据进行特定的验证。


③ 在field-validator下传递的param参数,其name就是相对应的类中的属性名,注意,这个属性名是由set/get方法中的方法名中get/set后的属性名决定的,如在一个类中,定义了一个叫做doTrim的私有属性,但是其set/get方法为:setTrim()/getTrim(),通过param向这个属性传递数据的时候,param的name要写成"trim"才对。

④ 对每一个字段可以定义多个校验器,进行各方面的校验。

注意:xml文件名的格式为:Action类名-validation.xml,如本例中的RegisterAction-validation.xml,位置要放在和该Action类所在的同一个包中。

补充:在field-validator元素下的message元素,还有一个key属性,如上例中的对username的校验中,message元素为:

<message key="username.length"></message>

这样的写法,是为了实现用几种不同的语言,去显示提示信息,message指定了一个key,对应的还有要value,这个value值就是错误提示信息,要在几个不同的properties文件中去实现这个对应关系,所以有几种语言,就要新建几个properties文件,在其中指定key和value。

这样的properties文件的命名也有一定的规则:package_语言_国家.properties,如若要显示中文错误信息,则该文件命名为:package_zh_CN.properties,若要显示英文提示错误信息,文件命名为:package_en_US.properties。

message中指定的key要和properties文件中的key相同,才能正确显示相应的错误提示信息。

如在本例中,分别用中文和英文显示username字段的长度的错误提示信息:

package_zh_CN.properties:


username.length=\u7528\u6237\u540D\u7684\u957F\u5EA6\u5E94\u8BE5\u5728${minLength}\u548C${maxLength}\u4E4B\u95F4



(用户名的长度应该在${minLength}和${maxLength}之间)

package_en_US.properties:


username.length=length of username should be between ${minLength} and ${maxLength}



这种机制有什么好处呢?这种机制就是为了实现国际化!Struts可以根据浏览器的首选语言,对应的显示相应语言的提示信息。

那么这种机制是怎么实现的呢?来看一个test

package com.suo.i18n;

import java.util.Locale;
import java.util.ResourceBundle;

public class I18NTest 
{
	public static void main(String[] args)
	{
		ResourceBundle bundle=ResourceBundle.getBundle("piao",Locale.CHINA);
		
		System.out.println(bundle.getString("hello"));
	}
}

还有若干个properties文件,命名和上面的类似,只是这里可以以任意字符串开头,如:

piao_zh_CN.properties:

hello=\u4F60\u597D\uFF0C\u4E2D\u56FD(你好,中国)

piao_en_US.properties:

hello=hello US

ResourceBundle类,我们叫它资源包。资源包包含特定于语言环境的对象。当程序需要一个特定于语言环境的资源时(如 String),程序可以从适合当前用户语言环境的资源包中加载它。使用这种方式,可以编写很大程度上独立于用户语言环境的程序代码,它将资源包中大部分(即便不是全部)特定于语言环境的信息隔离开来。

properties文件在这里可以看成我们的资源文件。

ResourceBundle类中有很多重载的getBundle()方法,可以调用某一个properties文件,即某一个资源。如上例中getBundle()方法中的第一个参数为"piao",第二个参数为Locale.CHINA,即是要使用以piao为命名的,中文的资源文件,即使用的是piao_zh_CN.properties文件。若getBundle()方法的参数为getBundle("piao",Locale.US),即使用的piao_en_US.properties文件。这里就是根据properties文件的文件名来找到相应的资源文件的。所以命名一定要正确。

在Struts2中,所有的资源文件名都是以package开头的,这test种的piao的地位是一样的,这就是这种机制的原理。

标签:xml,文件,信息处理,package,校验,Struts2,piao,properties
From: https://blog.51cto.com/u_5173797/7251457

相关文章

  • Struts2的自定义类型转换和简单的输入校验
    这里关键是对自定义类型的理解,它和8个基本数据类型的地位是一样的,只不过这个是你自己定义的类型。那么在Struts2中什么时候要用到数据类型转换呢?其实,我们一直在用,只是我们没有感觉到而已,Struts2对8个基本数据类型以及Date、String等常见类型,会自动的用内建的类型转换器进行转换,这个......
  • Struts2输入校验以及错误信息处理(1)——用Action中定义的validate()方法进行校验
    Struts2的输入校验有两种方式:一种是用Action中定义的validate()方法进行校验,一种是用Struts2定义好的校验框架进行校验。前者里面的逻辑判断要自己写,而后者只需要传递相应的参数即可。不管是哪种方式,程序执行的流程都是一样的,执行流程如下:1、对表单传递过来的数据,先进行类型转换2、......
  • struts2文件上传
    上传文件其实分为两个步骤:首先,将客户端传递过来的文件保存到struts.multipart.saveDir键所指定的目录下,如果没有指定,那么就保存到javax.servlet.context.tempdir环境变量所指定的目录下,然后,Action中所定义的成员变量file,实际指向的是临时目录中的临时文件,在服务器通过IO的方式,将临......
  • struts2异常处理
    Struts2中的异常处理有两种形式:一种是局部异常处理,一种是全局异常处理在struts.xml中的package下有两个这样的标签:<global-exception-mappings>和<global-results>,前者指定异常处理的类,后者是异常处理结果,通常指定一个显示异常信息的页面。而在action中,也有类似全局的异常处理,<exce......
  • 【MySQL 8.0】通过pt-table-checksum校验从库与主库的数据一致性
    通过yum安装percona-toolkit[root@node01~]#wgethttps://repo.percona.com/yum/percona-release-latest.noarch.rpm[root@node01~]#rpm-ivhpercona-release-latest.noarch.rpm[root@node01~]#yuminstall-ypercona-toolkit[mysql@node01~]$pt-table-checksum--......
  • 关于公用方法的参数校验和异常抛出
    通常来说,比较规范的写法和定义:1、公用方法,尤其是业务上的公用方法是不做参数校验的,由调用方校验参数,因为公用方法通常简短且正确性要有保障,导致出错的原因通常是外部导致的,所以参数校验和日志的打印由调用方去写。2、公用方法对于参数进行操作以后,那么还是会打印一些日志的,比如......
  • 参数校验和分组
    对于参数校验的一个总结意义:前端校验了,后端也进行数据校验,保存数据安全性/****@Description**JSR提供的校验注解:**@Null被注释的元素必须为null*@NotNull被注释的元素必须不为null*@AssertTrue被注释的元素必须为true*@AssertFalse被注释的元素......
  • Angular:表单设置动态校验规则(ngZorro示例)
    背景有时我们需要根据不同的条件,决定表单控件是否是必填的。代码示例HTML文件<formnz-form[formGroup]="validateForm"(ngSubmit)="submitForm()"><nz-form-item><nz-form-label[nzSpan]="4"nzRequirednzFor="name">Name</nz-f......
  • python - 文件md5校验
    通过md5校验文件,我们可以判断文件内容是否改变,用python实现代码如下importhashlib#1.txt为空文本withopen('1.txt','rb')asf:data=f.read()md5Old=hashlib.md5(data).hexdigest()print(md5Old)#d41d8cd98f00b204e9800998ecf8427e#1.txt内容为12......
  • el-input-number 手动输入无法触发校验
    前情提要今天终于找到了鬼打墙之谁改了我的代码中的鬼,庆贺:-)鬼找到了:测试对象不一致请输入0-1000间的整数这则校验一直都有,不是改bug期间提交的,因此代码提交记录是正常的。 { pattern:/^([0-9][0-9]{0,2}|1000)$/, message:"请输入0-1000间的整数", tri......