struts2对Ognl的封装--TypeConverter

Ognl的扩展点:

http://java12345678.iteye.com/blog/2031790

 

OGNL TypeConverter接口 :

     类型转换,setValue时将值转换为实际的类型,或getValue时将获取的对象转换为需要的类型

Struts对TypeConverter的扩展:

  OgnlValueStack中生成的上下文中使用了XworkConverter 做为类型转换类:

 protected void setRoot(XWorkConverter xworkConverter, CompoundRootAccessor accessor, CompoundRoot compoundRoot,
                           boolean allowStaticMethodAccess) {
        this.root = compoundRoot;
        this.securityMemberAccess = new SecurityMemberAccess(allowStaticMethodAccess);
        this.context = Ognl.createDefaultContext(this.root, accessor, new OgnlTypeConverterWrapper(xworkConverter), securityMemberAccess);
        context.put(VALUE_STACK, this);
        Ognl.setClassResolver(context, accessor);
        ((OgnlContext) context).setTraceEvaluations(false);
        ((OgnlContext) context).setKeepLastEvaluation(false);
    }

  即XworkConverter  是类型转换的入口,该类的UML类图如下:



 

 加载自定义TypeConverter:

  1.应用级别类型转换器

加载类路径下:

xwork-default-conversion.properties

xwork-conversion.properties

这两个文件默认是没有的,用户可以添加以扩展TypeConverter

  格式:转换目标类全名=TypeConverter类全名

 2.类级别的类型转换器(定义了该类中属性名与TypeConverter的对应关系):

    a properties方式

          加载“类全名-conversion.properties”,而生成的类属性与TypeConverter的对应关系

          格式:属性名=TypeConverter类全名

      b.标注在类上的Conversion Annotation

          

  

@Conversion(conversions={
		@TypeConversion(key = "属性名1", converter = "org.demo.converter.DateConverter"),
		@TypeConversion(key = "属性名2", converter = "org.demo.converter.MConverter"),
		}
)
public class Test{
   private 属性类型 属性名1;
   private 属性类型 属性名2;
}

      c.标注在方法上的TypeConversion Annotation

    

@TypeConversion(key="employeeMap",converter = "com.test.customMapConverter")
	public void setEmployeeMap(Map<String, Employee> employeeMap) {
		this.employeeMap = employeeMap;
	}

   指明对象转换为employeeMap,需要使用com.test.customMapConverter

 

 

 转换过程:

   1.先查询类级别的自定义的类型转换器,如果有,就使用

   2.查询应用级别的自定义的类型转换器,如果有,就使用

        3.使用XWorkBasicConverter  进行类型转换:

                 提供了toType为boolean,character,Class类型的转换,其它类型转换:交给其它TypeConverter处理:Container.getInstance(其它TypeCoverter):ArraryConverter、CollectionConverter、DataConverter、NumberConverter、StringConverter

 

 

框架设计:1.为用户扩展预留接口,首先使用自定义实现,无自定义实现则使用框架内置的默认实现

                  2.即要全局的总控也要允许个例的存在。

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值