Customer.java
package org.jaxb.model;
import java.util.Date;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessOrder;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorOrder;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlList;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
/*XmlRootElement中的那么属性作用为:
*
* <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<c>
<id>1</id>
<username>张三</username>
<password>123</password>
<email>zhangsan@126.com</email>
</c>
*
* 若果不写则默认为 customer
* */
@XmlRootElement()
//访问的方式 field:java对象中的所有成员变量
//PROPERTY:java对象中所有通过getter/setter方式访问的成员变量
//.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量
//NONE:java类中属性不作为
@XmlAccessorType(XmlAccessType.FIELD)
//生成的按字母顺序排序
//XmlAccessOrder.UNDEFINED 不排序
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
//这个与<span style="font-family: Arial, Helvetica, sans-serif;">XmlAccessorOrder结合使用</span>
@XmlType(name="cus", propOrder={
"id","username" ,"email","bornDate"
})
public class Customer {
/*
* name 的作用为:
* <customer>
* <标示>1</标示>
* </customer>
* 缺省则表示为属性的名称
* <id>1<id>
*/
// @XmlElement(name="标示")
/*
* <customer id="1">
<username>张三</username>
<password>123</password>
<email>zhangsan@qq.com zhangsan@126.com</email>
</customer>
* */
//@XmlAttribute
private int id ;
private String username ;
@XmlTransient
private String password ;
/*
* <customer>
<标示>1</标示>
<username>张三</username>
<password>123</password>
<emails>
<emailAddress>zhangsan@qq.com</emailAddress>
<emailAddress>zhangsan@126.com</emailAddress>
</emails>
</customer>
* @XmlElementWrapper 在email外在包一层。
*
* */
// @XmlElementWrapper(name="emails")
// @XmlElement(name="emailAddress")
/*
* <email>zhangsan@qq.com zhangsan@126.com</email>
* @XmlList 作用就是把List类型在同一行输出,用空格隔开
*
* */
@XmlList
private List<String> email ;
@XmlJavaTypeAdapter(DataAdapter.class)
private Date bornDate ;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public List<String> getEmail() {
return email;
}
public void setEmail(List<String> email) {
this.email = email;
}
public Date getBornDate() {
return bornDate;
}
public void setBornDate(Date bornDate) {
this.bornDate = bornDate;
}
}
DataAdapter.class
package org.jaxb.model;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class DataAdapter extends XmlAdapter<String, Date> {
private String pattern = "yyyy-MM-dd" ;
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
@Override
public Date unmarshal(String v) throws Exception {
return sdf.parse(v);
}
@Override
public String marshal(Date v) throws Exception {
return sdf.format(v);
}
}
测试类
package org.jaxb.model;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
public class TestJaxb {
public static void main(String[] args) {
try {
JAXBContext context = JAXBContext.newInstance(Customer.class);
Customer customer = new Customer() ;
customer.setId(1);
customer.setUsername("张三");
customer.setPassword("123");
List<String> emails = new ArrayList<String>();
emails.add("zhangsan@qq.com");
emails.add("zhangsan@126.com");
customer.setEmail(emails);
customer.setBornDate(new Date());
Marshaller marshaller= context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(customer, System.out);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
运行的结果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer>
<id>1</id>
<username>张三</username>
<email>zhangsan@qq.com zhangsan@126.com</email>
<bornDate>2014-07-25</bornDate>
</customer>
总结:
@XmlRootElement:定义xml根元
@XmlAccessorType:访问类型,四中,上面说明了
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)两种方式说明xml中出现的次序
@XmlType 与@XmlAccessorOrder结合使用,也能起到排序作用,propOrder必须全部的列出,否则会报错
@XmlElement:定义xml元素
@XmlAttribute:定义xml的属性
@XmlTransient :定义不出选在xml中的属性
@XmlJavaTypeAdapter(DataAdapter.class):复杂类型的适配器
@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。