基于JavaApplet绘制拓扑图总结
⽂章背景:
使⽤Java Applet技术开发⼩应⽤程序,并最终将其部署到⽹页上,使其能够实现从数据库中读取节点、链路数据,并根据数据绘制拓扑图的功能。绘制图像的过程应⽤jgraph开源软件实现。
技术要点:
1、在页⾯上部署Java Applet应⽤程序,并调⽤jgraph.jar包
<applet archive="AppletDemo.jar,jgraph.jar" code="org/nlsde/draw/applet/AppletDemo.class" codebase="./" width="660" height="560">
</applet>
在此将⽹页⽂件和AppletDemo.jar放在同⼀个⽬录下,由于需要引⽤第三⽅的jgraph.jar包,因此在archive属性中⼀并写上jgraph.jar
2、Java Applet应⽤程序访问数据库
由于Java Applet应⽤程序本⾝的策略限制,在默认情况下应⽤程序只能以http协议访问运⾏此Java Applet应⽤程序的主机;⽽修改策略,需要加⼊数字签名,并且浏览器会提⽰安全问题。因此在本次开发中,使⽤Java Applet访问Servlet的流⾏⽅法来解决读取数据库的问题。
Java Applet应⽤程序和Servlet进⾏交互,可以直接在两者间传递⽀持序列化的对象(Serializable)。在Servlet端,只需要响应doGet事件,并将处理结果以ObjectStream的形式返回即可:
DefaultGraphCell[] alCells = org.nlsde.draw.AllCells();
ObjectOutputStream out = new ObjectOutputStream(response
.getOutputStream());
out.writeObject(alCells);
在Java Applet端,发起数据请求和接受结果如下:
URL url = new URL(getCodeBase() + "/servlet/GetAllCells");
URLConnection urlConn = url.openConnection();
InputStream in = InputStream();
ObjectInputStream result = new ObjectInputStream(in);
Object obj = adObject();
DefaultGraphCell[] alCell = (DefaultGraphCell[]) obj;
(和数据库交互的部分,被封装到另外的类CellHandler中。)
3、利⽤jgraph绘制拓扑图的过程
在jgraph中,存在顶点(vertice)、连线(edge)、端⼝(port)的概念,他们的关系如下:
顶点、连线、端⼝都被认为是GraphCell,只不过连线和端⼝有⾃⼰独特的属性。
利⽤jgraph绘图的流程如下:
创建顶点集合,并指定各个顶点的属性
DefaultGraphCell c = new DefaultGraphCell(rs
.
getString("MAIN_IP"));
//创建顶点对象,并指定Label显⽰⽂字
GraphConstants.Attributes(), true);
//设定顶点⼤⼩为⾃动缩放
DefaultPort p = new DefaultPort();
c.add(p);
//为顶点添加⼀个端⼝,⽤以连接连线
GraphConstants.Attributes(),
new Rectangle2D.Double(Integer.parseInt(c
.getAttributes().get("OBJECT_X").toString()),
Integer.Attributes().get(
"OBJECT_Y").toString()), 80, 80));
//指定顶点的位置坐标和⼤⼩
如果需要为顶点加⼊⽤户⾃定义的属性,可以利⽤jgraph提供的AttributeMap创建属性键值对,最后附加到顶点上:
AttributeMap m = new AttributeMap();
m.applyValue("MAIN IP", rs.getString("MAIN_IP"));
接着创建连线,并根据规则指定连线的起点和终点:
DefaultEdge e = new DefaultEdge();
AttributeMap m = new AttributeMap();
m.applyValue("OBJECT_INSTANCE",rs.getString("OBJECT_INSTANCE"));
m.applyValue("SOURCE1_INSTANCE",rs.getString("SOURCE1_INSTANCE"));
m.applyValue("SOURCE2_INSTANCE",rs.getString("SOURCE2_INSTANCE"));
m.applyValue("TYPE","LINK");
在指定连接的起点和终点时,采⽤⽐对SOURCE1_INSTANCE和SOURCE2_INSTANCE是否和顶点中的OBJECT_INSTANCE匹配的⽅法,若匹配,则被⽐较顶点是当前连线的起点或终点:
for (int i = 0; i < alLink.length; i++) {
for (int j = 0; j < alCell.length; j++) {
if (alCell[j].getAttributes().get("OBJECT_INSTANCE")
.toString().equalsIgnoreCase(
alLink[i].getAttributes().get(
"SOURCE1_INSTANCE").toString())) {
安装oracle10galLink[i].setSource(alCell[j].getChildAt(0));
}
if (alCell[j].getAttributes().get("OBJECT_INSTANCE")
.toString().equalsIgnoreCase(
alLink[i].getAttributes().get(
"SOURCE2_INSTANCE").toString())) {
alLink[i].setTarget(alCell[j].getChildAt(0));
}
}
}
设置起点或终点需要调⽤setSource()或setTarget()⽅法,需要注意的是此⽅法的参数是顶点的端⼝,⽽⾮顶点本⾝,因此参数形式是ChildAt(0)。由于本次开发中只为顶点创建了⼀个端⼝,因此只有getChildAt(0)有效。
4、为顶点指定图标
要为顶点指定图标,⾸先要在Java Applet应⽤程序中成功加载图标⽂件。Java Applet仅⽀持gif/png/jpg格式的图⽚⽂件,其他格式的⼀概设置ImageIcon对象Image Load Status=4的错误,表⽰Load出错,但是不会提⽰具体错误。
在Java Applet中调⽤其他⽂件,应该将此⽂件⼀并封装在Java Applet应⽤程序包中,并且遵循Java规范创建标准包的名称。在此次开发中,Java Applet应⽤程序本⾝的包名为org.nlsde.draw.applet,所需要调⽤的图⽚⽂件的包名为org.nlsde.draw.applet.ico。在调⽤图⽚⽂件时,只需要使⽤getCodeBase()⽅法即可获得Java Applet应⽤程序本⾝的路径,再加上ico即可到图⽚⽂件:
URL u = Resource("ico/"
+ alCell[i].getAttributes().get("OBJECT_ICON")
.toString() + ".jpg");
ImageIcon icon = new ImageIcon(u);
GraphConstants.setIcon(alCell[i].getAttributes(), icon);
获取图⽚的ImageIcon对象后,使⽤jgraph内置的⽅法可以很容易的为顶点设置图标。
5、定义数据库连接
本次开发中数据库连接被封装在DBHandler类中。另外使⽤l⽂件来存储连接数据库的信息。在DBHandler类访问l⽂件时,为l⽂件指定了URL路径⽽⾮本地路径:
private static final String _configFile = "192.168.15.230:8080/l";
这是因为Java Web App在运⾏时,默认起始路径是$TOMCAT_HOME/bin,⽽⾮Web App本⾝的根⽬录,调⽤⽐较⿇烦。
在l⽂件中,存储的数据库连接信息包括Java – Oracle连接字符串:
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.101.32)(PORT=1521))(ADDRESS=(PROTOCOL=TCP) (HOST=192.168.101.34)(PORT=1521))(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=nmstest) (FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC)(RETRIES=180)(DELAY=5))))
这是因为在Oracle端配置了负载平衡,⽽⽹站所在服务器不安装Oracle 10g的客户端,⽆法使⽤服务名解析数据库连接字符串,因此直接将服务名为nmstest的连接字符串写在这⾥。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论