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类图如下:


struts2对Ognl的封装--TypeConverter_第1张图片
 

 加载自定义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.即要全局的总控也要允许个例的存在。

 

 

你可能感兴趣的:(Converter)