JAXB使用经验总结

使用JAXB首先要知道它是干什么的
当然,切入正题
很多时候我们需要把认知世界转化为我们熟悉的java对象,以供方便操作。这里,JAXB可以把xml对象转化为我们的java对象,也可以把java对象转化为xml对象。这时候我们就得知道它的两个转化方法。
一个是[b]unmarshal()[/b],一个是[b]marshal()[/b]

[color=red]unmarshal()是把xml对象转化为我们需要的java对象的方法,自然marshal()是把java对象转化为xml对象的一个过程。[/color]

我们需要的估计就是这两个方法的精华,只需要用到这么多就可以完成很多的事情了。下面看代码:


private static <T> T unmarshal(File templateFile, JAXBContext context) throws JAXBException {

final Unmarshaller unmarshaller = context.createUnmarshaller();

// Unmarshal the XML in the stringWriter back into an object
final T chart = (T) unmarshaller.unmarshal(templateFile);

return chart;
}

@SuppressWarnings("unchecked")
private static <T> T unmarshal(String template, JAXBContext context) throws JAXBException {

final Unmarshaller unmarshaller = context.createUnmarshaller();

// Unmarshal the XML in the stringWriter back into an object
final T chart = (T) unmarshaller.unmarshal(new StringReader(template));

return chart;
}




这里[color=blue]templateFile[/color] 和 [color=blue]template[/color] 都是xml文件对象,这样的两个overload method就可以完成由xml对象转化为java对象了。


private static <T> String marshal(JAXBContext context, final T chart) throws JAXBException {
// Create the marshaller, this is the nifty little thing that will
// actually transform the object into XML
final Marshaller marshaller = context.createMarshaller();

// Create a stringWriter to hold the XML
final StringWriter stringWriter = new StringWriter();

// Marshal the javaObject and write the XML to the stringWriter
marshaller.marshal(chart, stringWriter);

String chartXml = stringWriter.toString();
return chartXml;
}



marshal()方法也贡献上。


[b]方法都具备了 可以开工了。[/b]

public static <T> String process(File templateFile, Class<T> type, ChartFiller<T> filler) {
String chartXml = null;

try {
JAXBContext context = JAXBContext.newInstance(type);

final T chart = (T) unmarshal(templateFile, context);

filler.fill(chart);

chartXml = marshal(context, chart);

} catch (JAXBException e) {
log.error(e.getMessage(), e);
}
return chartXml;
}

public static <T> String process(String template, Class<T> type, ChartFiller<T> filler) {
String chartXml = null;

try {
JAXBContext context = JAXBContext.newInstance(type);

final T chart = (T) unmarshal(template, context);

filler.fill(chart);

chartXml = marshal(context, chart);

} catch (JAXBException e) {
log.error(e.getMessage(), e);
}
return chartXml;
}

public interface ChartFiller<T> {
void fill(T chart);
}



工具方法都上齐了,你就可以在你需要的地方调用了。当然,我还没讲我们的java操作对象。

下面举个例子,比如上面出现的chart 就是我们需要操纵的对象,它可能是一个xml对象,而我们需要操作的是java对象,晕了吧:
比如我们的chart是在页面需要显示的图形,比如fusioncharts 的某个图,先定义为chart,它会是一个接口类,是所有xxxChart的父类。 比如我的具体chart名叫GaugeChart。

代码如下,别说晕说郁闷了:


public interface Chart {

}




@XmlRootElement(name = "chart")
public class GaugeChart implements Chart {

@XmlAttribute
private String lowerLimit;

@XmlAttribute
private String upperLimit;

@XmlAttribute
private String lowerLimitDisplay;

@XmlAttribute
private String upperLimitDisplay;

@XmlAttribute
private String majorTMNumber;

@XmlAttribute
private String majorTMColor;

@XmlAttribute
private String majorTMHeight;

@XmlAttribute
private String minorTMNumber;

@XmlAttribute
private String minorTMColor;

@XmlAttribute
private String minorTMHeight;

@XmlAttribute
private String displayValueDistance;

@XmlAttribute
private String tickValueDistance;

@XmlAttribute
private String gaugeStartAngle;

@XmlAttribute
private String gaugeEndAngle;

@XmlAttribute
private String palette;

@XmlAttribute
private String showValue;

@XmlAttribute
private String numberSuffix;

@XmlElementWrapper(name = "colorRange")
@XmlElement(name = "color")
private List<Color> colors;

@XmlElementWrapper(name = "dials")
@XmlElement(name = "dial")
private List<Dial> dials;

@XmlElementWrapper(name = "annotations")
@XmlElement(name = "annotationGroup")
private List<AnnotationGroup> annotations;

public void addAnnotationGroup(AnnotationGroup annotationGroup) {
if (annotations == null)
annotations = new LinkedList<AnnotationGroup>();
this.annotations.add(annotationGroup);
}

public void addDials(Dial dial) {
if (dials == null)
dials = new LinkedList<Dial>();
this.dials.add(dial);
}

public void setAnnotations(List<AnnotationGroup> annotations) {
this.annotations = annotations;
}

public void setDials(List<Dial> dials) {
this.dials = dials;
}

public void setColors(List<Color> colors) {
this.colors = colors;
}

public void addColor(Color color) {
if (color == null)
colors = new LinkedList<Color>();
this.colors.add(color);
}

public void setLowerLimit(String lowerLimit) {
this.lowerLimit = lowerLimit;
}

public void setUpperLimit(String upperLimit) {
this.upperLimit = upperLimit;
}

public void setLowerLimitDisplay(String lowerLimitDisplay) {
this.lowerLimitDisplay = lowerLimitDisplay;
}

public void setUpperLimitDisplay(String upperLimitDisplay) {
this.upperLimitDisplay = upperLimitDisplay;
}

public void setMajorTMNumber(String majorTMNumber) {
this.majorTMNumber = majorTMNumber;
}

public void setMajorTMColor(String majorTMColor) {
this.majorTMColor = majorTMColor;
}

public void setMajorTMHeight(String majorTMHeight) {
this.majorTMHeight = majorTMHeight;
}

public void setMinorTMNumber(String minorTMNumber) {
this.minorTMNumber = minorTMNumber;
}

public void setMinorTMColor(String minorTMColor) {
this.minorTMColor = minorTMColor;
}

public void setMinorTMHeight(String minorTMHeight) {
this.minorTMHeight = minorTMHeight;
}

public void setDisplayValueDistance(String displayValueDistance) {
this.displayValueDistance = displayValueDistance;
}

public void setTickValueDistance(String tickValueDistance) {
this.tickValueDistance = tickValueDistance;
}

public void setGaugeStartAngle(String gaugeStartAngle) {
this.gaugeStartAngle = gaugeStartAngle;
}

public void setGaugeEndAngle(String gaugeEndAngle) {
this.gaugeEndAngle = gaugeEndAngle;
}

public void setPalette(String palette) {
this.palette = palette;
}

public void setShowValue(String showValue) {
this.showValue = showValue;
}

public void setNumberSuffix(String numberSuffix) {
this.numberSuffix = numberSuffix;
}

@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}


上面那一堆的注解来自jaxb的jar包,下哪些包我就不说了。估计应该能看懂个所以然吧,那些属性都是这个gaugeChart所需要的图形显示属性,不必去细究,它需要什么,我们按上面添加就是了,不过貌似没有get()方法,不需要这个。里面注解的像这样的@XmlElement(name = "annotationGroup") ,这个annotationGroup也是像GaugeChart这样的java对象,需要被定义。


接下来我们可以在action中调用了。


private String getXxxXml() {

String template = getTemplate();
String chartXml = JAXBUtils.process(template, GaugeChart.class,
new JAXBUtils.ChartFiller<GaugeChart>() {

public void fill(final GaugeChart chart) {
Dial dial1 = new Dial();
dial1.setValue("");
dial1.setRearExtension("10");
chart.addDials(dial1);
}
});
return chartXml;
}


这样的一个方法返回的就是一个xml的string型对象了,我们只需要在页面拿到这个string型的xml ,就可以通过fusioncharts(当然是我这里用了fusioncharts)来调用它并显示相应的图形了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值