struts2的类型转换器

本文详细解释了Struts2如何通过反射自动赋值,并介绍了转换器的功能及自定义转换器的方法,包括配置文件的使用和作用范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



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对象的配置方式。这样使项目更符合简化的风格。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值