使用JAXB和ICEfaces创建一个Tree

简介: 使用JAXB和ICEfaces创建一个Tree JAXB表示Java Architecture for XML Binding。它允许把Java和XML绑定在一起。

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

            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"));

目录
相关文章
|
3天前
|
云安全 人工智能 自然语言处理
AI说的每一句话,都靠谱吗?
阿里云提供AI全栈安全能力,其中针对AI输入与输出环节的安全合规挑战,我们构建了“开箱即用”与“按需增强”相结合的多层次、可配置的内容安全机制。
|
9天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
4天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
412 185
|
2天前
|
数据采集 消息中间件 人工智能
跨系统数据搬运的全方位解析,包括定义、痛点、技术、方法及智能体解决方案
跨系统数据搬运打通企业数据孤岛,实现CRM、ERP等系统高效互通。伴随数字化转型,全球市场规模超150亿美元,中国年增速达30%。本文详解其定义、痛点、技术原理、主流方法及智能体新范式,结合实在Agent等案例,揭示从数据割裂到智能流通的实践路径,助力企业降本增效,释放数据价值。
|
8天前
|
人工智能 自然语言处理 安全
国内主流Agent工具功能全维度对比:从技术内核到场景落地,一篇读懂所有选择
2024年全球AI Agent市场规模达52.9亿美元,预计2030年将增长至471亿美元,亚太地区增速领先。国内Agent工具呈现“百花齐放”格局,涵盖政务、金融、电商等多场景。本文深入解析实在智能实在Agent等主流产品,在技术架构、任务规划、多模态交互、工具集成等方面进行全维度对比,结合市场反馈与行业趋势,为企业及个人用户提供科学选型指南,助力高效落地AI智能体应用。
|
4天前
|
消息中间件 安全 NoSQL
阿里云通过中国信通院首批安全可信中间件评估
近日,由中国信通院主办的 2025(第五届)数字化转型发展大会在京举行。会上,“阿里云应用服务器软件 AliEE”、“消息队列软件 RocketMQ”、“云数据库 Tair”三款产品成功通过中国信通院“安全可信中间件”系列评估,成为首批获此认证的中间件产品。此次评估覆盖安全可信要求、功能完备性、安全防护能力、性能表现、可靠性与可维护性等核心指标,标志着阿里云中间件产品在多架构适配与安全能力上达到行业领先水平。
311 194