这几天突然想自己写个树玩玩。了解了一下现在流行的树,就用xloadtree测试一下。
servlet
<textarea cols="50" rows="15" name="code" class="c-sharp">/** * */ package com.rx.util; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; /** * @author Administrator * */ public class TreeServlet extends HttpServlet{ /** * */ private static final long serialVersionUID = -3736027080120980272L; private static Logger log = Logger.getLogger(TreeServlet.class); /** * 初始化验证图片属性 */ public void init() throws ServletException { } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException { log.info("tree servlet"); response.setContentType("text/xml;charset=UTF-8"); PrintWriter out = null ; try { out = response.getWriter(); out.println("<tree>"); out.println("<tree text='one'>"); out.println("<tree text='one sub' />"); out.print("</tree>"); out.println("<tree text='two sub' />"); out.println("</tree>"); } catch (IOException e) { throw new ServletException(e); } finally { out.close(); } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } } </textarea>
web.xml
<textarea cols="50" rows="15" name="code" class="c-sharp"> <servlet> <servlet-name>Tree</servlet-name> <servlet-class>com.rx.util.TreeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Tree</servlet-name> <url-pattern>/myTree</url-pattern> </servlet-mapping> </textarea>
<textarea cols="50" rows="15" name="code" class="c-sharp"><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link type="text/css" rel="stylesheet" href="../../css/xtree.css" mce_href="css/xtree.css" /> <mce:script type="text/javascript" src="../../scripts/xtree.js" mce_src="scripts/xtree.js"></mce:script> <mce:script type="text/javascript" src="../../scripts/xmlextras.js" mce_src="scripts/xmlextras.js"></mce:script> <mce:script type="text/javascript" src="../../scripts/xloadtree.js" mce_src="scripts/xloadtree.js"></mce:script> <mce:script type="text/javascript"><!-- /// XP Look webFXTreeConfig.rootIcon = "../../images/xp/folder.png"; webFXTreeConfig.openRootIcon = "../../images/xp/openfolder.png"; webFXTreeConfig.folderIcon = "../../images/xp/folder.png"; webFXTreeConfig.openFolderIcon = "../../images/xp/openfolder.png"; webFXTreeConfig.fileIcon = "../../images/xp/file.png"; webFXTreeConfig.lMinusIcon = "../../images/xp/Lminus.png"; webFXTreeConfig.lPlusIcon = "../../images/xp/Lplus.png"; webFXTreeConfig.tMinusIcon = "../../images/xp/Tminus.png"; webFXTreeConfig.tPlusIcon = "../../images/xp/Tplus.png"; webFXTreeConfig.iIcon = "../../images/xp/I.png"; webFXTreeConfig.lIcon = "../../images/xp/L.png"; webFXTreeConfig.tIcon = "../../images/xp/T.png"; var tree = new WebFXLoadTree("系统菜单","/csWeb/myTree","","explorer") ; document.write(tree); // --></mce:script> <title>树形菜单</title> </head> <body> <form> </form> </body> </html></textarea>
<textarea cols="50" rows="15" name="code" class="c-sharp"><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link type="text/css" rel="stylesheet" href="../../css/xtree.css" mce_href="css/xtree.css" /> <mce:script type="text/javascript" src="../../scripts/xtree.js" mce_src="scripts/xtree.js"></mce:script> <mce:script type="text/javascript" src="../../scripts/xmlextras.js" mce_src="scripts/xmlextras.js"></mce:script> <mce:script type="text/javascript" src="../../scripts/xloadtree.js" mce_src="scripts/xloadtree.js"></mce:script> <mce:script type="text/javascript"><!-- /// XP Look webFXTreeConfig.rootIcon = "../../images/xp/folder.png"; webFXTreeConfig.openRootIcon = "../../images/xp/openfolder.png"; webFXTreeConfig.folderIcon = "../../images/xp/folder.png"; webFXTreeConfig.openFolderIcon = "../../images/xp/openfolder.png"; webFXTreeConfig.fileIcon = "../../images/xp/file.png"; webFXTreeConfig.lMinusIcon = "../../images/xp/Lminus.png"; webFXTreeConfig.lPlusIcon = "../../images/xp/Lplus.png"; webFXTreeConfig.tMinusIcon = "../../images/xp/Tminus.png"; webFXTreeConfig.tPlusIcon = "../../images/xp/Tplus.png"; webFXTreeConfig.iIcon = "../../images/xp/I.png"; webFXTreeConfig.lIcon = "../../images/xp/L.png"; webFXTreeConfig.tIcon = "../../images/xp/T.png"; var tree = new WebFXLoadTree("系统菜单","/csWeb/myTree","","explorer") ; document.write(tree); // --></mce:script> <title>树形菜单</title> </head> <body> <form> </form> </body> </html></textarea>
下面结合数据库贴出个无限级联的:
下面的是数据库基本信息,查看tree的文档还有别的设置我没用。
<textarea cols="50" rows="15" name="code" class="c-sharp">/** * */ package com.rx.domaiin; import java.io.Serializable; /** * @author Administrator * */ public class TreeDto implements Serializable{ /** * */ private static final long serialVersionUID = -4922521021860336478L; private int id; private int pid; /** * @return the id */ public int getId() { return id; } /** * @param id the id to set */ public void setId(int id) { this.id = id; } /** * @return the pid */ public int getPid() { return pid; } /** * @param pid the pid to set */ public void setPid(int pid) { this.pid = pid; } /** * @return the text */ public String getText() { return text; } /** * @param text the text to set */ public void setText(String text) { this.text = text; } /** * @return the url */ public String getUrl() { return url; } /** * @param url the url to set */ public void setUrl(String url) { this.url = url; } /** * @return the info */ public String getInfo() { return info; } /** * @param info the info to set */ public void setInfo(String info) { this.info = info; } /** * @return the target */ public String getTarget() { return target; } /** * @param target the target to set */ public void setTarget(String target) { this.target = target; } private String text; private String url; private String info; private String target; } </textarea>
修改为数据库访问
<textarea cols="50" rows="15" name="code" class="c-sharp">/** * */ package com.rx.util; import java.io.IOException; import java.io.PrintWriter; import java.sql.SQLException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import com.rx.domaiin.TreeDto; import com.rx.service.tree.TreeService; /** * @author Administrator * */ public class TreeServlet extends HttpServlet { /** * */ private static final long serialVersionUID = -3736027080120980272L; private static Logger log = Logger.getLogger(TreeServlet.class); /** * 初始化验证图片属性 */ public void init() throws ServletException { } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException { log.info("tree servlet"); response.setContentType("text/xml;charset=UTF-8"); PrintWriter out = null; try { out = response.getWriter(); out.println("<tree>"); // 0 作为根节点,这个自己设置。 buildTree(out, 0); // out.println("<tree text='two'>"); // out.println("<tree text='222' />"); // out.println("</tree>"); // out.println("<tree text='tw1o' />"); out.println("</tree>"); } catch (IOException e) { throw new ServletException(e); } catch (SQLException e) { throw new ServletException(e); } finally { out.flush(); out.close(); } } private void buildTree(PrintWriter out, int id) throws SQLException { TreeService treeService = new TreeService(); TreeDto treeDto = new TreeDto(); treeDto.setId(id); List list = treeService.treeQueryChild(treeDto); if (list != null) { for (int i = 0; i < list.size(); i++) { TreeDto ntreeDto = (TreeDto) list.get(i); // 非叶子节点 if (treeService.hasChild(ntreeDto)) { // String str = "<tree text='" + ntreeDto.getText() + "'>"; out.println(str); System.out.println(str); buildTree(out, ntreeDto.getId()); // out.println("</tree>"); System.out.println("</tree>"); } else { String str = "<tree text='" + String.valueOf(ntreeDto.getText()) + "' />"; out.println(str); System.out.println(str); } } } // 1. 从根节点开始 判断该节点是否是叶子节点,是打印信息如下out.println("<tree text='one leaf' />"); // 2. 不是叶子节点,打印信息如下out.println("<tree text='one'>"); // 3. 递归获取该节点的所有孩子节点 // 4. 回溯后打印out.print("</tree>"); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } } </textarea>
基本dao
<textarea cols="50" rows="15" name="code" class="c-sharp">/** * */ package com.rx.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import com.rx.db.ds.JdbcUtil; import com.rx.domaiin.TreeDto; import com.rx.util.Log4jUtil; /** * @author Administrator * */ public class TreeDao { private static final Logger logger = Log4jUtil.getLogger(TreeDao.class); private static final String QUERY_CHILD_BY_PID = "select id, pid, text, info, url, target from menu where pid = ?"; private static final String QUERY_BY_ID = "select id, pid, text, info, url, target from menu where id = ?"; public List treeQueryChild(TreeDto tree, Connection conn) throws SQLException { PreparedStatement ps = null; ResultSet rs = null; List list = new ArrayList(); try { ps = conn.prepareStatement(QUERY_CHILD_BY_PID); ps.setInt(1, tree.getId()); rs = ps.executeQuery(); // 存在记录则该用户是存在的 while (rs.next()) { TreeDto treeDto = new TreeDto(); treeDto.setId(rs.getInt(1)); treeDto.setPid(rs.getInt(2)); treeDto.setText(rs.getString(3)); treeDto.setInfo(rs.getString(4)); treeDto.setUrl(rs.getString(5)); treeDto.setTarget(rs.getString(6)); list.add(treeDto); } } catch (SQLException e) { logger.error("treeQuery:" + QUERY_CHILD_BY_PID); try { conn.rollback(); } catch (SQLException e1) { throw e1; } throw e; } finally { JdbcUtil.release(rs, ps, null); } return list; } public boolean hasChild(TreeDto tree, Connection conn) throws SQLException { PreparedStatement ps = null; ResultSet rs = null; List list = new ArrayList(); try { ps = conn.prepareStatement(QUERY_CHILD_BY_PID); ps.setInt(1, tree.getId()); rs = ps.executeQuery(); // 存在记录则该用户是存在的 if (rs.next()) { return true; } } catch (SQLException e) { logger.error("treeQuery hasChild:" + QUERY_CHILD_BY_PID); try { conn.rollback(); } catch (SQLException e1) { throw e1; } throw e; } finally { JdbcUtil.release(rs, ps, null); } return false; } public List treeQuery(TreeDto tree, Connection conn) throws SQLException { PreparedStatement ps = null; ResultSet rs = null; List list = new ArrayList(); try { ps = conn.prepareStatement(QUERY_BY_ID); ps.setInt(1, tree.getId()); rs = ps.executeQuery(); // 存在记录则该用户是存在的 while (rs.next()) { TreeDto treeDto = new TreeDto(); treeDto.setId(rs.getInt(1)); treeDto.setPid(rs.getInt(2)); treeDto.setText(rs.getString(3)); treeDto.setInfo(rs.getString(4)); treeDto.setUrl(rs.getString(5)); treeDto.setTarget(rs.getString(6)); list.add(treeDto); } } catch (SQLException e) { logger.error("treeQuery:" + QUERY_BY_ID); try { conn.rollback(); } catch (SQLException e1) { throw e1; } throw e; } finally { JdbcUtil.release(rs, ps, null); } return list; } } </textarea>
测试通过。