Struts2给对象自动赋值与值栈
Struts2通过反射自动赋值,根据其对象中的get and set 方法与表单form中的name值匹配,进行相应的赋值。在赋值之前,struts还对中间部分进行了拦截处理,可以添加验证方法,转换器。
--------------------------------------------------------------------------------------------------
转换器:
struts2提供了许多的默认转换功能,我们从表单得到的数据全部是字符类型,它就做了自动把String转换成Integer的默认转换,date对象的默认格式转换(2012-09-29)等等
当然,也可以自己对action中的字段,bean中的字段以及规定的类型,进行统一格式转换。
--------------
代码部分:
1.这是转换器的核心代码,它继承了DefaultTtypeConverter默认转换器
--通过网页表单提交的字段--转换器处理返回新值--对应的java字段。(了解)
public abstract class StrutsTypeConverter extends DefaultTypeConverter {
public Object convertValue(Map context, Object o, Class toClass) {
if (toClass.equals(String.class)) { //如果对应的java字段是字符串
return convertToString(context, o);
} else if (o instanceof String[]) { //如果对应的java类型是数组
return convertFromString(context, (String[]) o, toClass);
} else if (o instanceof String) { //如果对应的java类型是对象
return convertFromString(context, new String[]{(String) o}, toClass);
} else {
return performFallbackConversion(context, o, toClass);
}
}
protected Object performFallbackConversion(Map context, Object o, Class toClass) {
return super.convertValue(context, o, toClass);
}
public abstract Object convertFromString(Map context, String[] values, Class toClass);
public abstract String convertToString(Map context, Object o);
}
2.继承这个类,重写转换器方法
这里举一个比较变态的例子。。。。
public class MyConverter extends StrutsTypeConverter{
//如果表单name 对应的 java字段 只是字符串
@Override
public String convertToString(Map context, Object o) {
System.out.println("Hello--接收该name的是一个字符串而已,随便处理下就行了。。。。");
return ((String[])o)[0]+"hahhahahha";
}
//如果是对象(数组,日期,对象等都进入这个处理方法)
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
//把传入的一串字符串解析成一个对象,然后返回给对应的字段。O_Y
System.out.println("Hello--有一个对象进入我管辖的对象转换器中。。");
String v = values[0];
User user= new User();
System.out.println(v);
String name = v.substring("name".length(), v.indexOf("age"));
user.setName(name);
v = v.substring( v.indexOf("age") );
System.out.println(v);
user.setAge(Integer.parseInt( v.substring("age".length(), v.indexOf("date")) ));
v = v.substring( v.indexOf("date") );
System.out.println(v);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd/hh:mm:ss");
try {
user.setDate( sdf.parse(v.substring("date".length())) );
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("OK~~对象处理完成,返回对象");
return user;
}
}
3.配置action 或 bean对象 或 类型 相关字段。
--就是物理文件的参数属性 指明 对应java字段的列。struts2提供了3种方式。
--它们的范围也不等
--1.action 指明一个Action中的java字段与其配置文件中的参数一一对应。
--文件命名规则:(action类名)-conversion.properties 例如:AddFriend-conversion.properties
--文件储存位置:必须将这个properties的文件放在与action相对于的目录下。
--文件属性格式:# syntax: <propertyName> = <converterClassName>
例如:user = com.struts.conversion.MyConverter
--2.给bean对象的字段规定对应的转换类型
--文件命名规则:(对象类名)-conversion.properties 例如:User-conversion.properties
--文件储存位置:必须将这个properties的文件放在与对象一个目录下。
--文件属性格式:# syntax: <propertyName> = <converterClassName>
例如:date = com.struts.conversion.DateConversion
--3.全局的给一类对象,配置转换方法。它只能转换一个是对象的字段。
--文件命名规则:xwork-conversion.properties //这个名字是固定的
--文件储存位置:和struts.xml同目录,它是全局配置文件。
--文件属性格式:# syntax: <type> = <converterClassName>
例如:java.util.Date = com.struts.conversion.DateConversion
总结:
转换器在赋值时拦截了对某一字段的赋值,struts2提供了3种方式配置转换处理方式,其范围都各自不同,不过,尽量使用全局配置和bean对象的配置方式。这样使项目更符合简化的风格。