关闭

使用JAXB和ICEfaces创建一个Tree

标签: jaxbtreeschemaborder文档xml
2361人阅读 评论(0) 收藏 举报
分类:

使用JAXB和ICEfaces创建一个Tree


JAXB表示Java Architecture for XML Binding。它允许把Java和XML绑定在一起。这意味着你可以在Java程序中访问XML文档的数据。这对创建schema驱动的用户界面特别便利。它允许你在XML文档内设置所有的界面(UI)信息,改变内容更方便。
在ICEfaces中,tree组件是经常用到的组件之一。本文将说明怎样通过源自XML文档中的数据来建立tree组件作为菜单。我们不但要使用XML文档中的信息创建tree,还要使用tree来展示XML文档所包含的信息。
1)供访问和显示的数据文件为:treeDocument.xml。其包含的信息大致有:name,registry,crew size,ship type等。
2)Schema
首先要有一个一致的schema。一个xml schema是以.xsd形式的文档,也是一个xml规范,管理一个XML文档内的各组件是否允许。基本上,它是一个元素大纲,指示xml文档中的元素,如出现次序、带什么属性、其子元素又是什么等。JAXB需要用W3C Schema语法写的schema文档。这个schema将是treeDocument.xsd。它定义了<Fleet>元素作为一个复杂类型,子元素为<ship>,每一个<ship>还有<shipType>子元素,<shipType>又有子元素<name>,<registry>,<crewSize>。
3)绑定Schema
绑定schema包括一系列表示schema的java类。所有的JAXB实现都提供了一个绑定schema的工具。这个工具能调用大量依赖雨其实现的不同的方法。这里,我们使用命令行来执行jar方法(其它的方法可以参考JAXB的帮助文件)。这里可以有不同的方法来完成绑定处理,你可以复制整个JAXB目录到你的项目目录下,否则我们将复制你的schema文件到JABX/lib目录下,运行下面的命令行:
4)非编组(Unmarshalling)文档
非编组(Unmarshalling)文档意味着创建一个树状内容的对象来表示文档的组织。
要unmarshal一个文档:
(1)创建一个JAXBContext对象。它提供了JAXB API的入口点。
Import javax.xml.bind.JAXBContext;
JAXBContext jc=JAXBContext.newInstance(?com.icesoft.icefaces.resource.tutorial.component.jaxb?);
(2)建立Unmarshaller对象。
import javax.sml.bind.Unmarshaller;
Unmarshaller unmarshaller=jc.createUnmarshaller();
(3)调用unmarshal()方法。
Fleet fleet=(Fleet)unmarshaller.unmarshal(new File(?treeDocument.xml?));
(4)你可以选择使用一个单独的类用于JAXB管理器,也可以直接写代码到应用程序的bean中。这里把它写入treeBean类作为一个静态的模块。
static{
    try{
        jc=JAXBContext.newInstance("com.icesoft.icefaces.resource.tutorial.component.jaxb");
        unmarshaller=(Unmarshaller)jc.createUnmarshaller();
        fleet=(Fleet)unmarshaller.unmarshal(new File("treeDocument.xml"));
    } catch(JAXBException ex){
        ex.printStackTrace();
    }
}
5)Backing Bean和Tree设置
一旦unmarshalling完成,就可以使用编译器创建的标准getters访问数据了。
public treeBean(){
    Fleet.Ships shipTpe=fleet.getShips();
    ArrayList shipList=(ArrayList)shipType.getShip();
    ship1=(shipType)shipList.get(0);
    ship2=(shipType)shipList.get(1);
    ...
}
一旦创建了Ship对象,就到把它们放入tree节点的时候了。
public treeBean(){
    ...
    // create root node with its children expanded
    rootTreeNode=new DefaultMutableTreeNode();
    UrlNodeUserObject rootObject=new UrlNodeObject(rootTreeNode);
    rootObject.setText("Fleet");
    rootObject.setUrl("");
    rootObject.setExpanded(true);
    rootTreeNode.setUserObject(rootObject);
    ...
}
然后,增加每一个ship作为一个新节点。
public treeBean(){
    ...
    // model is accessed by the ice:tree component
    model=new DefaultTreeModel(rootTreeNode);
    // add Ship1 child node
    DefaultMutableTreeNode branchNode=new DefaultMutableTreeNode();
    UrlNodeUserObject branchObject=new UrlNodeUserObject(branchNode);
    branchObject.setText(ship1.getName());
    branchNode.setUserObject(branchObject);
    rootTreeNode.add(branchNode);
    // add Ship2 child node
    branchNode=new DefaultMutableTreeNode();
    branchObject=new UrlNodeUserObject(branchNode);
    branchObject.setText(ship2.getName());
    branchNode.setUserObject(branchObject);
    rootTreeNode.add(branchNode);
    ...
}
6)JSP页面和tree设置
现在该创建含tree的JSP页面了。由于我们的tree用panelStack来控制,我们将使用commandLink作为节点,并插入参数param。
<ice:panelGroup styleClass="treeContainer">
    <ice:tree id="tree" value="#{treeBean.model}" var="item" hideRootNode="false"
        hideNavigation="false" imageDir="./xmlhttp/css/xp/css-images/">
        <ice:treeNode>
            <f:facet name="content">
                <ice:panelGroup style="display: inline">
                    <ice:commandLink value="#{item.userObject.text}" actionListener="#{panelStack.selectedPanelChangedAction}"
                        style="font-weight:bold; border:1px solid black; padding-right:2px; padding-left:2px; background-color:#ccd269">
                    </ice:commandLink>
                </ice:panelGroup>
            </f:facet>
        </ice:treeNode>
    </ice:tree>
</ice:panelGroup>
现在还需实现panelStack backing bean的selectedPanelChangedAction() 方法:
public void selectedPanelChangedAction(ActionEvent event){
    FacesContext context=FacesContext.getCurrentInstance();
    Map map=context.getExternalContext().getRequestParameterMap();
    selectedPanel=(String)map.get("ships");
}
下一步是创建panel stack。
<ice:panelStack selectedPanel="#{panelStack.selectedPanel}" >

                 <ice:panelGroup id="Fleet">
                    <ice:outputText value="The 31st Exploratory Fleet" style="font-weight:bold; border:1px solid black;
                         background-color:#a4bdd2; padding-right:2px; padding-left:2px"/>
                    <br/><br/>
                    <ice:panelGroup style=" border:1px solid black; background-color:#a6a7a9; padding-right:2px; padding-left:2px">
                        <ice:outputText value="This Fleet contains 2 ships: the USS-JAXB and the USS-ICE.
                                                    Both are highly advanced and useful in many different scenarios. Use the tree links on the left to
                                                    see the details of the different ships." />
                    </ice:panelGroup>
                 </ice:panelGroup>

                 <ice:panelGroup id="USS-JAXB">
                    <ice:outputText value="Name:" style="font-weight:bold; border:1px solid black; background-color:#a4bdd2;
                        padding-right:2px; padding-left:2px"/>
                    <ice:outputText value="#{treeBean.ship1.name}" style="border:1px solid black; background-color:#a6a7a9;
                        padding-right:2px; padding-left:2px"/>
                    <br/><br/>
                    <ice:outputText value="Registry:" style="font-weight:bold; border:1px solid black; background-color:#a4bdd2; padding-right:2px;
                        padding-left:2px"/>
                    <ice:outputText value="#{treeBean.ship1.registry}" style="border:1px solid black; background-color:#a6a7a9;
                        padding-right:2px; padding-left:2px"/>
                    <br/><br/>
                    <ice:outputText value="Crew Size:" style="font-weight:bold; border:1px solid black; background-color:#a4bdd2; padding-right:2px;
                        padding-left:2px"/>
                    <ice:outputText value="#{treeBean.ship1.crewSize}" style="border:1px solid black; background-color:#a6a7a9;
                        padding-right:2px; padding-left:2px"/>
                    <br/><br/>
                    <ice:outputText value="Description:" style="font-weight:bold; border:1px solid black; background-color:#a4bdd2; padding-right:2px;
                        padding-left:2px"/>
                    <ice:outputText value="#{treeBean.ship1.description}" style="border:1px solid black; background-color:#a6a7a9;
                        padding-right:2px; padding-left:2px"/>
                    <br/><br/>
                    <ice:outputText value="Ship Type:" style="font-weight:bold; border:1px solid black; background-color:#a4bdd2; padding-right:2px;
                        padding-left:2px"/>
                    <ice:outputText value="#{treeBean.ship1.shipFleetType}" style="border:1px solid black; background-color:#a6a7a9;
                        padding-right:2px;  padding-left:2px"/>
                </ice:panelGroup>
 7)结论
 JAXB通过创建用户界面的schema为我们提供了一个极好的桥梁。
 确定treeDocument.xml在指定路径中:
 fleet=(Fleet)unmarshaller.unmarshal(new File("treeDocument.xml"));
  

0
0
查看评论

Jaxb 学习

网上找了很多jaxb 的资料自己留下印记,以免以后还得再找: 例子来源: http://www.2cto.com/kf/201312/264168.html http://terrencexu.iteye.com/blog/702089 http://blog.itpub.net/2...
  • alibert
  • alibert
  • 2015-01-21 15:00
  • 1647

使用JAXB处理JAVA和XML

java-->xml:编排,marshal xml-->java:反编排,unmarshal
  • linjingj
  • linjingj
  • 2013-11-30 23:49
  • 1241

JAXB的继承,解组到封送类的子类

我用JAXB来读写XML。我要的是一个基类JAXB的编组和继承的JAXB类解组。这是为了允许一个发送者的Java应用程序发送XML到另一个接收机的Java应用程序。发送者和接收者将共享JAXB库。我想接收到的XML解组到它扩展了通用的JAXB类接收器特定的JAXB类。 例如: 这是JAXB类,它由发...
  • yaov_yy
  • yaov_yy
  • 2016-01-12 14:21
  • 2020

JAXB:创建package-info

//@XmlSchema( // xmlns={ // @XmlNs(prefix="ns", namespaceURI="http://search.fitruums.com/1/") // }, // elementFormDefault = ...
  • qq592304796
  • qq592304796
  • 2016-12-05 15:18
  • 558

JAXB基本使用

JAXB基本使用 JAXB主要用来实现对象和XML之间的序列化和反序列化,关于JAXB的介绍就不多说了,网上一搜一大把,这里主要总结下基本使用方法和一些注意事项 首先定义两个示例类ClassA,ClassB,用于后续的示例演示 package cn.lzrabb...
  • yellowd1
  • yellowd1
  • 2015-10-31 23:36
  • 951

在java环境下读取xml文件的方法主要有4种:DOM、SAX、JDOM、JAXB、Dom4J

http://www.iteye.com/topic/668280 1.  DOM(Document Object Model)   此 方法主要由W3C提供,它将xml文件全部读入内存中,然后将各个元素组成一棵数据树,以便快速的访问各个节点 。 因此非常消耗系统性...
  • htofly
  • htofly
  • 2012-07-12 14:51
  • 3846

JAXB与XStream之java对象与xml转换

How Does JAXB Compare to XStream? The XStream FAQ states the following when being compared to JAXB: JAXB is a Java binding tool. It ge...
  • fengspg
  • fengspg
  • 2014-05-21 17:05
  • 2193

jaxb 生成xsd文件

本来想直接张贴代码的,但是公司用的是内网,考不出来,直接手工敲代码,可能会有错误,自己改就行了 首先我们新建一个类用来配置我们的路劲,如下:public class XSDBuilder{ private final String path; private final String...
  • ooiuy450
  • ooiuy450
  • 2017-11-08 10:52
  • 90

对象转xml or xml转对象(XStream and jaxb)

需要的jar包:xstream-1.4.2.jar maven pom 依赖:          com.thoughtworks.xstream      ...
  • u010629028
  • u010629028
  • 2014-10-08 16:59
  • 387

对XML文件的解析,DOM、SAX、JDOM、JAXB还有dom4

1.  DOM(Document Object Model)   此 方法主要由W3C提供,它将xml文件全部读入内存中,然后将各个元素组成一棵数据树,以便快速的访问各个节点 。 因此非常消耗系统性能 ,对比较大的文档不适宜采用DOM方法来解析。 DOM API 直接...
  • hexi_sijin
  • hexi_sijin
  • 2015-07-15 09:35
  • 951
    个人资料
    • 访问:5970969次
    • 积分:52217
    • 等级:
    • 排名:第64名
    • 原创:797篇
    • 转载:23篇
    • 译文:24篇
    • 评论:1190条
    一名路过的黑客

    大家好,我是黑客,专门盗账号的。现在这个人的帐号被我盗了,但看这个人平时的博客空间,一直过着艰苦努力、持之以恒的技术研究生活,勤奋刻苦,积极分享,无私奉献,我被深深的感动了,这是一个纯粹的人,人品这样的高尚,希望大家看到我这条消息后,可以私聊他,多鼓励他,不缺钱的就多给他一些经济上的资助,让他再接再厉!就这样吧,我下线了,眼框湿湿的难受。

    文章存档