`
xiaoliang330
  • 浏览: 115595 次
  • 性别: 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]

相关推荐

    JAXB 学习资料 作者个人总结和测试程序

    "jaxb使用文档.doc"是作者根据个人经验和测试结果编写的说明文档,它详细解释了JAXB 2.0的关键概念、使用方法和注意事项,是学习和掌握JAXB的重要参考资料。文档中可能包括了如何创建和使用绑定文件,如何处理XML...

    webservice实例 CXF的JAXWS和JAXRS实现 及JAXB标准接口实现带jar包

    Web服务在IT行业中扮演着重要的角色,允许不同的系统和应用程序之间进行通信和数据交换。CXF是一个流行的开源框架...无论是对于新手还是有经验的开发者,都能从中获益,掌握如何在Java环境中高效地构建和使用Web服务。

    J2EE(Java EE)技术总结-J2EE学习精华教程-电子书

    本书内容非常全面,涵盖了多册J2EE书籍所有知识要点,并结合作者自己经验总结而编写,内容相当丰富 众所周知,一般书籍为了销售需要,往往很少的知识点,却需要添加大量的废话、例子,以增加书本厚度,使得阅读者...

    java xml 经验 html

    例如,使用Java的JAXB(Java Architecture for XML Binding)框架可以将Java对象直接转换为XML,反之亦然,大大简化了数据交换的过程。 总结来说,XML是数据交换的通用格式,HTML是构建网页的基石,而Java作为后端...

    java常见面试题总结

    在Java面试中,面试官经常考察候选人的基础知识、问题解决能力和实际编程经验。本篇将重点讨论如何使用Java解析XML文档,这是一个常见的面试题。 XML(eXtensible Markup Language)是一种用于标记数据的语言,常...

    dozer(PDF)

    - **第三方对象工厂**:支持使用XMLBeans、JAXB等第三方框架来创建对象实例。 - **监听Dozer事件**:可以通过注册监听器来监控Dozer执行过程中的各种事件。 **2.9 PDF文档** Dozer提供了详细的PDF文档供用户参考,...

    axis2的API,axis2 API,axis2帮助文档

    - **JAXB**: 使用Java Architecture for XML Binding(JAXB)进行XML到Java对象的转换。 ### 总结 Apache Axis2是一个强大的Web服务框架,其API提供了高度的灵活性和可扩展性。通过深入理解Axis2的API和充分利用...

    dom4j-2.1.0.jar

    《深入理解DOM4J:基于2.1.0版本》 DOM4J是Java社区中广泛使用的XML处理库,它的全称是“Document Object Model for ...无论是新手还是经验丰富的开发者,都可以从中找到合适的工具和方法,实现高效、精准的XML操作。

    XFire开发指南,很详细的书

    本书不仅是一份开发指南,更是一个实践经验的总结。虽然没有涵盖XFire的所有方面,但对于开发者来说,本书所提供的信息足以帮助他们快速上手并深入理解XFire的核心概念和技术细节。对于那些想要深入了解XFire特性和...

    java2库类查询

    Java 2 库类查询工具是一款专为Java开发者设计的小巧型软件,它提供了一个高效且便捷的方式来查找和理解Java库中的类和方法。...无论你是初学者还是经验丰富的开发者,都应该尝试使用这款工具,让开发过程更加顺畅。

    2013年3月上海用友汽车java面试题(最新)

    6. **设计模式**: 设计模式是软件开发中的经验总结,例如工厂模式、单例模式、观察者模式、装饰者模式等。在实际工作中,可能会遇到工厂模式用于创建对象,单例模式保证类只有一个实例,观察者模式实现发布/订阅,...

    rome源码包和jar包

    - 支持JAXB(Java Architecture for XML Binding),可以将feed对象序列化为XML,反之亦然。 5. **Rome与XML解析** - Rome库底层使用了JDOM和StAX等XML解析技术,但对开发者隐藏了这些细节,提供了一致的API。 -...

    J2EE API 文档.chm格式

    **Java EE(J2EE)API文档** Java EE(以前称为J2EE)是Java平台上用于构建企业级分布式应用程序的...无论是初学者还是经验丰富的开发人员,都应该熟悉并经常查阅这些文档,以保持对Java EE最新特性和最佳实践的了解。

    最新apache-cxf-3.2.7

    - **数据绑定**:CXF支持JAXB(Java Architecture for XML Binding)和Aegis绑定,用于对象到XML和XML到对象的转换。 - **MTOM/XOP**:CXF支持Binary Attachments for XML(MTOM)和XML Inline Binary Data(XOP)...

    jax-ws tuto

    ### JAX-WS 教程:服务器端与客户端详解 #### 概览 JAX-WS(Java API for XML Web Services)是Java平台标准的一部分,用于开发和...无论是对于初学者还是有经验的开发者而言,JAX-WS 都是一个值得学习和使用的API。

Global site tag (gtag.js) - Google Analytics