1.验证的方式
1.客户端校验:使用js结合正则表达式来校验,不和服务器打交道,开发简单,安全性差
2.服务器端校验:请求web服务器,开发量比较大,安全性好,如果需要和数据库到交到的就必须要使用服务器端校验
实际开发中,客户端校验比较多,最好是客户端和服务端都校验。
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位的数字");
}
跳出校验
- 在编程式校验中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
系统提供的校验器如下:
- required (必填校验器,要求被校验的属性值不能为null)
- requiredstring (必填字符串校验器,要求被校验的属性值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)
- stringlength(字符串长度校验器,要求被校验的属性值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)
- regex(正则表达式校验器,检查被校验的属性值是否匹配一个正则表达式,expression参数指定正则表达式,caseSensitive参数值)
- int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)
- double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)
- fieldexpression(字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)
- email(邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址)
- url(网址校验器,要求如果被校验的属性值非空,则必须是合法的url地址)
- date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)
- conversion(转换校验器,指定在类型转换失败时,提示的错误信息)
- visitor(用于校验action中复合类型的属性,它指定一个校验文件用于校验复合类型属性中的属性)
- 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>