`
myhongkongzhen
  • 浏览: 95765 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

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

    博客分类:
  • J2EE
阅读更多

 

 

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=\"确定\" 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, "&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脚本文件下载:

  • 大小: 36.3 KB
  • 大小: 100.3 KB
  • treeList.rar (18.5 KB)
  • 描述: TREELIST(带有CHECKBOX功能)
  • 下载次数: 106
1
0
分享到:
评论

相关推荐

    带CheckBox和级联操作的Tree

    带CheckBox和级联操作的Tree 带CheckBox和级联操作的Tree 带CheckBox和级联操作的Tree

    纯JS+HTML写的checkBox Tree 级联选中 好用无BUG

    在前端开发中,CheckBox Tree(复选框树)是一种常见的组件,用于展示具有层级关系的数据,并支持用户进行多级选择。这个"纯JS+HTML写的checkBox Tree 级联选中"实例,解决了其他示例中可能存在的BUG,提供了一个...

    js实现checkbox级联选择

    使用javascript实现checkbox级联选择

    flex tree+checkbox级联勾选

    "Flex Tree + Checkbox级联勾选"是一个重要的功能点,通常出现在数据管理、配置界面或文件管理系统中,允许用户进行批量选择或级联操作。 首先,我们来详细了解一下Flex Tree。Flex Tree是基于Adobe Flex技术的一种...

    ExtJS4.2 tree 级联选择

    在ExtJS库中,Tree组件允许我们展示和操作数据以树形结构显示,而级联选择功能则意味着当用户选择一个节点时,它的所有子节点也会被自动选中,反之亦然,如果取消选中父节点,其所有子节点也将被取消选中。...

    Flex tree+checkbox可实现级联勾选 修改

    flex tree+checkbox可实现级联勾选 修改后 修改CheckTreeDemoRenderer.as这个文件中 while (!cursor.afterLast){ if (cursor.current.@state == STATE_CHECKED) { noChecks++; }else if (cursor.current.@state =...

    checkbox tree 带checkbox的树

    在IT领域,"带checkbox的树"(Checkbox Tree)是一种常见的UI组件,广泛应用于数据管理和配置界面中。这种组件结合了树形结构和复选框的功能,用户可以通过选择或取消选择节点来对数据进行多选操作,使得在层级关系...

    C#树形菜单的CheckBox级联选择

    实现树形菜单的CheckBox级联选择功能是增强用户交互性的重要手段,它允许用户通过选择一个节点来自动选中或取消选中其所有子节点,以及可能的父节点。这个特性通常在多级选择场景中非常有用。 首先,我们要理解`...

    Java中带复选框的树(Java CheckBox Tree)的实现和应用.doc

    总结来说,Java 中实现带复选框的树(CheckBox Tree)需要自定义 TreeNode 类(CheckBoxTreeNode),用于存储结点是否被选中的状态,并实现选中/取消选中时子结点和父结点的状态更新。同时,还需要创建一个 ...

    CheckBoxTree.zip

    在本文中,我们将深入探讨如何在Flex中实现CheckBoxTree,以及相关的关键技术点。 首先,我们需要了解Flex的基本概念。Flex是一个用于构建富互联网应用(RIA)的开源框架,它基于ActionScript编程语言和MXML标记...

    使用jQuery+EasyUI实现CheckBoxTree的级联选中特效

    在本文中,我们将深入探讨如何使用jQuery和EasyUI库实现一个具有级联选中功能的CheckBoxTree组件。CheckBoxTree是一种常见的UI元素,常用于展示层级结构的数据,并允许用户通过复选框选择或取消选择整条数据路径。在...

    checkbox 用shift键 级联选择

    "checkbox 用shift键 级联选择"这个话题涉及到一种提高用户效率的交互设计,它允许用户通过按下Shift键快速选择一系列连续的复选框(checkboxes)。在网页或应用程序中,复选框通常用于让用户在多个选项中进行多选。...

    ExpandAbleListView+checkbox数组方式级联,点击选择顶部文本显示,可删除

    ExpandAbleListView+checkbox数组方式级联,外层列表可展开收起,内层列表使用checkbox多选框,点击之后可在顶部的gridlayout显示,顶部显示的选中与checkbox选中状态关联,点击顶部选中的item,可取消选中状态,...

    CheckBoxTree

    10. **编程语言与框架**:CheckBoxTree可以使用多种编程语言实现,如JavaScript(搭配React、Vue或Angular等前端框架)、Java(在Swing或JavaFX中)、C#(在WPF或WinForms中)等。每种语言和框架都有其特定的实现...

    laravel-admin:form表单树状复选框组件(CheckboxTree).rar

    本篇文章将详细讲解如何在 Laravel-Admin 中使用 "CheckboxTree" 组件,这是一个用于实现树状复选框功能的插件,特别适合处理涉及多级分类或权限分配的问题。 首先,我们需要了解 "CheckboxTree" 的基本概念。在 ...

    ExtJs4 Checkbox tree

    ExtJs4 Checkbox Tree是基于ExtJs 4框架实现的一种特殊树形组件,它在传统的树形结构基础上增加了复选框功能。这种组件常用于需要用户多选树形数据的场景,比如权限设置、目录选择等。下面将详细介绍ExtJs4 Checkbox...

    Ext TreePanelrcheckbox级联选择的实现

    在实际应用中,我们经常需要处理树形结构的复选框,实现级联选择功能,即当父节点被选中时,其所有子节点自动被选中,反之亦然。这篇博客“Ext TreePanelrcheckbox级联选择的实现”就专注于探讨这个主题。 首先,...

Global site tag (gtag.js) - Google Analytics