Java实现数据驱动的呼吁用户界面
副标题#e#
摘 要: 本文提出并实现了一种数据驱动的呼吁界面生成方案,以一致的方法生成所有呼吁的界面元素,能利便机动地适应呼吁的修改变革。
要害词: 数据驱动;呼吁; Java
在典范的企业应用软件中,应用一般会提供一组呼吁作为用户与应用措施之间的接口。跟着企业需求的变革和技能的成长,要求对本来的呼吁需要做出调解,好比增加呼吁,修改呼吁参数等,这大概需要修改应用措施,以生成调解后的呼吁界面。本文提出并实现了一种数据驱动的呼吁界面生成方案,该方案以一致的方法来处理惩罚所有呼吁,最大限度地担保呼吁的增加、删除、修改,不需要或很少需要修改应用措施。
1 数据驱动方案的提出和思想
凡是环境下,应用措施按照本身的业务逻辑举办界面设计,对付一条详细的呼吁,开拓人员需要编写界面生成代码以生成该呼吁的界面元素,如菜单项、参数输入对话框等.在应用的呼吁数量不大时,这是较量直接的做法.但当应用包括有成百上千条呼吁时,还要逐一地为每条呼吁生成界面元素,无疑是件繁琐的工作。另外,跟着应用的进级,大概要求对原有的呼吁系统做出修改,这又要求修改代码以生成修改后的呼吁界面元素。我们但愿能有一种实现要领可以利便机动生成呼吁的界面元素并适应呼吁未来调解的需要,而对我们措施的影响最小。
考查应用的所有呼吁可发明,固然各呼吁的成果意义差异,但呼吁构成形式却有很大的相似性,都包罗呼吁标识和零个或多个参数,并且为每条呼吁编写的界面生成代码也很是近似。因此我们可以以一种统一的要领来处理惩罚所有呼吁。数据驱动的呼吁界面生成方案的主要思想正基于此,以某种方法对应用的所有呼吁统一举办描写,通过描写数据来驱动所有呼吁的界面元素生成。本文利用数据库表完成对所有呼吁的原始描写。
参数的性质是通过其数据范例来反应的,只需按照实际应用,界说本应用中参数大概的各类数据范例.而数据范例的种类老是有限的,通过对每一种数据范例给出其处理惩罚步伐,就可以实现对为数浩瀚的参数的处理惩罚转为对有限种的数据范例的处理惩罚。
2 呼吁的数据库表描写
以数据库表中对呼吁的描写为出发点,今后呼吁的增加、删除、修改及呼吁参数的变换只需修改描写表中的相关项.呼吁一般包罗呼吁标识和参数,但为更有效地对呼吁举办组织打点和适应更巨大应用的需要,对呼吁的描写通过界说呼吁范例描写表、呼吁描写表、呼吁参数描写表、列举描写表四级布局来完成.呼吁范例字段和呼吁字段连系确定一条独一的呼吁,提供直观的名字字符和数值编码两种方法以适应差异需要。参数表中界说了参数范例和取值要求,列举表是为非凡的参数范例配置的,其取值是在一些选择项中选取。各级表除了给出本表界说工具的根基属性外,假如有下级元素,还给出了下级元素的个数及其在下级表中的位置,通过这种方法将一条呼吁的各组成部门关联起来.下面给出这种表布局的一个简朴示例。
· 呼吁范例描写表:描写呼吁的分类.
独一符号 | 编号 | 名字 | 呼吁的个数 | 呼吁描写位置 |
ct_00010 | 248 | 系统打点类 | 2 | c_00010 |
表1 呼吁范例描写
· 呼吁描写表: 描写详细呼吁
独一符号 | 编号 | 名字 | 参数的个数 | 参数描写位置 |
c_00010 | 1 | 系统联结请求 | 1 | p_00010 |
c_00011 | 2 | 系统复位 | 0 |
表2 呼吁描写表
· 呼吁参数描写表: 描写各呼吁的参数.参数的值是在用户挪用呼吁时设定的,事先无法确定.我们只是对参数的性质做出一些约束。数据范例的种类视详细应用而定,应用可觉得每种范例指定一数值编号,在表中填写参数数据范例的编号值。参数的最大值最小值给出了参数的取值范畴或长度限制。
独一符号 | 名字 | 数据范例 | 最大值 | 最小值 | 列举的个数 | 列举描写位置 |
p_00010 | 是否要求响应 | 9 | 2 | e_00010 | ||
p_00020 | 源文件名 | 13 | 32 | 0 |
表3 呼吁参数描写表
#p#分页标题#e#
· 列举描写表:给出列举范例参数的列举项
独一符号 | 列举名 | 列举值 |
e_00010 | 要求响应 | 1 |
e_00011 | 不要求响应 | 0 |
表4:列举描写表
以上表1只表4的内容仅提供一般性的示范,实际应用可按照业务逻辑的需要界说本身的呼吁内容,呼吁的局限不受限制.
#p#副标题#e#
3 数据驱动方案的Java语言实现
3.1 呼吁的内存布局
为了在措施中反应呼吁布局,界说CmdType、Cmd、CmdField、Enum四个种别离与数据库中的呼吁范例描写表、呼吁描写表、呼吁参数描写表、列举描写表相对应.每个类包括与其对应表中各列所描写的属性,表的记录在读表到内存时表示为类的实例。下面以个中的一个类CmdType来说明.
public class CmdType{ public String key; public short code; public String name; public short childCount; public String childPointer; public Cmd[] cmds; public Cmd[] getCmds() throws IOException { … /* implementation code */ } } |
在CmdType类中,从key到 childPointer之间的属性与呼吁范例描写表中独一符号到呼吁描写位置的各列对应,数组cmds[]暗示该呼吁范例所包括的呼吁,可由getCmds要了解见数据库获得。其他三个类的界说与CmdType相似,因Enum类已经是呼吁布局的最后一级,故不提供获得下一级工具的要领。
应用措施启动时会见数据库的呼吁范例描写表以得到呼吁布局条理中的第一级工具,功效生存在cmdTypes数组中。可以按照应用对内存和速度的要求抉择是否需要读下一级表数据到内存。
3.2 界面元素的生成
应用措施可觉得用户提供多种方法来挪用呼吁,譬喻下拉菜单、弹出式菜单、树型菜单、呼吁行、图形欣赏菜单等。建设这些界面元素只需按照内存中呼吁的数据布局,其内容包括在从数据库中读出的cmdTypes数组工具中。个中呼吁行方法在界面建设时不需要用到呼吁的内存布局,但可以操作内存布局辅佐用户完成呼吁和参数输入。
下面的代码说明在Java语言下如何操作呼吁布局在界面上生成呼吁的树型菜单,假设呼吁要添加于父节点father下。
DefaultMutableTreeNode node; DefaultMutableTreeNode childnode; for(int i = 0; i < cmdTypes.length; i++) { node = new DefaultMutableTreeNode(); node.setUserObject(cmdTypes[i]); node.setAllowsChildren(true); father.add(node); cmds = cmdTypes[i].getCmds(); if(cmds == null ) continue; for(int j = 0;j<cmds.length;j++) { childnode = new DefaultMutableTreeNode(); childnode.setUserObject(cmds[j]); childnode.setAllowsChildren(false); node.add( childnode ); } } |
可以看出,只需简朴利用两重轮回,就可为应用的所有呼吁在界面上生成呼吁导航树。
下面说明如作甚所有呼吁,实现一种通用一致的参数输入方法.按照我们的呼吁布局组织方法,假如用户选择了某一Cmd节点,则其所需的参数在该Cmd工具的cmdFields数组中描写。对每一个参数,在界面上表示为一Label-Component对形式。Laber用于标识参数,Component组件供用户输入参数的实际值。每个参数在界面上占一行,按GridBagLayout机关插手到参数面板中.这部门代码示譬喻下:
for (int i = 0; i < cmdFields.length; i++){ label = new JLabel(cmdFields[i].name); …/*按照参数内容配置label的其他属性,如label的提示信息tip等*/ gbc.anchor = GridBagConstraints.EAST; gbc.gridwidth = GridBagConstraints.RELATIVE; paraPanel.add( label,gbc); gbc.anchor = GridBagConstraints.WEST; gbc.gridwidth = GridBagConstraints.REMAINDER; switch(cmdFields[i].type){ case 0: component = new JTextField(16) /*不妨设参数范例为0时对应JTextField组件*/ …/*按照参数内容添加对组件的节制*/ paraPanel.add( component,gbc); break; case 1: component = new JComboBox() /*假设参数范例为1时对应 JComboBox组件*/ …/*按照参数内容添加对组件的节制*/ paraPanel.add( component,gbc); break; … … case n: …/* 添加范例为n时的组件*/ default: …/*参数数据范例未界说*/ } } |
#p#分页标题#e#
参数范例上的差别,在界面上表示为所添加的Component种类差异。我们只需为应用的每一种数据范例确定一种Component供用户输入.大都范例,在JTextField 组件下就能完成参数输入,输入的同时可以按照CmdField工具对其输入范畴作出限定.我们的方案在设计时已经思量到参数取值是列举的环境,对列举范例参数,其大概的取值项被添加到一个JList或JComboBox组件中。用户也可觉得本身的数据范例定制一个专用的输入组件。一个应用措施到底设有哪些数据范例,可视详细应用环境而定.简朴的环境提供字串值和二进制值两种范例就可以完成所有输入。更一般的环境可包罗常用的整数范例、浮点范例、时间范例等。我们的方案不直接支持巨大的结构范例,一个结构范例的参数可视为由其包括的多个根基范例参数构成。
4 竣事语
数据驱动的呼吁界面生成方案充实思量了呼吁间的相似性,以一致的方法生成所有呼吁的界面元素,具有更好的伸缩性和扩展性.本方案很是有利于大局限呼吁的实现并能利便地适应呼吁的修改变革。本方案同时也有利于用户界面和业务逻辑疏散.呼吁可以由对呼吁成果寄义很是熟悉的业务人员来界说,而界面设计人员可以在对呼吁毫无所知的环境下按照业务人员提供的呼吁描写在界面上生成所需要的呼吁界面元素。