天天看点

使用JAXB和ICEfaces创建一个Tree

使用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。它定义了元素作为一个复杂类型,子元素为,每一个还有子元素,又有子元素,,。

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节点的时候了。

    // 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作为一个新节点。

    // 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());

6)JSP页面和tree设置

现在该创建含tree的JSP页面了。由于我们的tree用panelStack来控制,我们将使用commandLink作为节点,并插入参数param。

        hideNavigation="false" imageDir="./xmlhttp/css/xp/css-images/">

                        style="font-weight:bold; border:1px solid black; padding-right:2px; padding-left:2px; background-color:#ccd269">

现在还需实现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。

 7)结论

 JAXB通过创建用户界面的schema为我们提供了一个极好的桥梁。

 确定treeDocument.xml在指定路径中:

 fleet=(Fleet)unmarshaller.unmarshal(new File("treeDocument.xml"));