java学习之jaxb的学习一

:D [b]一:jaxb是什么[/b]
jaxb是java architecture for xml binding的缩写,可以将java对象转换成xml,反之亦然!
这是帮助文档:[url]http://docs.jboss.org/resteasy/docs/2.3.5.Final/userguide/html_single/index.html#JAXB_+_JSON_provider[/url]
我们把对象和关系数据库之间的映射称之为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来标识要作绑定的类和属性等,这就极大简化了开发的工作量。
[b]二、jaxb应用模式[/b]
在JAVA EE 5\6中,jaxb可以很方便的与jax-rs、jax-ws集成,极大的简化了web service接口的开发工作量。

需要引入javax.xml.bind.jar,我是用myeclipse直接创建的web项目就不需要引入jar包,有自带的,所以建议创建web项目

下面是简单的demo
[b]从javabean到xml的转换[/b]
写一个java实体类
package test.entity;

import java.util.Date;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import test.adapter.DateAdapter;

@XmlType(name="test",propOrder={"id","name","pro","date"})
@XmlRootElement(name="Test")
public class Test {
/**
* 这里值的注意的地方是,我并没有设置它的xmlAccessorType,所以默认的是
* PUBLIC_MEMBER的,所以此时的get set方法和xmlElement不能共存 如果写了
* xmlElement注解以后就不要再写get方法了,
* 如果此时既有get方法也就注解,那么会报错(2 counts of IllegalAnnotationExceptions)
* 所以前两个属性我设置了注解就只有set方法,而pro属性就没有注解所以get set方法都有
* 一般时候我都不写注解写set get方法,因为这样我从xml转到javabean的时候就可以通过
* get方法来取得其值了
*/
@XmlElement
private String id;
@XmlElement
private String name;

private String pro;

@XmlJavaTypeAdapter(value=DateAdapter.class)
private Date date;


public void setId(String id) {
this.id = id;
}

public void setName(String name) {
this.name = name;
}

public String getPro() {
return pro;
}

public void setPro(String pro) {
this.pro = pro;
}

public void setDate(Date date) {
this.date = date;
}

}


然后写一个自定义的Adapter来转化时间
@XmlJavaTypeAdapter常用在转换比较复杂的对象时,如map类型或者格式化日期等。使用此注解时,需要自己写一个adapter类继承XmlAdapter抽象类,并实现里面的方法。
package test.adapter;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class DateAdapter extends XmlAdapter<String, Date>{
private String pattern = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat fmt = new SimpleDateFormat(pattern);

@Override
public String marshal(Date v) throws Exception {

return fmt.format(v);
}

@Override
public Date unmarshal(String v) throws Exception {

return fmt.parse(v);
}

}



最后写一个测试的类来测试这个能不能行得通:
package testApp;

import java.io.StringWriter;
import java.util.Date;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import test.entity.Test;

public class TestApp {
public static void main(String[] args) throws JAXBException{
Test test = new Test();
test.setId("111");
test.setName("test");
test.setPro("pro");
test.setDate(new Date());
JAXBContext context = JAXBContext.newInstance(Test.class);
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(test, writer);
System.out.println(writer.toString());


测试结果如下:

[img]http://dl2.iteye.com/upload/attachment/0103/6365/28d21099-b50f-3e3a-a625-bced897fbc58.png[/img]


[url]http://www.cnblogs.com/superjt/p/3310322.html[/url]这是解析xml的地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值