08.struts2数据验证

1.验证的方式

1.客户端校验:使用js结合正则表达式来校验,不和服务器打交道,开发简单,安全性差

2.服务器端校验:请求web服务器,开发量比较大,安全性好,如果需要和数据库到交到的就必须要使用服务器端校验

实际开发中,客户端校验比较多,最好是客户端和服务端都校验。

Struts2的校验属于服务器端校验

  1. 目录

    验证的方式

    跳出校验

    2.struts2声明式验证


编程校验:重写父类的validate方法,在这个方法中对每一个字段来做校验,但是校验的前提是提交过来的参数是能相互转换的,如果转换不了的话会由param,modelDriven拦截器来负责。如果参数不符合正则,我们可以添加提示息addFieldError("name", "请输入3-8位英文")

在PersonAction页面加

/*
	 * 在封装参数之前做验证,如果验证不通过,返回表单页面
	 * */
	@Override
	public void validate() {
		if(!person.getName().matches("[a-zA-Z]{3,8}")){
			/*添加提示信息,第一个参数是表单中的name,第二个是提示信息*/
			addFieldError("name","请输入3-8位英文");
		}
	}

 

这里信息提示在上面,我们想让他提示到文本框后面,就需

要如下设置。

这个一定要加,否则没有提示信息。

也可以在PersonAction.properties中进行设置。

结果如图:

注意:

如果是id,int类型的话就需要这样编程字符串

if(person.getId() != 0 && !(person.getId()+"").matches("\\d{1,3}")){
			addFieldError("id", "id必须是1到5位的数字");
		}

跳出校验

  1. 在编程式校验中validate会对当前的Action中的每一个方法做校验,那么有一些方法时不需要校验的,我们可以通过@skipValidation来跳过校验。

这里我们写save和delete方法

public String save(){
		System.out.println(person);
		return super.SUCCESS;
	}
	
	public String delete(){
		System.out.println(person);
		return super.SUCCESS;
	}

访问:http://localhost:8080/strus2/aaa/delete

页面报错,我们不需要让delete也进行验证。

方法:

在delete上加注解

@SkipValidation
	public String delete(){
		System.out.println(person);
		return super.SUCCESS;
	}

 

       2.实际工作中不需要校验的多,需要校验的少。我们队需要校验的专门校验

我们在Action中定义一个验证方法,命名规则是validate+要验证的方法名,那么这个方法就会被校验如validateSave,save方法就会被校验,其余的方法都不会被校验。

public void validatesava() {
		if(!person.getName().matches("[a-zA-Z]{3,8}")){
			/*添加提示信息,第一个参数是表单中的name,第二个是提示信息*/
			addFieldError("name","请输入3-8位英文");
		}
	}

这里就不是重写了,我们需要去掉@override

 

2.struts2声明式验证

 

为了解决Action和验证逻辑的高耦合,我们可以使用声明式验证,我们要把验证规则配置在xml中。

规则:在Action的同级包下创建一个xml,名称规范:Action名称-validation.xml

打开xwork-validator1.0.3.dtd,把头信息拷贝到我们的xml中

这里把验证和action分离

 

<?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>
	<!-- 
		field:表单中要提交的文本域
		name:文本域的name
	 -->
	<field name="name">
		<!-- 
			文本域的验证器
		 -->
		<field-validator type="requiredstring">
			<message>姓名不能为空</message>
		</field-validator>
	</field>
</validators>

注意这是另一种验证,在代码中删掉之前的那种验证。

truts2框架给我们提供了很多验证器,这些验证器的位置在xwork-core.2.3.15.jar/com/opensymphony/xwork2/validator/validators/default.xml

系统提供的校验器如下:

  1. required (必填校验器,要求被校验的属性值不能为null)
  2. requiredstring (必填字符串校验器,要求被校验的属性值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)
  3. stringlength(字符串长度校验器,要求被校验的属性值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)
  4. regex(正则表达式校验器,检查被校验的属性值是否匹配一个正则表达式,expression参数指定正则表达式,caseSensitive参数值)
  5. int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)
  6. double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)
  7. fieldexpression(字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)
  8. email(邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址)
  9. url(网址校验器,要求如果被校验的属性值非空,则必须是合法的url地址)
  10. date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)
  11. conversion(转换校验器,指定在类型转换失败时,提示的错误信息)
  12. visitor(用于校验action中复合类型的属性,它指定一个校验文件用于校验复合类型属性中的属性)
  13. expression(OGNL表达式校验器,它是一个非字段校验器, expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中)
<?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>
	
	<field name="name">
		<field-validator type="requiredstring">
			<message>姓名不能为空</message>
		</field-validator>
		<field-validator type="regex">
			<param name="regex">[a-zA-Z]{3,8}</param>
			<message>姓名必须是3-8位</message>
		</field-validator>
	</field>
<!-- 第二种方式 -->
		<validator type="regex">
<!-- 配置验证的字段 -->
			<param name="fieldName">password</param>
<!-- 配置验证的正则 -->
			<param name="regex">\d{6,8}</param>
			<message>请输入6到8位数字的密码</message>
		</validator>
	
</validators>

 验证密码:用到expression

<!-- 第二种方式 -->
		<validator type="regex">
			<param name="fieldName">password</param>
			<param name="regex">\d{6,8}</param>
			<message>请输入6到8位数字的密码</message>
		</validator>
		<validator type="expression">
			<param name="fieldName">repassword</param>
			<param name="expression">password == repassword</param>
			<message>两次密码必须一致</message>
		</validator>

这里还需要把验证密码后面加<s:actionerror/>

重复密码:
        <input type="text" name="repassword"><br><s:fielderror fieldName="repassword"></s:fielderror>

<s:actionerror/>

 

2.struts2国际化

1.先来建立独立的包的资源文件

命名的规范:以msg开头后面加上国家的语言和国家名称的简写

                  msg_en_US.properties

                 msg_zh_CN.properties

 

2.struts.xml中配置国际化资源文件的加载 

	<!-- 
		加载资源文件做国际化,value指的是资源文件的包的路径后面加上msg,用/分隔
	 -->

<constant name="struts.custom.i18n.resources" value="com/zy/resource/msg"></constant>

 3.显示(两种方式)

     1.在action中显示

public String save(){
		/*getText从资源文件中取name*/
		String name = getText("pname");
		System.out.println(name);
		return super.SUCCESS;
	}

  2.在页面上显示<s:text name="pname"></s:text>

<s:text name=’属性文件的key’>

<form action="/strus2/aaa/zhang" method="post">
		<s:text name="pname"></s:text>
		<input type="text" name="name"><br><s:fielderror fieldName="name"></s:fielderror>
		<s:text name="pgender"></s:text>
        <input type="radio" name="gender" value="1" checked="checked">男
		<input type="radio" name="gender" value="2" >女<br>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值