基于XML的网管系统界面自动生成技术崔贺超,陈旭东,杨芳南(北京交通大学网络管理研究中心,北京100044)摘要:在网管系统中涉及大量配置管理的用户界面,为每一个配置管理界面编写专门的代码是一项繁杂、重复性的工作。为解决这一问题,提供一种基于XML的网管系统界面自动生成技术,介绍了界面自动生成的优点和原理,并通过实例,详细阐述了XML文档格式、组件事件监听类的事件处理方法和界面生成器的实现方案。该技术能够极大的提高网管界面的开发效率,并增强了软件的可理解性和可维护性。关键词:XML;网络管理;界面AnAutomaticGenerationTechnologyofNetworkManagementSystemBasedOnXMLCuiHechao,ChenXudong,YangFangnan(NetworkManagementResearchCenter,BeijingJiaotongUniversity,Beijing,100044)Abstract:Analarminterfacemodelforintegratedalarmmanagementsystemofcommunicationnetworkisoffered.Thedefinitionofalarmandconfigurationinformationformat,theimplementationtechnologyforthemodel,andthedefinitionofwebservicesaredissertated.TheinformationbetweenintegratedalarmmanagementsystemandeachprofessionalsubordinatenetworkmanagementsystemisexchangedbyXML.Keywords:integratednetworkmanagement;interfacemodel;alarm;XML;WebService1.引言在网管系统的开发中,涉及大量配置管理操作。在通常情况下,需要是对每一项配置管理功能的界面专门编写代码来实现。这是一项繁琐的工作,会占用开发人员大量的时间和精力。本文提出一种基于XML的网管系统界面自动生成技术,使用XML文件作为界面描述文档,程序设计语言通过解析该XML文件生成所需要的界面。界面自动生成技术具有如下优点:1、实现了表现层和功能层的分离,提高了程序的可维护性和可重用性。2、通过修改界面描述XML文档可以在不重新编译源程序的情况下实现对用户界面的修改。3、可以极大的减少界面开发中繁杂、重复性的工作,使开发人员更加专注于业务逻辑,提高效率。2.界面自动生成的原理界面自动生成的原理如下图所示:图1.界面自动生成技术框架图由上图可知,要生成一个界面,首先要提供界面描述文档和界面组件事件监听类。界面描述文档使用XML描述界面上所有组件及其属性,包括名称、大小、位置、布局以及与之相对应的事件监听类等,界面描述文档可以用XML编辑器来编写。界面组件事件监听类负责监听并处理对应界面描述文档中组件的事件,比如按钮点击事件等,由组件事件引发的一系列操作都由该类来实现。当某一组件的事件被触发时,它的事件监听类就会在运行时动态加载进来,执行里面定义的操作。界面生成器是整个界面自动生成技术的核心,它负责解析界面描述文档,识别文档里中定义的组件信息,根据组件信息和所使用的程序设计语言的组建库创建相应的组件,设置其属性,关联对应的事件监听类,并把组件添加到一个组件容器中,最后把自动生成的界面对象返回给调用者。3.界面自动生成的实现下面以网元管理的部分代码为例,提供一个网管系统界面自动生成技术的Java实现方案。3.1界面描述文档修改网元的界面描述文档如下:?xmlversion=1.0encoding=UTF-8?uipanelheight=20width=400FlowLayoutalign=1labeltext=网元名称/textFieldname=neNameTextdefaultText=cols=10//FlowLayout/panelpanelheight=10width=400FlowLayoutalign=1labeltext=所属局站/comboBoxname=siteCombo//FlowLayout界面描述文档(XML文件)界面组件事件监听类界面生成器自动生成的界面组建库/panelpanelheight=10width=400FlowLayoutalign=1labeltext=网元类型/comboBoxname=neTypeCombo//FlowLayout/panelpanelheight=20width=400FlowLayoutalign=1buttonname=oktext=确定action=xmlgui.AddNeActionListener/buttonname=canceltext=取消//FlowLayout/panel/ui为简单起见,在“修改网元”界面上只提供了与网元名称、所属局站和网元类型三个属性相关的组件以及操作按钮。其中,网元名称是一个文本框,让用户输入网元名称,所属局站和网元类型都是组合框,供用户选择。操作按钮包括“确定”和“取消”。每个组件都有一个唯一标识该组件name属性,该属性在组件初始化、设定当前值和组件事件监听类中获取组件信息时需要用到。3.2组件事件监听类组件事件监听类中定义了组件的某一事件被触发时需要执行的操作,在界面描述文档中用“action”属性来指定。比如,在“修改网元”的界面描述文档中,“确定”按钮的事件监听类指定为“xmlgui.AddNeActionListener”。AddNeActionListener实现了ActionListener接口,在actionPerformed方法中定义了“确定”按钮被点击时需要执行的操作。在组件事件监听类中处理相关事件的时候往往需要获取有关组件的值。比如在处理“修改网元”的事件时,需要网元名称、所属局站和网元类型等信息,这些都在“修改网元”界面的有关组件中记录着,在AddNeActionListener类中需要获取并处理这些组件中的值。为了解决这一问题,可以把相关组件所在的容器引用传递给组件事件监听类,在actionPerform方法中遍历容器中所有的组件,在遍历过程中通过比较组件的name属性值来获取所需组件信息。3.3界面生成器本文提供的界面自动生成技术采用SAX解析器解析界面描述XML文档。SAX解析器是基于事件的,图2阐述了从SAX事件创建Java组件对象的过程。为了能够直接访问每个组件元素的属性,需要使用SAX的第二版。图1.使用一个SAX解析器向用户界面发送事件界面生成器用一个Java类GuiGenerator来实现,该类继承DefaultHandler类。DefaultHandler类来自SAXAPI,它实现了错误处理和文档处理的接口,提供了一种更简单的方式处理SAX事件。GuiGenerator类构造方法代码如下:publicGuiGenerator(StringxmlFile,HashMapinitData,HashMapcurData){super();this.xmlFile=xmlFile;this.initData=initData;this.curData=curData;}参数xmlFile是待解析的界面描述XML文档的文件名;initData是组件的初始化数据,比如组合框的选项,用与初始化界面组件;curData是组件的当前值,比如修改网元对话框中原来的网元名称、所属局站和网元类型等,用于设定文本框的文本值和组合框的当前选项等。initData和curData均为HashMap类型,可以存放多组数据。GuiGenerator类中build方法负责初始化XML文档的解析,初始化过程又将引发一系列的事件发生,这些时间将引导界面组件的构造过程。在build方法中,首先将SAX解析器的内容处理接口设置为GuiGenerator类,由此指示解析器向这个类发送所有事件。然后,通过调用该解析器的parse()方法初始化XML文档的解析过程。在parse()方法中用指定名称的XML文件输入流创建一个InputSource对象,用它来读入界面描述XML文档。当文档的解析过程开始时,事件将被逐个激活。这里值得注意的事件就是遇到元素的开始。当遇到每一个元素时,就调用已经重写的startElement方法,将访问元素的名称以及附加在元素上的属性列表。下列代码说明了如何处理表示元素开始的事件:publicvoidstartElement(StringnamespaceURI,Stringname,StringqName,Attributesatts){if(name.equals(button)){JButtonbutton=newJButton(atts.getValue(text));ClassactionClass=null;try{actionClass=Class.forName(atts.getValue(action));Constructorconstructor=actionClass.getConstructor(JPanel.class);button.addActionListener((ActionListener)constructor.XMLSAX解析器组件组件XML组件元素用户界面组件newInstance(primaryContainer));}catch(Exceptionex){ex.printStackTrace();}primaryContainer.add(button);}在上述示例中采用了一种简单的方法检索name参数的值来确定希望添加的组件的类型。如果该参数的值为“button”,那么就知道要创建的组件是一个JButton。使用new操作符,并将text属性的值传递给构造函数以便创建一个按钮。按钮创建以后,通过Java类的动态加载机制把按钮与其事件监听类相关联。最后将这个按钮添加到早先声明的JPanel上。startElement方法依次处理网管系统中用到的各种组件,根据界面描述XML文档中的属性值设置组件属性,用initData初始化,用curData设置当前值,最后添加到JPanel上。上述这个过程会一直继续下去直到解析完整个文档,因为build()方法返回类型为JDialog,所以界面生成器将返回一个对话框,该对话框上添加了所有的组件。利用界面自动生成技术生成的“修改网元”对话框如图3所示。图3.利用界面自动生成技术生成的“修改网元”对话框4.结论基于XML的网管系统界面自动生成技术根据界面描述XML文档,在运行时动态生成所需要的用户界面。使用该技术可以快速开发出网管系统的配置管理界面,代码简单而清晰。当然该技术还可以进一步优化,界面生成器的功能还有待增强,以满足各种复杂界面的生成需要。参考文献:[1]MikeJasonwski.Java,XML,andWebServiceBible[M].北京.电子工业出版社.2002.5.[2]张敦华.一种界面自动生成技术[J].计算机与数字工程,2004,5:20-24.