`
xiaoliang330
  • 浏览: 111935 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JAXB使用经验总结

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

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

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

   
 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;
    }

    



这里templateFiletemplate 都是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()方法也贡献上。 


方法都具备了 可以开工了。
   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)来调用它并显示相应的图形了。

 
分享到:
评论
3 楼 ron.luo 2014-12-31  
干货,必须得顶。
2 楼 友友水 2013-06-08  
。。。。不好意思,无心之失,删不掉前一条评论
1 楼 友友水 2013-06-08  
[/flash][/flash][/flash][/flash][/flash][/flash][/flash][/flash][/flash][/flash][/flash][/flash][/flash][/flash][/flash][/flash][/flash][/flash][/flash]

相关推荐

Global site tag (gtag.js) - Google Analytics