1.验证方式
数据验证有两种方式:
第一种:客户端验证
第二种:服务器端验证
2.1编程式验证
这种方式,要求action必须继承ActionSupport
在代码中编写验证规则
a.针对动作类中的所有方法进行验证
在动作类中覆盖public void validate(这是ActionSupport的方法)
那么我们如果检测到错误后要做什么处理了,一般是提示一个字段不能为空,等等。struts2也为我们提供了一个存放错误消息的map,键是属性名,value是错误消息.
@Override
public void validate() {
// TODO Auto-generated method stub
super.validate();
if(StringUtils.isEmpty(user.getName())){
addFieldError("name", "用户名不能为空");
}
}
addFieldError就是我们存放错误消息的map集合
之前,再写a的标题的时候,写到是对所有方法的验证,那我们现在再写一个请求到某个方法,看下验证会不会起作用。
public String findAll(){
return SUCCESS;
}
<action name="findAll" class="com.yu.web.action.HelloAction" method="findAll"></action>
<a href="${pageContext.request.contextPath}/findAll.action">查看所有用户名</a>
说明其对所有的方法都其作用了,这样就会有问题,在不需要验证的方法中,有被验证了.
b.解决上述问题
第一种:在其不需要验证的方法上加@SkipValidate
@SkipValidation
public String findAll(){
return SUCCESS;
}
第二种:如果一个action有很多种方法,那么如果只有一个需要验证,那么对于不需要验证的方法要加很多的@SkipValidate,显然是不方便的,Struts2也提供了一种只表示这个方法验证的方式:validate+方法名(方法名首字母要大些)
public void validateSaveUser() {
// TODO Auto-generated method stub
super.validate();
if(StringUtils.isEmpty(user.getName())){
addFieldError("name", "用户名不能为空");
}
}
编程式验证有一定的缺点,就是硬编码,所有的验证都要写代码来验证
2.2声明式验证(一般使用这种验证)
声明式验证是通过xml来解决的,需要验证时,就编写xml文件,不需要就不编写
a.针对所有的动作进行验证
编程规则:在动作类所在包中,建一个ActionClassName-validation.xml文件
<?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">
<!-- 先导入dtd约束 -->
<validators>
<!-- 要验证的字段 -->
<field name="name">
<!--指定验证器验证什么 -->
<field-validator type="requiredstring">
<!--有误显示的结果 -->
<message>请输入用户名</message>
</field-validator>
</field>
</validators>
b.针对动作类中某个动作进行验证
编程规则:在动作类所在的包中,建一个名称为ActionClassName-ActionName.xml文件
2.3struts2常用的声明式验证器
2.3.1位置
xwork-core-2.3.15.3.jar\com\opensymphony\xwork2\validator\validator\default.xml
2.3.2验证器注入参数
对于设置的一些验证,想做一些改变,比如前面的requiredstring是去空格的,我们想不去空格,就可以给它注入一个参数
<?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">
<!-- 先导入dtd约束 -->
<validators>
<!-- 要验证的字段 -->
<field name="name">
<!--指定验证器验证什么 -->
<field-validator type="requiredstring">
<!--依赖注入的方式设置其参数 -->
<param name="trim">false</param>
<!--有误显示的结果 -->
<message>请输入用户名</message>
</field-validator>
</field>
</validators>
第二种编写其声明式验证的方法,验证写在外面,字段写里面
<?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">
<!-- 先导入dtd约束 -->
<validators>
<!--指定验证器验证什么 -->
<validator type="requiredstring">
<!-- 要验证的字段 -->
<param name="fieldname">name</param>
<!--依赖注入的方式设置其参数 -->
<param name="trim">false</param>
<!--有误显示的结果 -->
<message>请输入用户名</message>
</validator>
</validators>
3 国际化
3.1struts2使用国际化的条件
首先,我们要知道,在Struts2中,所有的消息提示都是基于国际化的。
其次,要想在Struts2中使用国际化,动作类必须继承ActionSupport类。
a.配置全局资源包,所有包都可以使用
在struts2中配置
<constant name="struts.custom.i18n.resources" value="com.yu.web.resources.message"></constant>
b.配置包范围的资源
配置名称的规范:
package_语言代码_国家代码.properties(固定的),只为这个资源包中的内容或者其子包服务
c.局部消息资源包(只为动作类)
资源包名称命名规范:动作类名称_语言代码_国家代码.properties,以此种命名方式的资源包,只为动作类服务。
d.struts2中的资源搜素顺序
局部资源消息包——>包范围资源消息包——>全局资源消息包
2.读取资源包中的内容
a.在动作类中读取
struts2提供了一个textprovider来读取资源文件,所以我们只需继承ActionSupport(继承了textprovider)
public String findAll(){
//查找key值
String str=getText("country");
System.out.println(str);
return SUCCESS;
}
如果没有找到此key,那么就显示key值
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<!--借助struts标签 -->
<s:text name="country"></s:text>
用户列表
</body>
</html>
显示结果:
如果没有经过action,那么显示就是全局资源包的内容,否则,按顺序搜索显示内容
b.指定读取的资源包
<!--设定国际化的文件名 -->
<s:i18n name="com\yu\web\action\package_zh_CN">
<s:text name="country"></s:text>
</s:i18n>
资源包不存在,按搜索顺序搜素