首页 > WEB开发 > 后台开发 > Struts2封装请求参数和输入校验
2014
09-11

Struts2封装请求参数和输入校验

02. Struts2封装请求参数和输入校验19

一、封装请求参数

作为MVC框架,必须要负责解析HTTP请求参数,并将其封装到Model对象(JavaBean)中。

1、Struts2 提供了以下三种数据封装的方式:

1) 用动作类作为模型对象:参数注入

02. Struts2封装请求参数和输入校验125

扩展:参数注入是由一个名字为params拦截器完成的。

2) 模型和动作类分离:页面通过ognl表达式封装

02. Struts2封装请求参数和输入校验182

3) 使用ModelDriven接口,对请求数据进行封装

02. Struts2封装请求参数和输入校验214

扩展:这种封装是一个名为modelDriven的拦截器完成的。该拦截器会在调用动作方法前,调用getModel(),得到模型对象(user),接着把该模型对象压到了值栈的栈顶。该拦截器对应的类的intercept()方法如下:

02. Struts2封装请求参数和输入校验330

当收到表单的username的值,框架就会调用栈顶对象(即user)的setUsername方法。

2、封装请求参数到集合中:如批量添加时

02. Struts2封装请求参数和输入校验403

3、参数的类型转换

Struts2提供了非常强大的类型转换机制用于封装请求数据到Model对象,可自动完成以下转换:

  • 基本类型:
  • Date:接收yyyy-MM-dd格式的字符串
  • 数组:将多个同名参数,转换到数组中
  • 集合:支持将数据保存到List或Map。

扩展:下面自定义一个类型转换器,完成MM/dd/yyyy格式字符串(美式)和Date类型的互转。注:仅作说明用,实际开发中不用自己定义,Struts中的类型转换器就够用了。

① 编写一个类,继承StrutsTypeConverter

//自定义一个Struts2的类型转换器(Date <--> "MM/dd/yyyy")
public class MyDateConverter extends StrutsTypeConverter {
	private DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
	//"MM/dd/yyyy"-->Date
	public Object convertFromString(Map context, String[] values, Class toClass) {
		if(toClass == Date.class){
			if(ArrayUtils.isNotEmpty(values)){
				String sdate = values[0];
				try {
					return df.parse(sdate);
				} catch (ParseException e) {
					throw new RuntimeException(e);
				}
			}
		}
		return null;
	}
	//Date --> "MM/dd/yyyy"
	public String convertToString(Map context, Object o) {
		if(o instanceof Date){
			Date date = (Date)o;
			return df.format(date);
		}
		return null;
	}
}

② 配置类型转换器(2种方式)

a. 局部类型转换器:给某个动作类用的

在动作类所在的包中,建立一个”动作类名-conversion.properties”的配置文件,内容为“属性名称=类型转换器的全类名”,如下图:

02. Struts2封装请求参数和输入校验1449

b. 全局类型转换器:

在构建路径的顶端(WEB-INF/classes目录下)建立名称为xwork-conversion.properties的配置文件,按照要转换的目标类型进行转换器的配置。内容见上图。

4、类型转换出错时的数据回显和错误提示

Struts2提供了一个名为conversionError的拦截器,当出现类型转换错误时,该拦截器会把对应错误封装成表单域错误(FieldError),并将这些错误信息放入ActionContext中(该类见后文)。

前提:动作类必须继承ActionSupport!

数据回显:

在自定义类型转换器中,异常必须抛出不能捕获,如MyDateConverter中的throw new RuntimeException(e);,coversionError会处理该异常,并转向名为input的结果视图(用于回显数据)。

错误提示信息:

在动作类的包下建立一个“动作类名.properties”的配置文件(实际上是国际化中的默认资源文件),内容为“invalid.fieldvalue.属性名= 错误信息”。在结果视图对应的JSP页面,通过<s:fielderror/>输出错误提示。

下图模拟了一个日期类型转换错误,日期类型转换器使用了上面的自定义的,效果如下:

02. Struts2封装请求参数和输入校验2005


留下一个回复

你的email不会被公开。