基于Java Applet绘制拓扑图总结
2007-06-30 22:07
232 查看
文章背景:
使用Java Applet技术开发小应用程序,并最终将其部署到网页上,使其能够实现从数据库中读取节点、链路数据,并根据数据绘制拓扑图的功能。绘制图像的过程应用jgraph开源软件实现。
技术要点:
1、在页面上部署Java Applet应用程序,并调用jgraph.jar包
在此将网页文件和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的形式返回即可:
在Java Applet端,发起数据请求和接受结果如下:
(和数据库交互的部分,被封装到另外的类CellHandler中。)
3、利用jgraph绘制拓扑图的过程
在jgraph中,存在顶点(vertice)、连线(edge)、端口(port)的概念,他们的关系如下:
顶点、连线、端口都被认为是GraphCell,只不过连线和端口有自己独特的属性。
利用jgraph绘图的流程如下:
创建顶点集合,并指定各个顶点的属性
如果需要为顶点加入用户自定义的属性,可以利用jgraph提供的AttributeMap创建属性键值对,最后附加到顶点上:
接着创建连线,并根据规则指定连线的起点和终点:
在指定连接的起点和终点时,采用比对SOURCE1_INSTANCE和SOURCE2_INSTANCE是否和顶点中的OBJECT_INSTANCE匹配的方法,若匹配,则被比较顶点是当前连线的起点或终点:
设置起点或终点需要调用setSource()或setTarget()方法,需要注意的是此方法的参数是顶点的端口,而非顶点本身,因此参数形式是GraphCell.getChildAt(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即可找到图片文件:
获取图片的ImageIcon对象后,使用jgraph内置的方法可以很容易的为顶点设置图标。
5、定义数据库连接
本次开发中数据库连接被封装在DBHandler类中。另外使用SystemConfig.xml文件来存储连接数据库的信息。在DBHandler类访问SystemConfig.xml文件时,为SystemConfig.xml文件指定了URL路径而非本地路径:
这是因为Java Web App在运行时,默认起始路径是$TOMCAT_HOME/bin,而非Web App本身的根目录,调用比较麻烦。
在SystemConfig.xml文件中,存储的数据库连接信息包括Java – Oracle连接字符串:
这是因为在Oracle端配置了负载平衡,而网站所在服务器不安装Oracle 10g的客户端,无法使用服务名解析数据库连接字符串,因此直接将服务名为nmstest的连接字符串写在这里。
使用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> |
2、Java Applet应用程序访问数据库
由于Java Applet应用程序本身的策略限制,在默认情况下应用程序只能以http协议访问运行此Java Applet应用程序的主机;而修改策略,需要加入数字签名,并且浏览器会提示安全问题。因此在本次开发中,使用Java Applet访问Servlet的流行方法来解决读取数据库的问题。
Java Applet应用程序和Servlet进行交互,可以直接在两者间传递支持序列化的对象(Serializable)。在Servlet端,只需要响应doGet事件,并将处理结果以ObjectStream的形式返回即可:
DefaultGraphCell[] alCells = org.nlsde.draw.data.CellHandler.getAllCells(); ObjectOutputStream out = new ObjectOutputStream(response .getOutputStream()); out.writeObject(alCells); |
URL url = new URL(getCodeBase() + "/servlet/GetAllCells"); URLConnection urlConn = url.openConnection(); InputStream in = urlConn.getInputStream(); ObjectInputStream result = new ObjectInputStream(in); Object obj = result.readObject(); DefaultGraphCell[] alCell = (DefaultGraphCell[]) obj; |
3、利用jgraph绘制拓扑图的过程
在jgraph中,存在顶点(vertice)、连线(edge)、端口(port)的概念,他们的关系如下:
顶点、连线、端口都被认为是GraphCell,只不过连线和端口有自己独特的属性。
利用jgraph绘图的流程如下:
创建顶点集合,并指定各个顶点的属性
DefaultGraphCell c = new DefaultGraphCell(rs .getString("MAIN_IP")); //创建顶点对象,并指定Label显示文字 GraphConstants.setAutoSize(c.getAttributes(), true); //设定顶点大小为自动缩放 DefaultPort p = new DefaultPort(); c.add(p); //为顶点添加一个端口,用以连接连线 GraphConstants.setBounds(c.getAttributes(), new Rectangle2D.Double(Integer.parseInt(c .getAttributes().get("OBJECT_X").toString()), Integer.parseInt(c.getAttributes().get( "OBJECT_Y").toString()), 80, 80)); //指定顶点的位置坐标和大小 |
AttributeMap m = new AttributeMap(); m.applyValue("MAIN IP", rs.getString("MAIN_IP")); c.getAttributes().applyMap(m); |
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"); e.getAttributes().applyMap(m); |
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())) { alLink[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)); } } } |
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 = AppletDemo.class.getResource("ico/" + alCell[i].getAttributes().get("OBJECT_ICON") .toString() + ".jpg"); ImageIcon icon = new ImageIcon(u); GraphConstants.setIcon(alCell[i].getAttributes(), icon); |
5、定义数据库连接
本次开发中数据库连接被封装在DBHandler类中。另外使用SystemConfig.xml文件来存储连接数据库的信息。在DBHandler类访问SystemConfig.xml文件时,为SystemConfig.xml文件指定了URL路径而非本地路径:
private static final String _configFile = "http://192.168.15.230:8080/draw/SystemConfig.xml"; |
在SystemConfig.xml文件中,存储的数据库连接信息包括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)))) |
相关文章推荐
- 基于 HTML5 Canvas 绘制的电信网络拓扑图
- 基于MFC串口编程和曲线图绘制(visual studio2008,Teechart绘图控件)的程序总结
- 基于 HTML5 Canvas 绘制的电信网络拓扑图
- 基于MVC4+EasyUI的Web开发框架经验总结(8)--实现Office文档的预览
- 基于mui前端框架开发APP问题总结
- 基于java技术的软件开发架构总结
- Android自定义View饼状图的绘制总结
- 基于java技术的软件开发架构总结
- 基于Tair存储的广告服务性能优化总结及思考
- 基于SDL的四则运算即C语言和汇编语言的混编实验设计总结
- 基于Highcharts绘制差值连接线
- 基于SVG的web页面图形绘制API介绍及编程演示
- 编写一个基于OpenGL的程序,绘制一个三角形,并分别绘制这个三角形经旋转、平移、缩放后的结果
- JavaScript学习总结(5)——Javascript面向(基于)对象编程
- iOS基于MVC的项目重构总结
- linux环境下基于opengl的3*3可控魔方绘制
- Android转场动画总结篇(不基于Android5.0)
- 基于CoreGraphics的常见图形的绘制方法
- Dubbo学习总结(4)——Dubbo基于Zookeeper实现分布式实例
- 基于ITK的医学图像配准的学习总结