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