带有checkbox的TREE列表级联的选择子栏目的JAVA标签形式的实现

 

 

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, "&nbsp;&nbsp;", 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 + "&nbsp;&nbsp;", 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 />

=========================我是分割线=======================

效果图如下 :

TREELISTCHECKBOX

=========================我是分割线=======================

 TREELISTCHECKBOX

=========================我是分割线=======================

treelist的JAVASCRIPT脚本文件下载:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值