这几天忙着移植树,原先项目里用到是静态树(xTree),因为数据比较少,因此一次性加载,没有太多效率的问题,后来因为涉及的数据太多,如果一次性加载会耗费6、7秒的时间,用户体验特别差,实在难以忍受,考虑一次性加载完成的这个问题,决定换成动态树(xLoadTree2),也就是每一次只加载树的一级节点,采用异步加载的方式,速度上的确是快了很多,用户体验也还可以,但多少有一些缺憾,后来便换成了另一种动态树(dhtmlxTree),个人感觉比xLoadTree2要更加强大,实现方法:
StringBuffer sb = new StringBuffer(); sb.append("<script language=\"javascript\">"); sb.append("tree=new dhtmlXTreeObject(\"" + divId + "\",\"100%\",\"100%\",\"newsCenter\");");//1 sb.append("tree.loadXML(\"/tree/list1.do?id=newsCenter\");");//2 sb.append("tree.setOnOpenEndHandler(doOpen);");//3 sb.append("tree.setXMLAutoLoading(\"/tree/list1.do\");");//4 sb.append("tree.setOnClickHandler(doClick);");//5 sb.append("tree.setImagePat(\"/images/dhtmlxtree/csh_bluebooks/\");");//6 sb.append("</script>");
1,divId是页面中的document标识id,
2,初次加载树时,获取树的路径,后面展示该方法
3,doOpen是一个自定义的js函数,当打开树时所要处理的事情
4,setXMLAutoLoading:自动加载数据
5,doClick同样是一个自定义的js函数,用于处理点击节点时所要触发的事件,比如链接等等
6,是树图片的路径
接下来是struts中生成xml(数据)的方法:
public String list1() throws IOException {// dhtmlxtree this.getResponse().setContentType("text/xml; charset=utf-8"); PrintWriter out = this.getResponse().getWriter(); String id = this.getRequest().getParameter("id"); if (Util.isblank(id)) { doc = new Document(new Element("tree").setAttribute("id", "a")); Element tree = doc.getRootElement(); Element inner = new Element("item").setAttribute("text", "/"); inner.setAttribute("id", "0"); inner.setAttribute("child", "1"); tree.addContent(inner); } else { generateXML(id); } Format format = Format.getCompactFormat(); format.setEncoding("utf-8"); format.setIndent("\t"); XMLOutputter xout = new XMLOutputter(format); xout.output(doc, out); out.flush(); out.close(); return null; } private void transfer1(Document doc, List<Category> r, String type) { String oper = ""; if (type.split("_").length > 1) { oper = type.split("_")[1]; } if ("newsPublish".equals(type) || "add".equals(oper)) {// 区别是发布还是维护 oper = "_add"; } if ("newsModify".equals(type) || "list".equals(oper)) { oper = "_list"; } for (Iterator<Category> it = r.iterator(); it.hasNext();) { Category one = (Category) it.next(); Element tree = null; tree = doc.getRootElement(); Element inner = new Element("item").setAttribute("text", one .getName()); inner.setAttribute("id", "" + one.getId() + oper); if (!one.isLeaf()) { inner.setAttribute("child", "1"); } tree.addContent(inner); } } private void generateXML(String id) { if ("newsCenter".equals(id)) {// 信息管理中心 doc = new Document(new Element("tree").setAttribute("id", id)); Element tree = doc.getRootElement(); Element inner = new Element("item").setAttribute("text", "信息发布"); inner.setAttribute("id", "newsPublish"); inner.setAttribute("child", "1"); tree.addContent(inner); inner = new Element("item").setAttribute("text", "信息维护"); inner.setAttribute("id", "newsModify"); inner.setAttribute("child", "1"); tree.addContent(inner); } else if ("newsPublish".equals(id) || "newsModify".equals(id)) { Category ca = categoryService.getByEname("newscenter"); doc = new Document(new Element("tree").setAttribute("id", id)); List<Category> list = categoryService.getCategorys(ca.getId(), ""); transfer1(doc, list, id); }else { List<Category> list = categoryService.getCategorys(new Long(id .split("_")[0]), ""); doc = new Document(new Element("tree").setAttribute("id", id)); transfer1(doc, list, id); } }
待续.......