最近正在做一个有树状显示的小项目,在此将树状显示做一下小总结。
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>