java

位置:IT落伍者 >> java >> 浏览文章

struts源代码阅读(Commons-Beanutils包)


发布日期:2019年10月01日
 
struts源代码阅读(Commons-Beanutils包)

CommonsBeanutils(一)

CommonsBeanutils 这个是jakarta commons项目中的一个子项目这个项目开发的目的是帮助开发者动态的获取/设值Java Bean的属性同时解决每次都要写getXXX和setXXX的麻烦

XXXConvert

这些类都实现Converter接口提供把value值转化成为相应XXX类的实现现在只针对四种类型数字时间Boolean和String在Converter 接口中只有一个方法convert(Class type Object value)把value对象转换为type所要求的类XXXConvert类中这个方法的思路是

如果value==null并且自己内部有缺省的值那么就返回这个缺省的值如果没有缺省值就抛出ConversionException异常

如果value instanceOf XXX类那么就直接返回value

如果上面的都不行那么调用new XXX(valuetoString())或者XXXvalueOf(valuetoString())方法来返回转化失败时抛出ConversionException异常

特殊的实现

对于ClassConverter类当进入第三种情形的时候实际执行的是

ClassLoader classLoader =ThreadcurrentThread()getContextClassLoader(); if (classLoader == null) { classLoader = ClassConverterclassgetClassLoader(); } return (classLoaderloadClass(valuetoString()));

对于BooleanConverter类当进入第三种情形的时候实际执行的是根据valuetoString()的值yesytrue on 返回truenonfalseoff 返回false如果这些情形都不符合并且有缺省值的时候则返回缺省值否则抛出ConversionException

XXXArrayConverter

这些类继承自AbstractArrayConverter类 AbstractArrayConverter 实际只实现了一个List parseElements(String svalue)方法这个方法接受的是{value value}格式的字符串逐个解析出来后放入一个ArrayList中它通过StreamTokenizer解析字符串StreamTokenizer是用来分离input stream中读取的字符串并且可以根据标记区分不同的内容比如数字字符或者注释XXXArrayConverter由于要转换的是一个数组所以convert()方法的实现过程有所不同

如果value==null并且自己内部有缺省的值那么就返回这个缺省的值如果没有缺省值就抛出ConversionException异常

如果modelgetClass() == valuegetClass()那么就直接返回value

如果上面的都不行那么就通过parseElements(valuetoString())生成一个数组再对数组的元素逐个调用new XXX(listget(i))或者XXXvalueOf(listget(i))方法转换成为数组对元素要求的类型转化失败时抛出ConversionException异常

CommonsBeanutils(二)

LocaleConverter 与 BaseLocaleConverter

LocaleConverter继承自 Converter接口定义了一个新方法convert(Class type Object value String pattern)

抽象类BaseLocaleConverter实现了LocaleConverter接口它的locPattern属性用来表示这个对象的pattern是否是本地化的格式patttern 是指把何种格式的时间或者数字值转换成标准值convert()的执行过程是

如果value==null并且自己内部有缺省的值那么就返回这个缺省的值如果没有缺省值就抛出ConversionException异常

根据参数pattern值是否为null调用parse(Object value String pattern)方法如果这个参数不为null那么就使用这个参数的值否则使用对象预存的pattern值如果这

样做引起了异常会首先判断是否能够返回缺省的值不能则抛出ConversionException异常

parse(Object value String

pattern)方法的实现被抛至继承了它的类具体实现这个方法虽然把value值表述为Object类型但是最后都是通过强制转换转换成为String类型也就是说它实际上需要的

是String类型的value

XXXLocaleConverter

把pattern格式的value转换成标准格式的相应的XXX类这些类可以分为两大类一类为时间一类为数值

时间类最后都会通过SimpleDateFormat类对值进行转换程序如下

if(pattern == null) { pattern = locPattern ? new SimpleDateFormat()toLocalizedPattern() :new SimpleDateFormat()toPattern(); } SimpleDateFormat format = new SimpleDateFormat(pattern locale); if (locPattern) { formatterapplyLocalizedPattern(pattern); }else { formatterapplyPattern(pattern); } return formatterparse((String) value);

数值类最后都会通过DecimalFormat类对值进行转换程序如下

DecimalFormat formatter = (DecimalFormat) DecimalFormatgetInstance(locale); if (pattern != null) { if (locPattern) { formatterapplyLocalizedPattern(pattern); } else { formatterapplyPattern(pattern); } }return formatterparse((String) value);

这个转化过程要注意精度的问题由于Number类是所有的数值类的父类所以转换完成后要检查最后的结果是否是当前要求的精度如果大于所要求的精度则抛出ConversionException异常

CommonsBeanutils(三)

Dyna开头的类是专门为DynaFormBean而设计的

DynaBeanDynaClass 与 DynaProperty

DynaBean并不是Java中所定义的Bean而是一种的Bean因为它并不是通过getXXX和setXXX方法对XXX属性进行取值和设值的它通过一个实现了DynaClass接口的类帮助管理其所有的属性的类别而自己则管理对XXX属性值的设定和获取在设值的时候会通过与name对应的DynaProperty对象检查赋值的类别是否正确

DynaProperty类描述的是DynaBean中所包含的属性的类型DynaProperty类有三个属性属性的名称name属性的名称type属性的类别contentType如果DynaProperty描述的是个容器对象(List或者Map)那么这个contentType就代表这个容器内元素的类别这个类值得关注的地方是writeObject和readObject方法的实现它会首先判断自己的type是否是一个primitive的类如果是则先写入true标志再写入对应的primitive类的编号否则写入false标志再写入type因为在调用readObject方法时如果得出的是primitive类型则type的值为XXXTYPE而不是XXXclass

DynaClass 是一个接口用来管理DynaBean中所有的DynaProperty属性

BasiceDyanBean 与 BasicDynaClass

BasiceDyanBean 实现自DynaBean接口它包含一个实现了DynaClass接口的类的对象和一个用来存放值的HashMap这个HashMap的key与DynaClass中HashMap的key是一一对应的

BasicDynaClass 实现了DynaClass接口以DynaProperty的name为key保存所有这些DynaProperty对象它通过newInstance方法动态生成实现了DynaBean接口的类的对象注意这个类是可以动态指定的如果没有那么就是默认的BasicDynaBean类动态指定类是通过反射实现的程序如下

//dynaBeanClass为任意的实现了DynaBean接口的类constructorTypes为这个

//类的构造方法所需要的参数的类型

constructor = dynaBeanClassgetConstructor(constructorTypes);

//constructorValues为构造方法的参数值实际上它的值为当前的BasicDynaClass

return ((DynaBean) constructornewInstance(constructorValues));

CommonsBeanutils(四)

ConvertUtils 和 ConvertUtilsBean

ConvertUtils 是ConvertUtilsBean类的一个简单封装即ConvertUtils中的所有方法都是通过直接调用ConvertUtilsBean中的同名方法实现的如果你需要更复杂的功能就使用ConvertUtilsBean否则使用ConvertUtils

ConvertUtilsBean 通过一个HashMap管理所有的XXXConverter这个HashMap的key为XXX的类全名值为相应的XXXConverter对象通过deregister()方法初始化这个HashMap这个初始化方法会为每一个XXXConverter类提供一个缺省的值用户可以动过setDefaultXXX()方法来自行设置XXXConverter对象的缺省值这个类还提供了convert()方法对String value进行相应的转化

PropertyUtils 和 PropertyUtilsBean

PropertyUtils 是PropertyUtilsBean类的一个简单封装同样它的所有方法都是通过直接调用PropertyUtilsBean 中同名方法实现的

PropertyUtilsBean 对DynaBean或者一个java标准Bean中的属性动态的赋值和取值(非通过getXXX和setXXX方法)

这个类支持多层嵌套比如XXX[i]YYY(key)ZZZ那么它会为你得到或者设置ZZZ的属性

所有的set/get方法介绍

//对XXX(key)格式的name设值

setMappedProperty(Object bean String nameString key Object value)

//对XXX[i]格式的name设值

setIndexed               

上一篇:Hibernate 调用存储过程

下一篇:hibernate中自定义主键生成器