一.数据校验
前台校验:客户段校验
主要通过JavaScript,效率高,但不安全.
后台校验:服务器校验
这里是struts2通过xml配置/java代码.效率比较低,但安全.
1.Struts2数据校验
a.java代码数据验证
b.配置文件数据验证// 对象,封装请求的数据 private User user; public void setUser(User user) { this.user = user; } public User getUser() { return user; } /** * 1.数据验证的方法(简单的手动数据验证) */ //public void validate() { // 验证所有方法: validate() public void validateRegister() { // 验证指定的方法: validate要验证的方法名() // 用户名、密码验证 //if (user != null) { // --> 验证用户名 if (user.getName() == null || "".equals(user.getName())) { // 用户名不合法! 添加错误信息到map super.addFieldError("user.name", "用户名不能为空!"); // 错误map不为空! } if (user.getPwd() == null || "".equals(user.getPwd())) { // 密码不合法! super.addFieldError("user.pwd", "密码不能为空!"); } //} } //jsp中错误信息的显示:<s:fielderror fieldName="user.pwd"></s:fielderror>
配置文件的数据验证配置文件的命名方法:ActionClassName-validation.xml 验证action中的所有方法ActionClassName-actionName-validation.xml 验证指定action中的方法
<validators> <!-- 验证“用户名字段” user.name 对应Action中要验证的属性!--> <field name="user.name"> <!-- 指定验证器类型 --> <field-validator type="requiredstring"> <message>用户名不能为空!</message> </field-validator> </field> </validators> //验证器查看:xwork-core-2.3.4.1.jar/com.opensymphony.xwork2.validator.validators/default.xml
二.国际化
配置国际化资源文件:
命名规则:基础名_语言简称_国家简称.properties如:msg_zh_CN.properties
1. 通过常量加载资源文件
<!-- value的值是资源文件的包名+资源文件基础名 --><constant name="struts.custom.i18n.resources" value="cn.itcast.b_i18n.msg"></constant>
2.jsp通过便签加载资源文件
<!-- name的值是资源文件的包名+资源文件基础名 --><s:i18n name=" cn.itcast.b_i18n.msg "></s:i18n>
3. struts提供了国际化的标签
通过text标签,可以显示国际化字符串name 值资源文件中配置的key<s:text name="username"></s:text>
三.类型转换器
|-- interface TypeConverter 类型转换的接口
|-- class DefaultTypeConverterstruts默认的类型转换器
|-- abstract class StrutsTypeConverter
自定义类型转换器可以继承此类
a.自定义类型转换器
//继承StrutsTypeConverter类
public class MyDataConvert extends StrutsTypeConverter{
/**
* 把表单提交的字符串,转换为指定的目标类型! (String--> Date)
*
* 参数1: Action的上下文map(contextMap)
* 参数2: 表单提交的数据!为数组类型,一般取数组第一个元素! <input type=texg name=userName /> 值
* 参数3: 要转换的目标类型
*/
public Object convertFromString(Map context, String[] values, Class toClass) {
// 判断: 数组如果为null,直接返回null
if (values == null || values.length == 0){
return null; // 不需要转换了
}
// 判断: 提交的属性类型,如果不是日期类型,不需要转换
if (Date.class != toClass) {
return null;
}
/*
* 当前属性是日期类型,需要转换
*/
try {
// 格式转换,转换成功,就直接返回!
Date birth = formats[i].parse(values[0]); // 字符串转换为日期
return birth;
} catch (ParseException e) {
...
}
return null;
}
@Override
public String convertToString(Map context, Object o) {
return null;
}
}
b.配置转换器资源文件
命名规则:ActionClassName-convertion.properties局部类型转换器
文件放于Action同一个包目录下
xwork-conversion.properties全局类型转换器(项目的所有Action都可以用)
将自定义类型转换配置到资源文件中:
RegisterAction-conversion.properties
user.birth=cn.itcast.c_convert.MyDataConvert
四.模型驱动
|--interface ModelDriven<T> 模型驱动接口,T为封装的对象的类
模型驱动的实现,用到模型驱动拦截器:作用:<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor" />
把请求表单的元素数据(表单的属性名与对象属性相同),自动填充到Action中的对象中.public class UserAction extends ActionSupport implements ModelDriven<User>{ private User user = new User(); // public void setUser(User user) { // 可以不用写set方法 // this.user = user; // } public User getUser() { return user; } //用户名: <input type="text" name="name"> /*********重写***********/ @Override public User getModel() { return user; } }