现今的大多数企业应用=服务+数据。而WebService已经成为了异构系统服务相互调用的事实标准,那么异构数据之间呢?XML!它的弱数据类型约束这个本来很多人看不顺眼的特性无疑倒降低了各种数据互相交换的门槛。当然我不是提倡所有的东西都‘XML化’,但是从表示方式上统一的确看起来还不错,JXPATH就是个这样的思想,没有OGNL,也没有,只有一个XML标准--你只要懂这个这个就够了。
使用JXPATH
APACHE的东西有个好处,就是简单,符合KISS原则。毕竟是给数万程序员用的,太晦涩了这些大忙人们可没功夫去慢慢琢磨。
JXPathContext ctx = JXPathContext.newContext(对象实例);
Object value = ctx.getValue(数据的XPATH路径);
就这么简单。稍微说明的一点是,如果查询的是Java对象的话,XML里的属性和子节点在这里都被看作对象的属性取值
扩展JXPATH
目前JXPath里默认支持的只有XML、MAP和标准JavaBean。这几个常用么也就差不多够了。但它也可以扩展,以备不时之需。
常用的数据类算是ResulSet,下面就用这个当我们的小白鼠实作一下吧~
方式1:注册自定义的属性取值接口
DynamicPropertyHandler handler= new DynamicPropertyHandler({
Object getProperty(java.lang.Object object, java.lang.String propertyName) {
ResultSet rs = (ResultSet)object;
return rs.getObject(propertyName);
}
String[] getPropertyNames(java.lang.Object object) {
ResultSet rs = (ResultSet)object;
ResultSetMetaData meta = rs.getMetaData();
String[] ret = new String[meta.getColumnCount()];
for(int i=0; i<ret.length; i++) ret[i] = meta.getColumnName(i);
return ret;
}
void setProperty(java.lang.Object object, java.lang.String propertyName, java.lang.Object value){
ResultSet rs = (ResultSet) object;
rs.updateObject(propertyName, value);
}
});
JXPathIntrospector.registerDynamicClass(ResultSet.class, handler.class) ;
这样当JXPATH在取值的过程中碰到了ResultSet对象,那么就会调用我们注册的处理器去取值和设值了。
