您的位置:首页 > 其它

JAXB使用经验总结

2013-12-06 09:49 267 查看
使用JAXB首先要知道它是干什么的

当然,切入正题

很多时候我们需要把认知世界转化为我们熟悉的java对象,以供方便操作。这里,JAXB可以把xml对象转化为我们的java对象,也可以把java对象转化为xml对象。这时候我们就得知道它的两个转化方法。

一个是unmarshal(),一个是marshal()

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

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

Java代码

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;

}

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

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()方法也贡献上。

方法都具备了 可以开工了。

Java代码

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。

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

Java代码

public interface Chart {

}

Java代码

@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中调用了。

Java代码

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)来调用它并显示相应的图形了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: