JAXB简介_动力节点Java学院整理
一、jaxb是什么
jaxb是java architecture for xml binding的缩写。可以将一个java对象转变成为xml格式,反之亦然。
我们把对象与关系数据库之间的映射称为orm,其实也可以把对象与xml之间的映射称为oxm(object xml mapping)。原来jaxb是java ee的一部分,在jdk1.6中,sun将其放到了java se中,这也是sun的一贯做法。jdk1.6中自带的这个jaxb版本是2.0,比起1.0(jsr 31)来,jaxb2(jsr 222)用jdk5的新特性annotation来标识要作绑定的类和属性等,这就极大简化了开发的工作量。
二、jaxb应用模式
在java ee 5\6中,jaxb可以很方便的与jax-rs、jax-ws集成,极大的简化了web service接口的开发工作量。
三、jaxb代码举例
首先定义两个示例类classa,classb,用于后续的示例演示
package com.bjpowernode.test; public class classa { private int classaid; private string classaname; private classb classb; public int getclassaid() { return classaid; } public void setclassaid(int classaid) { this.classaid = classaid; } public string getclassaname() { return classaname; } public void setclassaname(string classaname) { this.classaname = classaname; } public classb getclassb() { return classb; } public void setclassb(classb classb) { this.classb = classb; } }
package com.bjpowernode.test; public class classb { private int classbid; private string classbname; public int getclassbid() { return classbid; } public void setclassbid(int classbid) { this.classbid = classbid; } public string getclassbname() { return classbname; } public void setclassbname(string classbname) { this.classbname = classbname; } }
用于序列化的xmlutil
package com.bjpowernode.test; import java.io.stringreader; import java.io.stringwriter; import javax.xml.bind.*; public class xmlutil { public static string toxml(object obj) { try { jaxbcontext context = jaxbcontext.newinstance(obj.getclass()); marshaller marshaller = context.createmarshaller(); marshaller.setproperty(marshaller.jaxb_encoding, "utf-8");// //编码格式 marshaller.setproperty(marshaller.jaxb_formatted_output, true);// 是否格式化生成的xml串 marshaller.setproperty(marshaller.jaxb_fragment, false);// 是否省略xm头声明信息 stringwriter writer = new stringwriter(); marshaller.marshal(obj, writer); return writer.tostring(); } catch (exception e) { throw new runtimeexception(e); } } @suppresswarnings("unchecked") public static <t> t fromxml(string xml, class<t> valuetype) { try { jaxbcontext context = jaxbcontext.newinstance(valuetype); unmarshaller unmarshaller = context.createunmarshaller(); return (t) unmarshaller.unmarshal(new stringreader(xml)); } catch (exception e) { throw new runtimeexception(e.getmessage()); } } }
调用如下:
package com.bjpowernode.test; public class mainrun { /** * @param args */ public static void main(string[] args) { classb classb = new classb(); classb.setclassbid(22); classb.setclassbname("b2"); classa classa = new classa(); classa.setclassaid(11); classa.setclassaname("a1"); classa.setclassb(classb); system.out.println(xmlutil.toxml(classa)); } }
输出结果如下:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <classa> <classaid>11</classaid> <classaname>a1</classaname> <classb> <classbid>22</classbid> <classbname>b2</classbname> </classb> </classa>
这里要注意以下几点
1.要序列化的类加上 @xmlrootelement注解,否则会报错(错误提示很清晰,这里就不贴出来了)
2.jaxb序列化xml时 默认序列化getter和setter,且getter和setter必须成对出现才会被序列化
3.属性名称,默认序列化出来的类和属性名称默认是首字母转换为小写,若需要控制属性名称需要在getter或setter上使用 @xmlelement(name="classaid") 指定名称,这里要注意的是@xmlelement放置在getter或setter上都行,但只能放一个,也就是说不能同时在getter和setter上使用@xmlelement注解
4.如何控制根节点名称?
使用@xmlrootelement指定name属性即可,如@xmlrootelement(name="classa")
5.怎么添加命名空间
使用@xmlrootelement(namespace="com.bjpowernode.test") 指定namespace属性
6.怎么精确控制每个属性名称
jaxb自动转化为首字母小写会导致不可预料的属性名称出现, 不嫌麻烦的话为每个属性设置@xmlelement(name=""),想省事的话使用field
7.怎么样实现序列化时使用field字段而不是使用setter和getter
在要使用的类上面加上@xmlaccessortype(xmlaccesstype.field)注解,并指定为xmlaccesstype.field,这里强烈推荐使用@xmlaccessortype(xmlaccesstype.field)注解,因为这样你可以精确的控制每个元素的名称,而不需要为每个属性去设置@xmlelement(name="")注解,当然也可以在field上使用@xmlelement注解
下面给出使用了使用如上注解后的代码示例
@xmlrootelement(namespace="com.bjpowernode.test") @xmlaccessortype(xmlaccesstype.field) public class classa { private int classaid; @xmlelement(name="classaname") private string classaname; private classb classb; public int getclassaid() { return classaid; } public void setclassaid(int classaid) { this.classaid = classaid; } public string getclassaname() { return classaname; } public void setclassaname(string classaname) { this.classaname = classaname; } public classb getclassb() { return classb; } public void setclassb(classb classb) { this.classb = classb; } } @xmlrootelement @xmlaccessortype(xmlaccesstype.field) public class classb { private int classbid; private string classbname; public int getclassbid() { return classbid; } public void setclassbid(int classbid) { this.classbid = classbid; } public string getclassbname() { return classbname; } public void setclassbname(string classbname) { this.classbname = classbname; } }
输出xml为
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <ns2:classa xmlns:ns2="com.bjpowernode.test"> <classaid>11</classaid> <classaname>a1</classaname> <classb> <classbid>22</classbid> <classbname>b2</classbname> </classb> </ns2:classa>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 初学Java的备忘录