最近在做老师的项目,第一个任务:做一个java web目录树要求实现数据的动态加载,即点击一个节点加载一层数据,经过一个星期的尝试探索期间用了几个比较流行的树插件
(js包),最终用xloadtree实现了。(选js包的原因是因为自己web网页基础就是一坨翔啊T_T,看到这里大神请绕道)
什么是xloadtree,这里放一个链接看完就会略知一二,点击打开链接
现在可以看看我是怎么做的,大家可以先把相关的资源包下载下来,点击打开链接
建数据库什么的大家应该都会,在这里就不啰嗦了
1,我先写了一个Node类,建类的原因当然是为了好封装啊,开发便捷,面向对象啊什么的(哈哈哈)
一般对象的属性会和数据库表中的属性保持一致,我的如下:
public class Node {
private String node_id;
private String parent_id;
private String node_name;
private String ref_url;
public Node() {
// TODO Auto-generated constructor stub
}
public String getNode_id() {
return node_id;
}
public void setNode_id(String node_id) {
this.node_id = node_id;
}
public String getParent_id() {
return parent_id;
}
public void setParent_id(String parent_id) {
this.parent_id = parent_id;
}
public String getNode_name() {
return node_name;
}
public void setNode_name(String node_name) {
this.node_name = node_name;
}
public String getRef_url() {
return ref_url;
}
public void setRef_url(String ref_url) {
this.ref_url = ref_url;
}
}
2,数据库操作类,(我用的是sqlite数据库,这个数据库的优点就是,只需一个jar包就能写数据库,槽点吗?谁用谁知道
)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import bean.Node;
public class DBHelper {
String driver_name = "org.sqlite.JDBC";
String db_url = "jdbc:sqlite://g:/tree.db";
public Connection getConnection(){
try {
Class.forName(driver_name);
Connection conn = DriverManager.getConnection(db_url);
return conn;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(SQLException se){
se.printStackTrace();
}
return null;
}
public ArrayList<Node> getNodeInfo(Connection conn,String id){
String sql = "select * from tree where node_id='"+id+"'";
PreparedStatement pre = null;
ResultSet rs = null;
ArrayList<Node> list = new ArrayList<Node>();
try {
pre = conn.prepareStatement(sql);
rs =pre.executeQuery();
if(rs!=null){
list = new ArrayList<Node>();
}
while (rs!=null&&rs.next()){
Node node = new Node();
node.setNode_id(rs.getString("node_id"));
node.setNode_name(rs.getString("node_name"));
node.setParent_id(rs.getString("parent_id"));
node.setRef_url(rs.getString("ref_url"));
list.add(node);
}
rs.close();
pre.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
pre = null;
conn = null;
rs = null;
}
return list;
}
public ArrayList<Node> getNodeInfoByParentId(Connection conn,String id){
System.out.println("id is "+id);
String sql = "select * from tree where parent_id="+id+"";
System.out.println("sql= "+sql);
PreparedStatement pre = null;
ResultSet rs = null;
ArrayList<Node> list =null;
try {
pre = conn.prepareStatement(sql);
rs =pre.executeQuery();
if(rs!=null){
list = new ArrayList<Node>();
}
while (rs!=null&&rs.next()){
Node node = new Node();
node.setNode_id(rs.getString("node_id"));
node.setNode_name(rs.getString("node_name"));
node.setParent_id(rs.getString("parent_id"));
node.setRef_url(rs.getString("ref_url"));
list.add(node);
}
rs.close();
pre.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
pre = null;
conn = null;
rs = null;
}
return list;
}
}
上面有2个函数分别是根据node的id来查询数据,这个是为了树的初始化的时候后来加载根节点,另id直接等于0(根节点)。第二个函数就是以此节点id为parent_id来查询数据,如果返回的结果集不为空则说明该节点是有子节点的,我们就给该节点加tree.xml(前提是你看了xloadtree的相关知识
)
下面是节点的初始页面用jsp(jsp+javascript)写的:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@page import="db.DBHelper" %>
<%@page import="bean.Node" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>My JSP 'xTree.jsp' starting page</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="xtree.js"></script>
<script type="text/javascript" src="xmlextras.js"></script>
<script type="text/javascript" src="xloadtree.js"></script>
<link type="text/css" rel="stylesheet" href="xtree.css" />
</head>
<body>
<%
String node_id=request.getParameter("id");
ArrayList<Node> list=null;
if(node_id==null){
DBHelper helper = new DBHelper();
list= helper.getNodeInfo(helper.getConnection(),"0");
}
String name = list.get(0).getNode_name();
int times =3;
%>
<script type="text/javascript">
webFXTreeConfig.rootIcon = "images/folder.png";
webFXTreeConfig.openRootIcon = "images/openfolder.png";
webFXTreeConfig.folderIcon = "images/folder.png";
webFXTreeConfig.openFolderIcon = "images/openfolder.png";
webFXTreeConfig.fileIcon = "images/file.png";
webFXTreeConfig.lMinusIcon = "images/Lminus.png";
webFXTreeConfig.lPlusIcon = "images/Lplus.png";
webFXTreeConfig.tMinusIcon = "images/Tminus.png";
webFXTreeConfig.tPlusIcon = "images/Tplus.png";
webFXTreeConfig.iIcon = "images/I.png";
webFXTreeConfig.lIcon = "images/L.png";
webFXTreeConfig.tIcon = "images/T.png";
var tree = new WebFXTree("Root");
var node_id = "<%=list.get(0).getNode_id()%>";
var node_name = "<%=name%>";
tree.add(new WebFXLoadTreeItem(node_name,"TreeXML.jsp?id='"+node_id+"'"));
document.write(tree);
</script>
</body>
</html>
这些代码最重要的是
tree.add(new WebFXLoadTreeItem(node_name,"TreeXML.jsp?id='"+node_id+"'"));
实现和TreeXML.jsp的通信,TreeXML.jsp是处理分层加载的页面,即点击节点发送id给它,然后处理,代码如下:
<%
request.setCharacterEncoding("utf-8");
response.setContentType("text/xml;charset=utf-8");
out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
out.println("<tree>");
String id = request.getParameter("id");
ArrayList<Node> list=null;
DBHelper helper = new DBHelper();
list= helper.getNodeInfoByParentId(helper.getConnection(),id);
if(list!=null){
for(int i=0;i<list.size();i++){
System.out.println("jin lai le");
ArrayList<Node> list2 = null;
list2 = helper.getNodeInfoByParentId(helper.getConnection(),list.get(i).getNode_id());
if(!list2.isEmpty()){
out.println("<tree text=\""+list.get(i).getNode_name()+"\" src=\"TreeXML.jsp?id="+list.get(i).getNode_id()+"\"/>");
}else{
out.println("<tree text=\""+list.get(i).getNode_name()+"\"/>");
}
}
}
list.clear();
out.println("</tree>");
%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@page import="db.DBHelper" %>
<%@page import="bean.Node" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
最后显示结果:
数据库截图:
后记:有不明白的欢迎留言
分享到:
相关推荐
配置加载器 从目录树分层加载配置文件(json,yaml,csv,ini,js)安装 git clone git://github.com/HansHammel/config-loader.gitnpm install或者 npm install "git+...var path = require ( 'path' ) ;...
基于Cesium+VUE实现的动态单体化(整幢建筑和分层分户)效果,完整demo和源代码,代码未加密/未压缩,可直接调用运行 demo中唯一缺少部分是涉及到的模型数据,因为数据量比较大,所以如果需要请在评论区留下邮箱,...
大家认为可以改进的地方,欢迎在本贴发表出来,谢谢,大家一起进步。
ExpandableListView分层加载
这是博文 【c++多模块web项目实践方案【cmake+cppcms+boost+fmt】】附带的项目源代码骨架。笔者主要提出了自己对于c++项目如何分层,如何做一个简单的网站的见解。具体文章地址在:...
分层加载动画 加载页面时创建分层加载动画
JSP分层实现业务处理(用户登录)
详细介绍了浏览器框架分层的使用,有实例,简单实用。欢迎下载。
在进行数据处理时,我们有时需要在大量的样本中抽取出部分数据作为数据集进行模型训练或者模型验证,因此在本文中介绍分层抽样方法的python代码实现。 分层抽样: 分层抽样法也叫类型抽样法。它是从一个可以分成不同...
基于ListView的RollerListAdapter,文件选择实现如同PC端那样可收起和展开的分层呈现
基于超图iClient for Cesium 实现白膜动态分层 通过数据服务返回层高计算白膜高度动态显示分层效果。 后续补充博客文档说明
在对分层组合算法研究的基础上,利用产生式规则和接口语义规则对Web服务建模,引入了备选服务的QoS性能指标和用户请求对响应时间、成本、成功率、可靠性和组合率的多条件约束,给出了一种全局优化的分层动态Web服务...
C++实现的分层有限状态机v0.1 使用帮助:http://blog.csdn.net/vvsxr/article/details/40302677
2、echarts多条折线图动态分层 var xData = param.xData; var data = param.yData let option = []; let num =param.num ? param.num : 0; let max = num ? num *100 : 100; //处理精度丢失问题 但不是最佳...
Web页面分层交叉实验.pdf
随机生成n(输入n)个向量,生产m(输入m)个族质心。 输出所有向量,各个簇心即簇中的向量,并将各个簇中的向量坐标形式显示出来。 经过20次迭代生成m个最优簇。
wpf datagrid实现树结构
SpringBootWeb 请求响应 分层解耦
一个非常好的文档来介绍DDD分层架构参考代码目录结构,接口层,应用层,领域层和基础层等!
linq to sql实现分层与gridview使用实现增删改,适合新手做三层项目开发,快速入门