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 myhongkongzhen@gmail.com
* @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=\"确定\" οnclick=\"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脚本文件下载: