- 浏览: 347491 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
孙大圣123:
大神,你分享的castor dtd文件中没有field-han ...
Castor (二) -- 自定义映射 -
ananeye:
建议举些通俗的例子,说明下。光这样讲,不好懂。
ORACLE 索引原理 -
度_java:
1.不在不同的机器上实现集群功能,除非他们的时钟同步精确到秒。 ...
Quartzs -- Quartz.properties 配置 -
2047699523:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
MAVEN3--(三)创建MAVEN项目 -
qgm168:
写的不错,借用啦,哈哈,多谢!
自定义POI EXCEL模板
1.概述
Castor的自定义映射关系通过XML设置。
主要作用有
1)改变映射位置(node): attribute, element, text
2)改变映射名字(name...): attributeName, elementTagName
3)改变层级关系(location)
4)改变输出格式(handler): dateFormat...
5)改变属性获取和设置方式(get/setMethod, direct="true")
6)隐藏属性(auto-complete="true", transient="true")
2.源码
Address.java Student.java 详见 Castor (一) -- 默认绑定
LocalDateHandler.java
package com.siyuan.castor.handler; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.exolab.castor.mapping.FieldHandler; import org.exolab.castor.mapping.ValidityException; import com.siyuan.castor.Student; public class LocalDateHandler implements FieldHandler { private static final String LOCAL_DATE_FORMAT = "yyyy-MM-dd"; public void checkValidity(Object object) throws ValidityException, IllegalStateException { } /** * @param object the owner of the field */ public Object getValue(Object object) throws IllegalStateException { if (object instanceof Student) { Date date = ((Student) object).getBirthday(); if (date != null) { DateFormat dateFmt = new SimpleDateFormat(LOCAL_DATE_FORMAT); return dateFmt.format(date); } else { return null; } } return null; } public Object newInstance(Object arg0) throws IllegalStateException { return null; } public void resetValue(Object arg0) throws IllegalStateException, IllegalArgumentException { } /** * @param object the owner of the field * @param dateString the field value in the xml source file */ public void setValue(Object object, Object dateString) throws IllegalStateException, IllegalArgumentException { if (object instanceof Student) { DateFormat dateFmt = new SimpleDateFormat(LOCAL_DATE_FORMAT); try { Date date = dateFmt.parse((String) dateString); ((Student) object).setBirthday(date); } catch (ParseException e) { throw new IllegalArgumentException(e); } } } }
DivDateHandler.java
package com.siyuan.castor.handler; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.exolab.castor.mapping.GeneralizedFieldHandler; public class DivDateHandler extends GeneralizedFieldHandler { private static final String LOCAL_DATE_FORMAT = "yyyy-MM-dd"; /** * automatically supports iterating over the items of a collection * and passing them one-by-one to the convertUponGet * * setCollectionIteration : could modify it */ public DivDateHandler() { setCollectionIteration(false); } /** * @Override * @param value the object value to convert after * performing a get operation * @return the converted value. */ public Object convertUponGet(Object value) { if (value == null) return null; DateFormat dateFmt = new SimpleDateFormat(LOCAL_DATE_FORMAT); return dateFmt.format((Date) value); } /** * @Override * @param value the object value to convert before * performing a set operation * @return the converted value. */ public Object convertUponSet(Object value) { if (value == null) return null; DateFormat dateFmt = new SimpleDateFormat(LOCAL_DATE_FORMAT); Date date = null; try { date = dateFmt.parse((String) value); } catch (ParseException e) { throw new IllegalArgumentException(e); } return date; } /** * @Override * Returns the class type for the field that this * GeneralizedFieldHandler converts to and from. This * should be the type that is used in the * object model. * * @return the class type of of the field */ public Class getFieldType() { return Date.class; } }
ConfigureDateHandler.java
package com.siyuan.castor.handler; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Properties; import org.exolab.castor.mapping.ConfigurableFieldHandler; import org.exolab.castor.mapping.FieldHandler; import org.exolab.castor.mapping.ValidityException; import com.siyuan.castor.Student; public class ConfigureDateHandler implements FieldHandler, ConfigurableFieldHandler { private static final String DATE_FORMAT_PARAM_NAME = "date-format"; private DateFormat dateFormat; public void checkValidity(Object arg0) throws ValidityException, IllegalStateException { } public Object getValue(Object object) throws IllegalStateException { if (object instanceof Student) { Date date = ((Student) object).getBirthday(); if (date != null) { return dateFormat.format(date); } else { return null; } } return null; } public Object newInstance(Object arg0) throws IllegalStateException { return null; } public void resetValue(Object arg0) throws IllegalStateException, IllegalArgumentException { } public void setValue(Object object, Object dateString) throws IllegalStateException, IllegalArgumentException { if (object instanceof Student) { try { Date date = dateFormat.parse((String) dateString); ((Student) object).setBirthday(date); } catch (ParseException e) { throw new IllegalArgumentException(e); } } } /** * @param params configure information in the xml */ public void setConfiguration(Properties params) throws ValidityException { String pattern = params.getProperty(DATE_FORMAT_PARAM_NAME); if (pattern == null) throw new ValidityException("Required parameter \"" + DATE_FORMAT_PARAM_NAME + "\" is missing"); try { dateFormat = new SimpleDateFormat(pattern); } catch (IllegalArgumentException e) { throw new ValidityException("Pattern \"" + pattern + "\" is not a valid date format."); } } }
Student.cst.xml
<!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Object Mapping DTD Version 1.0//EN" "http://castor.exolab.org/mapping.dtd"> <mapping> <description>Used for com.siyuan.castor.Student</description> <!-- <include href=""></include> --> <!-- <field-handler /> --> <field-handler name="localDateHandler" class="com.siyuan.castor.handler.ConfigureDateHandler"> <param name="date-format" value="yyyy-MM-dd"/> </field-handler> <!-- verify-constructable="false" used with the set-method="%1-9%" make it able to omit the no-parameter constructor --> <class name="com.siyuan.castor.Student" auto-complete="true"> <description>com.siyuan.castor.Student</description> <map-to xml="Person"/> <!-- type="java.lang.String" handler="" required="true" direct="true" transient="true" set-method="%1-9%" get-method="getName" type="string" //can not omit the no-parameter constructor --> <field name="name"> <description>property name</description> <bind-xml name="stuName" node="attribute"/> </field> <!-- type="string" handler="com.siyuan.castor.handler.DivDateHandler" type="string" handler="com.siyuan.castor.handler.LocalDateHandler" //type could not be omitted and must be string location="birthday/birthday1" --> <field name="birthday" type="string" handler="localDateHandler"> <bind-xml name="birth" node="attribute"/> </field> <field name="friends" collection="set" type="com.siyuan.castor.Student" get-method="getFriends" set-method="addFriend"> <bind-xml name="friend" node="element"/> </field> <field name="subjects" collection="arraylist" type="string" get-method="getSubjects" set-method="addSubject"> <bind-xml name="subjects" node="element"/> </field> <field name="teachers" collection="map"> <bind-xml name="teachers" node="element"> <class name="org.exolab.castor.mapping.MapItem"> <field name="key" type="java.lang.String"> <bind-xml name="name" node="attribute"/> </field> <field name="value" type="java.lang.String"> <bind-xml name="subject" node="attribute"/> </field> </class> </bind-xml> </field> </class> <!-- not used for XML mapping <key-generator /> --> </mapping>
CastorDIYTest.java
package com.siyuan.castor.test; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.io.StringWriter; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.exolab.castor.mapping.Mapping; import org.exolab.castor.mapping.MappingException; import org.exolab.castor.xml.MarshalException; import org.exolab.castor.xml.Marshaller; import org.exolab.castor.xml.Unmarshaller; import org.exolab.castor.xml.ValidationException; import org.xml.sax.InputSource; import com.siyuan.castor.Address; import com.siyuan.castor.Student; public class CastorDIYTest { /** * @param args * @throws ValidationException * @throws MarshalException * @throws ValidationException * @throws MarshalException */ public static void main(String[] args) throws MarshalException, ValidationException{ Student stuSrc = new Student(); stuSrc.setAge(22); stuSrc.setName("SingleMan"); stuSrc.setMale(true); Address address = new Address(); address.setStreet("Renmin Road"); stuSrc.setAddress(address); DateFormat dateFmt = new SimpleDateFormat("yyyy-MM-dd"); try { Date birthday = dateFmt.parse("1988-11-21"); stuSrc.setBirthday(birthday); } catch (ParseException e) { e.printStackTrace(); } Student girl = new Student(); girl.setAge(20); stuSrc.setGirlFriend(girl); Set<Student> students = new HashSet<Student>(); Student stu1 = new Student(); stu1.setAge(21); students.add(stu1); Student stu2 = new Student(); stu2.setAge(23); students.add(stu2); stuSrc.addFriend(stu1); stuSrc.addFriend(stu2); stuSrc.addSubject("English"); stuSrc.addSubject("Math"); stuSrc.addSubject("Chinese"); Map<String, String> teachers = new HashMap<String, String>(); teachers.put("English", "teacher a"); teachers.put("Math", "teacher b"); teachers.put("Chinese", "teacher c"); stuSrc.setTeachers(teachers); Mapping mapping = new Mapping(); try { InputStream mappingFileIn = Student.class .getResourceAsStream("/com/siyuan/castor/Student.cst.xml"); mapping.loadMapping(new InputSource(mappingFileIn)); StringWriter result = new StringWriter(); Marshaller marshaller = new Marshaller(); marshaller.setMapping(mapping); marshaller.setWriter(result); marshaller.marshal(stuSrc); System.out.println(result); System.out.println("================================================================="); Unmarshaller unmarshaller = new Unmarshaller(mapping); Student stuDist = (Student) unmarshaller.unmarshal(new StringReader(result.toString())); System.out.println(stuDist); } catch (MappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
3. 输出结果
<?xml version="1.0" encoding="UTF-8"?> <Person stuName="SingleMan" birth="1988-11-21" male="true" age="22"><friend male="false" age="23"/><friend male="false" age="21"/><subjects>English</subjects><subjects>Math</subjects><subjects>Chinese</subjects><teachers name="English" subject="teacher a"/><teachers name="Math" subject="teacher b"/><teachers name="Chinese" subject="teacher c"/><girl-friend male="false" age="20"/><address><street>Renmin Road</street></address></Person> ================================================================= Student[name=SingleMan,age=22,male=true,birthday=Mon Nov 21 00:00:00 CST 1988, address=Address[street=Renmin Road], girlFriend=Student[name=null,age=20,male=false,birthday=null, address=null, girlFriend=null, friends=[], subjects=[], teachers={} ], friends=[Student[name=null,age=23,male=false,birthday=null, address=null, girlFriend=null, friends=[], subjects=[], teachers={} ], Student[name=null,age=21,male=false,birthday=null, address=null, girlFriend=null, friends=[], subjects=[], teachers={} ]], subjects=[English, Math, Chinese], teachers={English=teacher a, Math=teacher b, Chinese=teacher c} ]
4.参考资料
http://www.castor.org/xml-mapping.html
http://www.castor.org/xml-fieldhandlers.html#Use-ConfigurableFieldHandler-for-more-flexibility
附件为mapping文件对应的DTD和XSD文件
- mappingDTD_XSD.rar (5.4 KB)
- 下载次数: 14
发表评论
-
自定义POI EXCEL模板
2013-07-01 17:51 23091.背景 项目中需要将相关数据导出为EXCEL文件,该文 ... -
POI操作EXCEL
2013-07-01 15:55 9741.简介 Apache POI是Apache软件基金会的开 ... -
JSON-LIB
2013-06-30 15:44 16291.关于JSON JSON(JavaScript Obj ... -
Jasperreport应用小结
2013-06-19 23:15 14241.简介 JasperReport是一 ... -
JAVA实现FTP
2013-06-09 09:05 151001.关于FTP FTP:File Transfe ... -
Digester解析的顺序
2013-03-11 18:07 14461.说明 本文将通过一段代码来说明Digester解析X ... -
ONGL介绍
2012-10-16 17:02 58891.简介 OGNL:Object Graph Navi ... -
MyBatis(一)----基础使用
2012-06-10 22:24 9191.简介 --MyBatis是支持普通SQL查询,存储 ... -
SMOOKS--XSL
2012-06-07 13:33 30851.简介 Smooks是一个用于出力XML和非XML数 ... -
Log4j
2012-05-25 15:28 10771。简介 Log4j是一个应 ... -
commons-logging
2012-05-23 22:25 1054一。简介 commons-logging是Apache下的一 ... -
JFreeChart -- Web应用
2012-01-06 00:26 10171) Model index.jsp < ... -
JUnit -- 分析
2011-12-11 18:08 9901.类结构图 Assert : 大量的ass ... -
Quartzs -- JDBC-JobStore - Oracle 实现 + Cluster
2011-09-13 16:44 4485数据库 从%QUARTZ_HOME%/docs/dbTa ... -
Quartzs -- Quartz.properties 配置
2011-09-13 11:23 46252文件加载位置 默认:优先顺序 Classpath: ... -
StringTemplate学习笔记(四) StringTemplateGroup文件
2011-08-27 10:31 3500一,简介 StringTemplateGroup ... -
StringTemplate学习笔记(三) st文件加载
2011-08-22 22:40 4368一,简介 ST通过StringTemplateGr ... -
StringTemplate学习笔记(二) 语法
2011-08-21 16:11 10940一,分隔符,注释 <...>貌似只能在Stri ... -
StringTemplate学习笔记(一) 简介
2011-08-21 09:47 2601一,简介 StringTemplate(简称ST ... -
Castor (一) -- 默认绑定
2011-05-26 23:39 1352在MQ的数据传输过程中,往往将JAVA BEAN与XML进行相 ...
相关推荐
Castor Plug-in for Eclipse 插件的使用总结,全部以截图的方式一步一步向下引导。从安装开始,到使用其产生类。这是我的学习文档,写的比较的简单,多是一些图。目的就是为了让自己以后忘了的时候,能够一眼就看懂...
castor-1.2.jar castor-1.2-anttasks.jar castor-1.2-codegen.jar castor-1.2-ddlgen.jar castor-1.2-jdo.jar castor-1.2-xml-schema.jar castor-1.2-xml.jar
Castor 项目采用 BSD 类型的证书,因此可在任何类型的应用程序(包括完整版权的项目)中使用。 Castor 实际上仅仅有 XML 数据绑定,它还支持 SQL 和 LDAP 绑定
org.castor.util.IdentityMap org.castor.util.IdentitySet org.exolab.javasource.JEnum org.exolab.javasource.JType org.exolab.castor.util.List org.exolab.javasource.Header org.exolab.javasource.JClass ...
Unmarshall与Marshall使用的castor-xml-1.3.2.jar包
Unmarshall与Marshall使用的jar包
castor-1.2-examples
castor-1.2.zip
castor-1.2-doc.zip
castor-0.9.5.2.jar
Castor的jar包 对XML的序列号更容易些!
java -classpath D:\xsd/castor-1.2-anttasks.jar;D:\xsd/castor-1.2-codegen.jar;D:\xsd/commons-logging-1.1.jar;D:\xsd/castor-1.2-ddlgen.jar;D:\xsd/castor-1.2-jdo.jar;D:\xsd/castor-1.2-xml-schema.jar;D:\...
要实现的是O/R映射功能。它主要API和数据接口为:JDO-like, SQL, OQL, JDBC, LDAP, XML, DSML。它支持分布式目录事务处理和时间;提供处理XML、Directory、XADirectory的类库,提供从XML到JAVA类的转换机制。
castor-0.9.5.3-xml.jar,java和xml互相转换所使用的JAR
利用该包内提供的java类,可以进行java读取解析xml文件,并对文件进行操作
Castor 项目采用 BSD 类型的证书,因此可在任何类型的应用程序(包括完整版权的项目)中使用。 Castor 实际上仅仅有 XML 数据绑定,它还支持 SQL 和 LDAP 绑定
是个不错的XML解析工具。...二、作为数据存储文件。 其中作为数据存储文件有很多优点,比如,数据更加规范,数据校验等。 2、这个工具的功能:能够把xml文件存储的数据和pojo对象进行映射。我们暂且把这种叫做:OXM。
Castor是ExoLab Group下面的一个开放源代码的项目,它主要实现的是O/R映射功能。它主要API和数据接口为:JDO-like, SQL, OQL, JDBC, LDAP, XML, DSML。它支持分布式目录事务处理和时间;提供处理XML、Directory、...
jar包,官方版本,自测可用