最近正在做一个有树状显示的小项目,在此将树状显示做一下小总结。
1.从数据库中取出数据并按树形结构排好序
Category中添加如下函数:
public static List<Category> getCategorys(){
List<Category> categorys = new ArrayList<Category>();
categorys = CategoryDAO.getCategorys(categorys, 0);
return categorys;
}
CategoryDAO中添加如下函数:
public static List<Category> getCategorys(List<Category> categorys, int id) {
Connection conn = null;
ResultSet rs = null;
try {
conn = DB.getConn();
rs = DB.executeQuery(conn, "select * from category where pid = " + id);
while(rs.next()) {
Category c = new Category();
c.setId(rs.getInt("id"));
c.setName(rs.getString("name"));
c.setDescr(rs.getString("descr"));
c.setPid(rs.getInt("pid"));
c.setLeaf(rs.getInt("isleaf")==0 ? false : true);
c.setGrade(rs.getInt("grade"));
categorys.add(c);
if(!c.isLeaf()) {
getCategorys(categorys,c.getId());//将会建立好多好多的连接,因为每次conn都是重新构建的,解决方法如下。
}
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
DB.closeResultSet(rs);
DB.closeConn(conn);
}
return categorys;
}
将此方法改为private static List<Category> getCategorys(Connection conn,List<Category> categorys, int id)
里面调用getCategorys(conn, categorys, c.getId());//这样用递归风险特别大每递归一次就会执行完getCategorys整个方法,以至于关闭与数据库的连接,只能遍历一层,并抛出异常。解决方法:将递归写成另一个方法,进行调用。在此不再详述。
再重新加入方法
public static List<Category> getCategorys(List<Category> categorys, int id) {
Connection conn = null;
conn = DB.getConn();
categorys = getCategorys(conn, categorys, id);
return categorys;
}
以上方法在return之前调用DB.closeConn(conn); 将finally里的这一句去掉
2.树形显示
首先在jsp页面中拿到categorys
<%
List<Category> categorys = Category.getCategorys();
%>
其次在jsp页面中引入使用到的js文件
<script language="javascript" src="script/TV20.js"></script>
然后在jsp页面的body中添加代码如下
<script language="javascript">
<!--
addNode(-1,0,"所有类别","admin/images/top.gif");
<%
for(Iterator<Category> it = categorys.iterator(); it.hasNext();) {
Category c = it.next();
%>
addNode(<%=c.getPid() %>, <%=c.getId() %>, "<%=c.getName() %>", "admin/images/top.gif");
<%
}
%>
showTV();
-->
</script>