2009年5月10号 天气晴 星期日
以下用JAVA代码实现了带有checkbox级联选择子栏目的TREE列表功能,并结合数据库中查询到的文章栏目,组-文章栏目权限的相关信息,完成用户组添加,修改的功能,
treelist采用的是JAVASCRIPT实现,在此感谢原作者的代码共享,在下面提供下载。
代码只提供核心DEMO部分,大家需要经过与自己的代码结合,部分修改才能正常使用,为此带来的不便,深表歉意!
=========================我是分割线=======================
标签类代码:
package g.cms.web.tag; import g.cms.business.ArchiveTypeService; import g.sql.ConnectionPool; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * @author Jane(吴贞贞) * @email [email protected] * @since JDK 1.6 * @alter 2009年5月10号 * @version 1.0 2009年5月8号 */ public class ArchiveTypeTreeManagerNewTag extends TagSupport { /** * */ private static final long serialVersionUID = 7735086372442764276L; private static final Log log = LogFactory .getLog(ArchiveTypeTreeManagerNewTag.class); private List<Integer> getGroupArticleTypeList(Integer retid) { String group_articleType_sql = "SELECT t.id,t.archivetypeid" + " FROM group_archivetype t WHERE GROUPID=?"; Connection con = null; try { con = ConnectionPool.getConnection(); con.setAutoCommit(false); PreparedStatement pst = con.prepareStatement(group_articleType_sql, Statement.RETURN_GENERATED_KEYS); pst.setInt(1, retid); ResultSet rs = pst.executeQuery(); List<Integer> groupArticleTypeList = new ArrayList<Integer>(); while (rs.next()) { groupArticleTypeList.add(rs.getInt("archivetypeid")); } log.debug("groupArticleTypeList Length : " + groupArticleTypeList.size()); con.commit(); return groupArticleTypeList; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } finally { if (con != null) try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } @Override public int doEndTag() throws JspException { // TODO Auto-generated method stub ArchiveTypeService archiveTypeSvr = new ArchiveTypeService(); List<Map<String, Object>> list = (List<Map<String, Object>>) archiveTypeSvr .query("select id,pid,name from archive_type order by id"); Integer retid = null; List<Integer> groupArticleTypeList = null; // retid = (Integer) // this.pageContext.getRequest().getAttribute("retid"); String retidStr = this.pageContext.getRequest().getParameter("groupid"); if (null == retidStr || "".trim().equals(retidStr) || "addFirst".trim().equals(retidStr)) { log.debug("FIRST INSERT GROUP-ARCHIVETYPE..."); } else { retid = Integer.parseInt(retidStr); log.debug("EDIT GROUP-ARCHIVETYPE... ID==>" + retid); groupArticleTypeList = getGroupArticleTypeList(retid); } JspWriter out = this.pageContext.getOut(); log.debug("构建树形列表。。。"); String typeidStr = null; try { out.println("<input type=\"button\" " + "value=\"确定\" onclick=\"sel()\" />"); out.println("<div id=\"systree\"></div>"); out.println("<script type=\"text/javascript\">"); out.println("function sel(){"); out.println("var selids=d.getCheckedNodes();"); out.println("var str=\"\";"); out.println("for(var n=0; n<selids.length; n++){"); out.println("str+=selids[n]+\";\";"); out.println("}"); // out.println("alert(str);"); // out.println("window.open(\"user!addGroup.do?typeids=\" + str+\" , // '_self'\");"); out.println("document.getElementById(\"typeids\").value=str"); out.println(" }"); out.println("var d = new dTree('d','/yppt/images/system/menu/');"); out.println("d.config.folderLinks=true;"); out.println("d.config.useCookies=false;"); out.println("d.config.check=true;"); // 子节点 父节点 NAME // d.add(0,-1,'系统菜单',"javascript:;",'提示'); // out.println("d.add(0,-1,'系统菜单',\"javascript:;\",'提示');"); // // d.add(100,0,'系统管理',"javascript:;",'所有系统管理功能'); // out.println("d.add(100,0,'系统管理',\"javascript:;\",'所有系统管理功能');"); // // d.add(790,100,'菜单管理',"javascript:;",'菜单管理'); // out.println("d.add(790,100,'菜单管理',\"javascript:;\",'菜单管理');"); // // d.add(800,100,'组织机构',"javascript:;",''); // out.println("d.add(800,100,'组织机构',\"javascript:;\",'');"); out.println("d.add(0,-1,'文章栏目列表',\"javascript:;\",'文章栏目列表')"); gotoTreeList(out, list); out.println("document.getElementById('systree').innerHTML = d;"); out.println("</script>"); if (null != groupArticleTypeList) { out.println("<script type=\"text/javascript\">"); String funcs = "var funcs = eval(\"(\"+\"{funcs:[{menudm:'0'},"; for (Integer groupArticleTypeID : groupArticleTypeList) { log.debug("[" + groupArticleTypeID + ",]"); // out.println("{menudm:'100'},{menudm:'790'},{menudm:'800'}," // + "{menudm:'810'}"); funcs += "{menudm:'" + groupArticleTypeID + "'},"; } funcs = funcs.substring(0, funcs.length() - 1); funcs += "]}\"+\")\");"; out.println(funcs); out.println("for(var n=0; n<funcs.funcs.length;n++){"); out.println("d.co(funcs.funcs[n].menudm).checked=true;"); out.println("}"); // var funcs = // eval("("+"{funcs:[{menudm:'0'},{menudm:'100'},{menudm:'790'}, // {menudm:'800'},{menudm:'810'}]}"+")"); // for(var n=0; n<funcs.funcs.length;n++){ // d.co(funcs.funcs[n].menudm).checked=true; // } out.println("</script>"); } log.debug("树形列表构建成功。。。"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return this.EVAL_PAGE; } private void gotoTreeList(JspWriter out, List<Map<String, Object>> list) { try { List<java.util.Map> tree = new LinkedList<java.util.Map>(); List temp = new LinkedList<java.util.Map>(); for (java.util.Map row : list) { if (row.get("pid") == null || row.get("pid").toString().equals("")) { tree.add(row);// 最終欄目,沒有pid的 } else { temp.add(row); // 有pid的欄目 } list = temp; } for (java.util.Map node : tree) { String idStr = (node.get("id")).toString(); Integer value = Integer.parseInt(idStr); String label = (String) node.get("name"); // 子节点 父节点 NAME // d.add(100,0,'系统管理',"javascript:;",'所有系统管理功能'); // // d.add(790,100,'菜单管理',"javascript:;",'菜单管理'); // // d.add(800,100,'组织机构',"javascript:;",''); out.println("d.add(" + value + ",0,'" + label + "',\"javascript:;\",'" + label + "')"); platToHierarchical(node, " ", out, list); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 平铺数据转化为层次数据--遍历子节点 */ @SuppressWarnings("unchecked") private void platToHierarchical(Map node, String space, JspWriter out, List<Map<String, Object>> list) throws IOException { List<Map> children = findChildren(node.get("id").toString(), list); List<Integer> tid = new ArrayList<Integer>(); for (int i = 0; i < children.size(); i++) { Map child = children.get(i); String idStr = (child.get("id")).toString(); Integer id = Integer.parseInt(idStr); String pidStr = (child.get("pid")).toString(); Integer pid = Integer.parseInt(pidStr); String name = (String) child.get("name"); tid.add(id); // 子节点 父节点 NAME // d.add(100,0,'系统管理',"javascript:;",'所有系统管理功能'); // // d.add(790,100,'菜单管理',"javascript:;",'菜单管理'); // // d.add(800,100,'组织机构',"javascript:;",''); out.println("d.add(" + id + "," + pid + ",'" + name + "',\"javascript:;\",'" + name + "')"); platToHierarchical(child, space + " ", out, list); } } /** * 平铺数据转化为层次数据--查找子节点 */ @SuppressWarnings("unchecked") private List findChildren(String parentId, List<Map<String, Object>> list) { List<java.util.Map> result = new LinkedList<java.util.Map>(); List temp = new LinkedList<java.util.Map>(); for (java.util.Map row : list) { if (row.get("pid").toString().equals(parentId)) { result.add(row); } else { temp.add(row); } list = temp; } return result; } }
=========================我是分割线=======================
STRUTS2的action代码:
public String editGroup() { Object autoIncKeyFromApi = -1; setOperate("修改用户组"); setOperateInfo("用户组已修改"); addLink("editGroup", new Link("返回用户组列表", "user!queryGroup.do")); Connection con = null; try { con = ConnectionPool.getConnection(); con.setAutoCommit(false); SysconfigGroup group = new SysconfigGroup(); group.setName(request.getParameter("name")); group.setRemark(request.getParameter("remark")); group.setArctypeadd(getParameterInteger("arctypeadd")); group.setArctypedel(getParameterInteger("arctypedel")); group.setArctypeedit(getParameterInteger("arctypeedit")); group.setArctypesee(getParameterInteger("arctypesee")); group.setArcadd(getParameterInteger("arcadd")); group.setArcdel(getParameterInteger("arcdel")); group.setArcedit(getParameterInteger("arcedit")); group.setArcsee(getParameterInteger("arcsee")); // UserGroupService service = new UserGroupService(); String group_sql = "update sys_group set name=?,remark=?,arctypeadd=?,arctypedel=?," + "arctypeedit=?,arctypesee=?,arcadd=?,arcdel=?,arcedit=?,arcsee=? " + " where id=?"; PreparedStatement pst = con.prepareStatement(group_sql, Statement.RETURN_GENERATED_KEYS); // int retid = 0;// = service.insert(group); pst.setString(1, group.getName()); pst.setString(2, group.getRemark()); pst.setInt(3, group.getArctypeadd()); pst.setInt(4, group.getArctypedel()); pst.setInt(5, group.getArctypeedit()); pst.setInt(6, group.getArctypesee()); pst.setInt(7, group.getArcadd()); pst.setInt(8, group.getArcdel()); pst.setInt(9, group.getArcedit()); pst.setInt(10, group.getArcsee()); SysconfigGroupService service = new SysconfigGroupService(); SysconfigGroup g = service.get(new Integer(request .getParameter("id"))); pst.setInt(11, g.getId()); pst.executeUpdate(); String typeidsPr = request.getParameter("typeids"); typeidsPr = typeidsPr.substring(2, typeidsPr.length()); String[] typeids = typeidsPr.split(";"); log.debug(Arrays.toString(typeids)); Integer retid = g.getId(); request.setAttribute("retid", retid); // String group_articleType_sql = "SELECT t.id,t.archivetypeid" // + " FROM group_archivetype t WHERE GROUPID=?"; // pst = null; // pst = con.prepareStatement(group_articleType_sql, // Statement.RETURN_GENERATED_KEYS); // pst.setInt(1, g.getId()); // ResultSet rs = pst.executeQuery(); // List<Integer> groupArticleTypeList = new ArrayList<Integer>(); // while (rs.next()) { // groupArticleTypeList.add(rs.getInt("archivetypeid")); // } // log.debug("groupArticleTypeList Length : " // + groupArticleTypeList.size()); // request.setAttribute("groupArticleTypeList", // groupArticleTypeList); if (typeids != null && typeids.length != 0) { String delSql = "delete from group_archivetype where groupid=?"; pst = null; pst = con.prepareStatement(delSql, Statement.RETURN_GENERATED_KEYS); pst.setInt(1, g.getId()); pst.executeUpdate(); log.debug("DELETE GROUP ARCHIVETYPE SUCCESS!"); log.debug("UPDATE GROUP ARCHIVETYPE ..."); String sql = "insert into group_archivetype(id,groupid,archivetypeid) values(" + "(select (nvl(max(to_number(id)), 0)) from group_archivetype)+1,{0},{1})"; int i = 1; for (String t : typeids) { String tmp = MessageFormat.format(sql, retid, Integer .parseInt(t)); pst = null; pst = con.prepareStatement(tmp, Statement.RETURN_GENERATED_KEYS); pst.executeUpdate(); i++; } log.info("影响了" + i + "行"); } con.commit(); } catch (Exception e) { e.printStackTrace(); log.error(e); setOperateInfo("用户组修改失败"); setException(getStackTrace(e, null)); try { con.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } finally { if (con != null) try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } return INPUT; }
=========================我是分割线=======================
<web4j:ArchiveTypeTreeManagerNewTag />
=========================我是分割线=======================
效果图如下 :
=========================我是分割线=======================
=========================我是分割线=======================
treelist的JAVASCRIPT脚本文件下载: