关于国际化与struts的标签这块内容,先略过,熟悉了再来看这又臭又长的各种规则。
基于OGNL的类型转换
单个对象
user.name及user.pass
Map对象
users['one'].name及users['one'].pass
List对象
users[0].name及users[0].pass
指定集合元素类型
public class LoginUserAction extends ActionSupport{
private List users;
public List getUsers() {
return users;
}
public void setUsers(List users) {
this.users = users;
}
public String execute(){
System.out.println(getUsers());
User firstUser=(User) getUsers().get(0);
System.out.println("aaaa");
System.out.println(firstUser.getName());
System.out.println(firstUser.getPass());
return SUCCESS;
}
}
上边的代码,并不能够让struts知道users中的集合元素的类型。我们要通过转换文件来指定。
通过ActionName-conversion.properties形式,并且此文件与Action文件位于相同位置。
上边的例子,就得在LoginUserAction-conversion.properties中添加
Element_users=app.bean.User
即在List指定key-value对
Element_<listPropName>=<ElementType>
在Map指定key-value对
Element_<MapPropName>=<ValueType>
指定集合元素的类型
import ognl.DefaultTypeConverter;
public class UserConverter extends DefaultTypeConverter{
/**
* @param 类型转换的上下文
* @param 需要转换的参数
* @param 转换后的目标类型
*/
public Object convertValue(Map context,Object value,Class toType){
if(toType==User.class){
//系统请求的是一个字符串,需要转换为数组
String[] params=(String[]) value;
//创建实例
User user=new User();
String[] userValues=params[0].split(",");
user.setName(userValues[0]);
user.setPass(userValues[1]);
return user;
}else if(toType==String.class){
User user=(User) value;
return "<"+user.getName()+","+user.getPass()+">";
}
return null;
}
}
注册类型转换器
局部转换器
user=app.action.UserConverter
并且命名为ActionName+conversion.properties,且与Action目录在一起
全局转换器
在class文件夹下命名为xwork-conversion.properties
app.bean.User=app.action.UserConverter
自定义类型转换器
public class UserConverter extends StrutsTypeConverter{
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
User user=new User();
String[] userValues=values[0].split(",");
user.setName(userValues[0]);
user.setName(userValues[1]);
return user;
}
@Override
public String convertToString(Map context, Object o) {
User user=(User) o;
return "<"+user.getName()+","+user.getPass()+">";
}
}
通过几成StrutsTypeConverter,分别实现两种不同的逻辑转换,是逻辑更加清晰。
类型转换的错误处理
Action通过继承Struts的基类ActionSupport类来实现。
校验规则文件
校验文件
ActionName+'-'+validation.xml
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<!-- name指定检验的属性 -->
<field name="name">
<!-- requiredstring指定满足必须的规则 -->
<field-validator type="requiredstring">
<!-- 条件 -->
<param name="trim">true</param>
<!-- 不符合条件警告 -->
<message>必须输入名字</message>
</field-validator>
<!-- regex指定必须的正则表达式 -->
<field-validator type="regex">
<param name="expression"><![CDATA[\w{4,25}]]></param>
<message>输入的用户名只能是数字或者字母,并且长度必须在4到25之间</message>
</field-validator>
</field>
<field name="age">
<!-- 符合的类型,并指定大小 -->
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>年龄必须在1到150之间</message>
</field-validator>
</field>
<field name="birth">
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2050-02-21</param>
<!-- 读取内容 -->
<message>生日必须在${min}到${max}之间</message>
</field-validator>
</field>
</validators>
并且可用<s:fielderror/>标签输出错误提示消息。
国际化提示消息
校验文件
<field name="birth">
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2050-02-21</param>
<!-- 读取内容 -->
<message key="birth.range"/>
</field-validator>
</field>
并且在mess.properties中添加
birth.range=\u751F\u65E5\u5FC5\u987B\u5728${min}\u5230${max}\u4E4B\u95F4
就可达到提示消息的国际化。
输入校验的步骤
1、类型转换器对字符串的请求参数执行类型转换,并将这些值设成Action的属性值。
2、执行类型转换可能出现异常,若出现,将异常信息保存到ActionContext中。conversionError拦截器负责将其封装到FieldError。
3、使用Struts 2应用中所配置的校验器进行输入校验。
4、通过反射调用validateXxx()方法,其中Xxx是处理用户请求的逻辑方法。
5、调用Action类里的validate()方法。
6、如果上面的步骤都没有出现FieldError,则调用Action里处理用户请求的处理方法;如果出现FieldError,系统则转入input逻辑视图所指定的视图资源。