Struts基础学习(4)-类型转化与校验

关于国际化与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逻辑视图所指定的视图资源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值