- 浏览: 12909 次
- 性别:
- 来自: 天津
-
文章分类
最新评论
-
TJYCHYANGCHENHUI:
<div class="quote_title ...
jQuery+s2sh 实现无限级tree -
jackyrong:
最好提供代码下载参考吧,另外强烈推荐一个国产的ZTREE,树的 ...
jQuery+s2sh 实现无限级tree
1:成果预览图
[img]
[/img]
2:实现过程
a: 框架的搭建:效果图(因为本文章的重点是对treeView的实现,所以框架的搭建就不在多说)
b:创建t_category 表格
c:创建实体模型Category
d:创建CategoryDAO接口
e:创建CategoryDAOImpl
f:配置映射文件
g:添加一些需要的文件
h: 创建一个servlet进行返回json格式的数据(这篇文章使用的是servlet由于时间原因下次会更改为action)
h:创建index.html
i:在jquery.treeview.async.js 中添加代码,只有这样才能够完成树的异步构建
j:新建category.js处理节点的添加与编辑函数的编写
k:编写action类
M:applicationContext.xml的配置
N: 结束:
M:源码:
谢谢你的提供,因为jar包大于10m所以就没有上传,但是源码我上传在了csdn上面 url[url]
http://download.csdn.net/detail/tjychyangchenhui/4245836
[/url]
[img]

[/img]
2:实现过程
a: 框架的搭建:效果图(因为本文章的重点是对treeView的实现,所以框架的搭建就不在多说)

b:创建t_category 表格

c:创建实体模型Category
package com.yangchenhui.model; import java.util.HashSet; import java.util.Set; public class Category implements java.io.Serializable { private static final long serialVersionUID = -8759167738763128025L; private Integer categoryId; private Category category; private String categoryName; private Integer depth; private Set<Category> categories = new HashSet<Category>(0); // Constructors /** default constructor */ public Category() { } /** minimal constructor */ public Category(String categoryName) { this.categoryName = categoryName; } /** full constructor */ public Category(Category category, String categoryName, Integer depth, Set<Category> categories) { this.category = category; this.categoryName = categoryName; this.depth = depth; this.categories = categories; } // Property accessors public Integer getCategoryId() { return this.categoryId; } public void setCategoryId(Integer categoryId) { this.categoryId = categoryId; } public Category getCategory() { return this.category; } public void setCategory(Category category) { this.category = category; } public String getCategoryName() { return this.categoryName; } public void setCategoryName(String categoryName) { this.categoryName = categoryName; } public Integer getDepth() { return this.depth; } public void setDepth(Integer depth) { this.depth = depth; } public Set<Category> getCategories() { return this.categories; } public void setCategories(Set<Category> categories) { this.categories = categories; } }
d:创建CategoryDAO接口
package com.yangchenhui.dao; import java.util.List; import com.yangchenhui.model.Category; public interface CategoryDAO { public abstract void save(Category transientInstance); public abstract void delete(Category persistentInstance); public abstract Category findById(java.lang.Integer id); public abstract List findByExample(Category instance); public abstract List findByProperty(String propertyName, Object value); public abstract List findByCategoryName(Object categoryName); public abstract List findByDepth(Object depth); public abstract List findAll(); public abstract Category merge(Category detachedInstance); public abstract void attachDirty(Category instance); public abstract void attachClean(Category instance); void deleteCategoryByParentId(Integer categoryId); }
e:创建CategoryDAOImpl
package com.yangchenhui.dao; import java.util.List; import java.util.Set; import org.hibernate.LockMode; import org.hibernate.Query; import org.hibernate.criterion.Example; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.yangchenhui.model.Category; /** * A data access object (DAO) providing persistence and search support for * Category entities. Transaction control of the save(), update() and delete() * operations can directly support Spring container-managed transactions or they * can be augmented to handle user-managed Spring transactions. Each of these * methods provides additional information for how to configure it for the * desired type of transaction control. * * @see com.yangchenhui.model.Category * @author MyEclipse Persistence Tools */ public class CategoryDAOImpl extends HibernateDaoSupport implements CategoryDAO { private static final Logger log = LoggerFactory .getLogger(CategoryDAOImpl.class); // property constants public static final String CATEGORY_NAME = "categoryName"; public static final String DEPTH = "depth"; /* (non-Javadoc) * @see com.yangchenhui.dao.CategoryDAO#save(com.yangchenhui.model.Category) */ @Override public void save(Category transientInstance) { log.debug("saving Category instance"); try { getSession().save(transientInstance); log.debug("save successful"); } catch (RuntimeException re) { log.error("save failed", re); throw re; } } /* (non-Javadoc) * @see com.yangchenhui.dao.CategoryDAO#delete(com.yangchenhui.model.Category) */ @Override public void delete(Category persistentInstance) { log.debug("deleting Category instance"); try { getSession().delete(persistentInstance); log.debug("delete successful"); } catch (RuntimeException re) { log.error("delete failed", re); throw re; } } /* (non-Javadoc) * @see com.yangchenhui.dao.CategoryDAO#findById(java.lang.Integer) */ @Override public Category findById(java.lang.Integer id) { log.debug("getting Category instance with id: " + id); try { Category instance = (Category) getSession().get( "com.yangchenhui.model.Category", id); return instance; } catch (RuntimeException re) { log.error("get failed", re); throw re; } } /* (non-Javadoc) * @see com.yangchenhui.dao.CategoryDAO#findByExample(com.yangchenhui.model.Category) */ @Override public List findByExample(Category instance) { log.debug("finding Category instance by example"); try { List results = getSession() .createCriteria("com.yangchenhui.model.Category") .add(Example.create(instance)).list(); log.debug("find by example successful, result size: " + results.size()); return results; } catch (RuntimeException re) { log.error("find by example failed", re); throw re; } } /* (non-Javadoc) * @see com.yangchenhui.dao.CategoryDAO#findByProperty(java.lang.String, java.lang.Object) */ @Override public List findByProperty(String propertyName, Object value) { log.debug("finding Category instance with property: " + propertyName + ", value: " + value); try { String queryString = "from Category as model where model." + propertyName + "= ?"; Query queryObject = getSession().createQuery(queryString); queryObject.setParameter(0, value); return queryObject.list(); } catch (RuntimeException re) { log.error("find by property name failed", re); throw re; } } /* (non-Javadoc) * @see com.yangchenhui.dao.CategoryDAO#findByCategoryName(java.lang.Object) */ @Override public List findByCategoryName(Object categoryName) { return findByProperty(CATEGORY_NAME, categoryName); } /* (non-Javadoc) * @see com.yangchenhui.dao.CategoryDAO#findByDepth(java.lang.Object) */ @Override public List findByDepth(Object depth) { return findByProperty(DEPTH, depth); } /* (non-Javadoc) * @see com.yangchenhui.dao.CategoryDAO#findAll() */ @Override public List findAll() { log.debug("finding all Category instances"); try { String queryString = "from Category"; Query queryObject = getSession().createQuery(queryString); return queryObject.list(); } catch (RuntimeException re) { log.error("find all failed", re); throw re; } } /* (non-Javadoc) * @see com.yangchenhui.dao.CategoryDAO#merge(com.yangchenhui.model.Category) */ @Override public Category merge(Category detachedInstance) { log.debug("merging Category instance"); try { Category result = (Category) getSession().merge(detachedInstance); log.debug("merge successful"); return result; } catch (RuntimeException re) { log.error("merge failed", re); throw re; } } /* (non-Javadoc) * @see com.yangchenhui.dao.CategoryDAO#attachDirty(com.yangchenhui.model.Category) */ @Override public void attachDirty(Category instance) { log.debug("attaching dirty Category instance"); try { getSession().saveOrUpdate(instance); log.debug("attach successful"); } catch (RuntimeException re) { log.error("attach failed", re); throw re; } } /* (non-Javadoc) * @see com.yangchenhui.dao.CategoryDAO#attachClean(com.yangchenhui.model.Category) */ @Override public void attachClean(Category instance) { log.debug("attaching clean Category instance"); try { getSession().lock(instance, LockMode.NONE); log.debug("attach successful"); } catch (RuntimeException re) { log.error("attach failed", re); throw re; } } @Override public void deleteCategoryByParentId(Integer categoryId){ log.debug("deleting Category instance"); try { Query query = getSession().createQuery("delete from Category c where c.category.categoryId = " + categoryId); query.executeUpdate(); log.debug("delete successful"); } catch (RuntimeException re) { log.error("delete failed", re); throw re; } } }
f:配置映射文件
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping> <class name="com.yangchenhui.model.Category" table="t_category" catalog="ambow"> <id name="categoryId" type="java.lang.Integer"> <column name="categoryId" /> <generator class="increment"></generator> </id> <many-to-one name="category" class="com.yangchenhui.model.Category" fetch="select"> <column name="parentId" /> </many-to-one> <property name="categoryName" type="java.lang.String"> <column name="categoryName" length="20" not-null="true" /> </property> <property name="depth" type="java.lang.Integer"> <column name="depth" /> </property> <set name="categories" inverse="true"> <key> <column name="parentId" /> </key> <one-to-many class="com.yangchenhui.model.Category" /> </set> </class> </hibernate-mapping>
g:添加一些需要的文件

h: 创建一个servlet进行返回json格式的数据(这篇文章使用的是servlet由于时间原因下次会更改为action)
package com.yagnchenhui.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import com.yangchenhui.model.Category; import com.yangchenhui.service.CategoryService; public class CategoryFindAllServlet extends HttpServlet { private CategoryService categoryService; /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/json;charset=UTF-8"); response.setHeader("Cache-Control", "no-cache"); response.setContentType("text/json;charset=UTF-8"); PrintWriter out = response.getWriter(); String sb = getRootNode(); System.out.println(sb); out.print(sb.toString()); out.flush(); out.close(); } public String getRootNode() { StringBuffer sb = new StringBuffer(); sb.append("["); sb.append("{"); sb.append("\"text\":\"分类\""); sb.append(",\"classes\":\"categoryRoot\""); sb.append(",\"expanded\":true"); sb.append(",\"children\":"+getOneNode(categoryService.queryOneLevelParentsCategory()) +""); sb.append("}"); sb.append("]"); return sb.toString(); } public String getOneNode(List<Category> categoryList){ StringBuffer sb = new StringBuffer(); sb.append("["); for(int i = 0; i < categoryList.size(); i++){ if(categoryList.get(i).getCategory() == null){ if(i == 0){ sb.append("{"); sb.append("\"text\":\"" + categoryList.get(i).getCategoryName() + "\""); sb.append(",\"id\":\""+ categoryList.get(i).getCategoryId()+"\""); sb.append(",\"classes\":\"categoryOneLevel\""); sb.append(",\"expanded\":true"); sb.append(",\"children\":" + getTwoNode(categoryList.get(i).getCategoryId()) + ""); sb.append("}"); }else{ sb.append(",{"); sb.append("\"text\":\"" + categoryList.get(i).getCategoryName() + "\""); sb.append(",\"id\":\""+ categoryList.get(i).getCategoryId()+"\""); sb.append(",\"classes\":\"categoryOneLevel\""); sb.append(",\"expanded\":true"); sb.append(",\"children\":" + getTwoNode(categoryList.get(i).getCategoryId()) + ""); sb.append("}"); } } } sb.append("]"); return sb.toString(); } public String getTwoNode(Integer parentId){ List<Category> children = categoryService.queryChildrenCategoryByParentId(parentId); StringBuffer sb = new StringBuffer(); sb.append("["); for(int i = 0; i < children.size(); i++){ if(i == 0){ sb.append("{"); sb.append("\"text\":\"" + children.get(i).getCategoryName() + "\""); sb.append(",\"classes\":\"categoryOneLevel\""); sb.append(",\"id\":\""+ children.get(i).getCategoryId()+"\""); if(categoryService.hasChildren(children.get(i).getCategoryId())){ sb.append(",\"children\":"+getTwoNode(children.get(i).getCategoryId())+ ""); sb.append("}"); }else{ sb.append("}"); } }else{ sb.append(",{"); sb.append("\"text\":\"" + children.get(i).getCategoryName() + "\""); sb.append(",\"classes\":\"categoryOneLevel\""); sb.append(",\"id\":\""+ children.get(i).getCategoryId()+"\""); if(categoryService.hasChildren(children.get(i).getCategoryId())){ sb.append(",\"children\":"+getTwoNode(children.get(i).getCategoryId())+ ""); sb.append("}"); }else{ sb.append("}"); } } } sb.append("]"); return sb.toString(); } /** * Initialization of the servlet. <br> * * @throws ServletException if an error occurs */ public void init() throws ServletException { WebApplicationContext wpc = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext()); categoryService = (CategoryService) wpc.getBean("categoryService"); } }
h:创建index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>index.html</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <link rel="stylesheet" href="css/jquery.treeview.css" /> <link rel="stylesheet" href="css/screen.css" /> <script type="text/javascript" src="js/jquery-1.7.2.js"> </script> <script type="text/javascript" src="js/jquery.treeview.js"> </script> <script type="text/javascript" src="js/jquery.cookie.js"> </script> <script type="text/javascript" src="js/jquery.treeview.async.js"> </script> <script type="text/javascript" src="js/jquery.contextmenu.r2.js"></script> <script type="text/javascript" src="js/category.js"></script> <script type="text/javascript"> $(document).ready(function(){ $("#navigation").treeview({ animated: "fast", collapsed: true, unique: true, persist: "location", url: "categoryFindAllServlet" }); }); </script> </head> <body> <ul id="navigation" class="treeview-red"></ul> <div class="contextMenu" id="rootMenu"> [list] <li id="addOneLevelCategory">新增一级分类</li> <li id="deleteAllOneLevelCategory">删除所有一级分类</li> [/list] </div> <div class="contextMenu" id="OneMenu"> [list] <li id="editOneLevelCategory">编辑</li> <li id="deleteOneLevelCategory">删除</li> <li id="addChildCategory">新增子分类</li> [/list] </div> </body> </html>
i:在jquery.treeview.async.js 中添加代码,只有这样才能够完成树的异步构建
/* * Async Treeview 0.1 - Lazy-loading extension for Treeview * * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/ * * Copyright (c) 2007 Jörn Zaefferer * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * * Revision: $Id$ * */ ;(function($) { function load(settings, root, child, container) { function createNode(parent) { var current = $("<li/>").attr("id", this.id || "").html("<span>" + this.text + "</span>").appendTo(parent); if (this.classes) { current.children("span").addClass(this.classes); } if (this.expanded) { current.addClass("open"); } if (this.hasChildren || this.children && this.children.length) { var branch = $("<ul/>").appendTo(current); if (this.hasChildren) { current.addClass("hasChildren"); createNode.call({ classes: "placeholder", text: " ", children:[] }, branch); } if (this.children && this.children.length) { $.each(this.children, createNode, [branch]); } } } $.ajax($.extend(true, { url: settings.url, dataType: "json", data: { root: root }, success: function(response) { child.empty(); $.each(response, createNode, [child]); $(container).treeview({add: child}); //代码添加的开始 $("span.categoryRoot").contextMenu("rootMenu",{ bindings:{ addOneLevelCategory:addOneLevelCategory, deleteAllOneLevelCategory:deleteAllOneLevelCategory } }); $("span.categoryOneLevel").contextMenu("OneMenu",{ bindings:{ editOneLevelCategory:editOneLevelCategory, deleteOneLevelCategory:deleteOneLevelCategory, addChildCategory:addChildCategory } }); //代码添加的结束 } }, settings.ajax)); /* $.getJSON(settings.url, {root: root}, function(response) { function createNode(parent) { var current = $("<li/>").attr("id", this.id || "").html("<span>" + this.text + "</span>").appendTo(parent); if (this.classes) { current.children("span").addClass(this.classes); } if (this.expanded) { current.addClass("open"); } if (this.hasChildren || this.children && this.children.length) { var branch = $("<ul/>").appendTo(current); if (this.hasChildren) { current.addClass("hasChildren"); createNode.call({ classes: "placeholder", text: " ", children:[] }, branch); } if (this.children && this.children.length) { $.each(this.children, createNode, [branch]) } } } child.empty(); $.each(response, createNode, [child]); $(container).treeview({add: child}); }); */ } var proxied = $.fn.treeview; $.fn.treeview = function(settings) { if (!settings.url) { return proxied.apply(this, arguments); } var container = this; if (!container.children().size()) load(settings, "source", this, container); var userToggle = settings.toggle; return proxied.call(this, $.extend({}, settings, { collapsed: true, toggle: function() { var $this = $(this); if ($this.hasClass("hasChildren")) { var childList = $this.removeClass("hasChildren").find("ul"); load(settings, this.id, childList, container); } if (userToggle) { userToggle.apply(this, arguments); } } })); }; })(jQuery);
j:新建category.js处理节点的添加与编辑函数的编写
/** * 增加一级类别的函数 */ function addOneLevelCategory(){ var categoryOneLevelValue = window.prompt("请输入要添加的类别的分类",""); $.post( "categoryAdd.action", { categoryOneLevelValue:categoryOneLevelValue }, function (data,textStatus){ $("#navigation").empty(); $("#navigation").treeview({ animated: "fast",//由它来决定收缩和展开效果 collapsed: true, unique: true, persist: "location", url:"categoryFindAllServlet" }); } ); } /** * 删除所有的一级节点类别 */ function deleteAllOneLevelCategory(){ alert("你好"); } /** * 编辑一级节点的信息 */ function editOneLevelCategory(data){ var categoryOneLevelValue = window.prompt("请输入要修改的一级节点的名称",""); $.post( "categoryEdit.action", { categoryOneLevelValue:categoryOneLevelValue, categoryId:data.parentNode.id }, function (data,textStatus){ $("#navigation").empty(); $("#navigation").treeview({ animated: "fast",//由它来决定收缩和展开效果 collapsed: true, unique: true, persist: "location", url:"categoryFindAllServlet" }); } ); } function deleteOneLevelCategory(data){ var confim = window.confirm("你确定要删除这个类别一级其所有的自类别吗?"); if(confim){ $.post( "categoryDelete.action", { categoryId:data.parentNode.id }, function (data,textStatus){ $("#navigation").empty(); $("#navigation").treeview({ animated: "fast",//由它来决定收缩和展开效果 collapsed: true, unique: true, persist: "location", url:"categoryFindAllServlet" }); } ); } } /** * 像一个级别分类中中增加子类别 * @param {} data */ function addChildCategory(data){ var categoryOneLevelValue = window.prompt("请输入要添加的类别名称",""); $.post( "categoryChildAdd.action", { categoryOneLevelValue:categoryOneLevelValue, parentCategoryId:data.parentNode.id }, function (data,textStatus){ $("#navigation").empty(); $("#navigation").treeview({ animated: "fast",//由它来决定收缩和展开效果 collapsed: true, unique: true, persist: "location", url:"categoryFindAllServlet" }); } ); }
k:编写action类
package com.yangchenhui.action; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionSupport; import com.yangchenhui.model.Category; import com.yangchenhui.service.CategoryService; public class CategoryAddAction extends ActionSupport { private static final long serialVersionUID = 1L; private CategoryService categoryService; private String categoryOneLevelValue; @Override public String execute() throws Exception { Category category = new Category(); category.setCategoryName(categoryOneLevelValue); category.setDepth(1); if(!categoryService.queryCategoryByCategoryName(categoryOneLevelValue)){ categoryService.addOneLevelCategory(category); } return Action.SUCCESS; } public CategoryService getCategoryService() { return categoryService; } public void setCategoryService(CategoryService categoryService) { this.categoryService = categoryService; } public String getCategoryOneLevelValue() { return categoryOneLevelValue; } public void setCategoryOneLevelValue(String categoryOneLevelValue) { this.categoryOneLevelValue = categoryOneLevelValue; } }
package com.yangchenhui.action; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionSupport; import com.yangchenhui.model.Category; import com.yangchenhui.service.CategoryService; public class CategoryChildAdd extends ActionSupport { private static final long serialVersionUID = 1L; private CategoryService categoryService; private String categoryOneLevelValue; private Integer parentCategoryId; @Override public String execute() throws Exception { Category childCategory = new Category(); childCategory.setCategoryName(categoryOneLevelValue); if(!categoryService.queryCategoryByCategoryName(categoryOneLevelValue)){ categoryService.addCategoryToParent(parentCategoryId, childCategory); } return Action.SUCCESS; } public CategoryService getCategoryService() { return categoryService; } public void setCategoryService(CategoryService categoryService) { this.categoryService = categoryService; } public String getCategoryOneLevelValue() { return categoryOneLevelValue; } public void setCategoryOneLevelValue(String categoryOneLevelValue) { this.categoryOneLevelValue = categoryOneLevelValue; } public Integer getParentCategoryId() { return parentCategoryId; } public void setParentCategoryId(Integer parentCategoryId) { this.parentCategoryId = parentCategoryId; } }
package com.yangchenhui.action; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionSupport; import com.yangchenhui.service.CategoryService; public class CategoryDeleteAction extends ActionSupport { private static final long serialVersionUID = 1L; private CategoryService categoryService; private Integer categoryId; @Override public String execute() throws Exception { this.categoryService.deleteCategory(categoryId); return Action.SUCCESS; } public CategoryService getCategoryService() { return categoryService; } public void setCategoryService(CategoryService categoryService) { this.categoryService = categoryService; } public Integer getCategoryId() { return categoryId; } public void setCategoryId(Integer categoryId) { this.categoryId = categoryId; } }package com.yangchenhui.action; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionSupport; import com.yangchenhui.model.Category; import com.yangchenhui.service.CategoryService; public class CategoryEditAction extends ActionSupport { private static final long serialVersionUID = 1L; private CategoryService categoryService; private String categoryOneLevelValue; private Integer categoryId; @Override public String execute() throws Exception { Category category = categoryService.findCategoryById(categoryId); category.setCategoryName(categoryOneLevelValue); if(!categoryService.queryCategoryByCategoryName(categoryOneLevelValue)){ categoryService.editCategory(category); } return Action.SUCCESS; } public CategoryService getCategoryService() { return categoryService; } public void setCategoryService(CategoryService categoryService) { this.categoryService = categoryService; } public Integer getCategoryId() { return categoryId; } public void setCategoryId(Integer categoryId) { this.categoryId = categoryId; } public String getCategoryOneLevelValue() { return categoryOneLevelValue; } public void setCategoryOneLevelValue(String categoryOneLevelValue) { this.categoryOneLevelValue = categoryOneLevelValue; } }
L: 编写CategoryService和CategoryServiceImplpackage com.yangchenhui.service; import java.util.List; import com.yangchenhui.model.Category; public interface CategoryService { /** * 得到所有的category * @return */ public List<Category> queryAllCategory(); /** * 得到所有的一级的父节点 * @return */ public List<Category> queryOneLevelParentsCategory(); /** * 根据父亲的id号得到父类别的所有的自类别 * @param parentId * @return */ public List<Category> queryChildrenCategoryByParentId(Integer parentId); /** * 添加一级节点 */ public void addOneLevelCategory(Category category); /** * 根据categoryId查找类别 * @param categoryId * @return */ public Category findCategoryById(Integer categoryId); /** * 更新类别 * @param category */ public void editCategory(Category category); /** * 删除一个类别,如果有任何的子类被,也将其删除 * @param categoryId */ public void deleteCategory(Integer categoryId); /** * 向父类别parentCategory中添加一个自类别 * @param parentCategoryId * @param childCategory */ public void addCategoryToParent(Integer parentCategoryId, Category childCategory); /** * 根据类别的名称去得到类别,查询是否有这个类别的名称 * @param categoryName */ public boolean queryCategoryByCategoryName(String categoryName); /** * 查询一个category是否具有子节点 * @param categoryId * @return */ public boolean hasChildren(Integer categoryId); }
[code ="java"]
package com.yangchenhui.service;
import java.util.List;
import com.yangchenhui.dao.CategoryDAO;
import com.yangchenhui.model.Category;
public class CategoryServiceImpl implements CategoryService {
private CategoryDAO categoryDAO;
@SuppressWarnings("unchecked")
@Override
public List<Category> queryAllCategory() {
return categoryDAO.findAll();
}
public CategoryDAO getCategoryDAO() {
return categoryDAO;
}
public void setCategoryDAO(CategoryDAO categoryDAO) {
this.categoryDAO = categoryDAO;
}
@SuppressWarnings("unchecked")
@Override
public List<Category> queryChildrenCategoryByParentId(Integer parentId) {
return this.categoryDAO.findByProperty("category", this.categoryDAO.findById(parentId));
}
@SuppressWarnings("unchecked")
@Override
public List<Category> queryOneLevelParentsCategory() {
return this.categoryDAO.findByProperty("depth", 1);
}
@Override
public void addOneLevelCategory(Category category) {
this.categoryDAO.save(category);
}
@Override
public Category findCategoryById(Integer categoryId) {
return this.categoryDAO.findById(categoryId);
}
@Override
public void editCategory(Category category) {
this.categoryDAO.attachDirty(category);
}
@Override
public void deleteCategory(Integer categoryId) {
this.categoryDAO.deleteCategoryByParentId(categoryId);
this.categoryDAO.delete(this.categoryDAO.findById(categoryId));
}
@Override
public void addCategoryToParent(Integer parentCategoryId,
Category childCategory) {
Category parentCategory = this.categoryDAO.findById(parentCategoryId);
childCategory.setDepth(parentCategory.getDepth()+1);
childCategory.setCategory(parentCategory);
this.categoryDAO.save(childCategory);
}
@Override
public boolean queryCategoryByCategoryName(String categoryName) {
List<Category> categories = this.categoryDAO.findByCategoryName(categoryName);
if(categories.size()==0){
return false;
}else{
return true;
}
}
@Override
public boolean hasChildren(Integer categoryId) {
List<Category> children = this.categoryDAO.findByProperty("category", this.categoryDAO.findById(categoryId));
if(children.size()==0){
return false;
}else{
return true;
}
}
}
M:applicationContext.xml的配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd " > <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"> </property> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> <bean id="categoryDAO" class="com.yangchenhui.dao.CategoryDAOImpl"> <property name="hibernateTemplate"> <ref bean="hibernateTemplate"/> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> <tx:advice transaction-manager="transactionManager" id="txAdvice"> <tx:attributes> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="serviceMethods" expression="execution(* com.yangchenhui.service.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/> </aop:config> <bean id="categoryService" class="com.yangchenhui.service.CategoryServiceImpl"> <property name="categoryDAO" ref="categoryDAO"/> </bean> <bean id="categoryFindAllAction" class="com.yangchenhui.action.CategoryFindAllAction" scope="prototype"> <property name="categoryService" ref="categoryService"/> </bean> <bean id="categoryAddAction" class="com.yangchenhui.action.CategoryAddAction" scope="prototype"> <property name="categoryService" ref="categoryService"/> </bean> <bean id="categoryEditAction" class="com.yangchenhui.action.CategoryEditAction" scope="prototype"> <property name="categoryService" ref="categoryService"/> </bean> <bean id="categoryDeleteAction" class="com.yangchenhui.action.CategoryDeleteAction" scope="prototype"> <property name="categoryService" ref="categoryService"/> </bean> <bean id="categoryChildAddAction" class="com.yangchenhui.action.CategoryChildAdd" scope="prototype"> <property name="categoryService" ref="categoryService"/> </bean> </beans>
N: 结束:

M:源码:
评论
2 楼
TJYCHYANGCHENHUI
2012-04-24
jackyrong 写道
最好提供代码下载参考吧,另外强烈推荐一个国产的ZTREE,树的,功能很强大
建议参考
建议参考
谢谢你的提供,因为jar包大于10m所以就没有上传,但是源码我上传在了csdn上面 url[url]
http://download.csdn.net/detail/tjychyangchenhui/4245836
[/url]
1 楼
jackyrong
2012-04-21
最好提供代码下载参考吧,另外强烈推荐一个国产的ZTREE,树的,功能很强大
建议参考
建议参考
相关推荐
本项目“s2sh+freemarker+jquery+jquery-treeview 无限级树形菜单”就是这样一个解决方案,它整合了多种技术来实现这一功能。 首先,我们来看“s2sh”。这是Struts2、Spring和Hibernate三者的简称,它们分别是MVC...
好久没用S2SH做东西了,闲来没事做了一个jQuery Tree 的Demo 支持无限级分类,异步加载数据,通过这个小程序可以了解一下jQuery动态加载数据的技巧,顺便复习了一下S2SH(struts2+spring+hiber)。
用的东西比较杂,主要为了学习一下知识呵呵: ssh2、dwr、jquery、extjs、jquery weekcalendar、jfreechart、jasperreport 联系人实现了拖动实现好友分组。可以把grid直接拖到tree,不同于其他的例子,拖动grid后会...
ZTree是一款基于jQuery的树形插件,它具有丰富的功能和良好的可扩展性,常用于构建网站的导航菜单、文件目录展示等场景。在"ZTree 异步加载 SSH JSON"这个主题中,我们将深入探讨如何利用ZTree实现异步加载数据,并...
Dify智能体:JSON 修复.yml
陕西省2025年初中学业水平考试实验操作考试试题及评分细则.zip
内容概要:本文详细介绍了西门子S7-1200 PLC在污水处理项目中的应用,涵盖模拟量处理、设备轮换、Modbus通讯以及事件记录等多个方面。文中展示了如何利用博途V17进行程序设计,包括具体的SCL代码实例,如液位检测的滑动窗口滤波法、提升泵的轮换逻辑、Modbus TCP对变频器的控制以及报警信息管理等。此外,还分享了一些实用技巧,如防止信号跳变、避免设备过度磨损、确保通讯稳定性和提高报警记录效率的方法。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉西门子PLC和博途软件的从业者。 使用场景及目标:适用于污水处理项目的PLC编程和系统集成,旨在提高系统的稳定性和可靠性,减少维护成本并优化设备性能。 其他说明:文中不仅提供了详细的代码示例,还分享了许多来自实际项目的经验教训,帮助读者更好地理解和应用相关技术。
内容概要:本文详细介绍了基于PLC(西门子S7-1200)的自动药片装瓶机控制系统的设计与仿真过程。涵盖了硬件选型(伺服电机、光电传感器)、软件编程(梯形图、结构化文本)、关键算法(传送带定位、振动盘控制、药片计数)、异常处理以及仿真测试等方面的内容。重点讨论了如何通过精确的硬件配置和优化的控制逻辑来确保系统的稳定性和高效性。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和机电一体化感兴趣的读者。 使用场景及目标:适用于制药行业及其他需要自动化包装设备的企业。主要目标是提高生产效率、减少人工干预、提升产品质量和稳定性。 其他说明:文中提供了大量实际案例和调试经验,帮助读者更好地理解和应用相关技术和方法。同时强调了仿真测试的重要性,为后续的实际部署提供了宝贵的经验和改进建议。
内容概要:本文介绍了一种利用元启发式算法(如粒子群优化,PSO)优化线性二次调节器(LQR)控制器加权矩阵的方法,专门针对复杂的四级倒立摆系统。传统的LQR控制器设计中,加权矩阵Q的选择往往依赖于经验和试错,而这种方法难以应对高维度非线性系统的复杂性。文中详细描述了如何将控制器参数优化问题转化为多维空间搜索问题,并通过MATLAB代码展示了具体实施步骤。关键点包括:构建非线性系统的动力学模型、设计适应度函数、采用对数缩放技术避免局部最优、以及通过实验验证优化效果。结果显示,相比传统方法,PSO优化后的LQR控制器不仅提高了稳定性,还显著减少了最大控制力,同时缩短了稳定时间。 适合人群:控制系统研究人员、自动化工程专业学生、从事机器人控制或高级控制算法开发的技术人员。 使用场景及目标:适用于需要精确控制高度动态和不确定性的机械系统,特别是在处理多自由度、强耦合特性的情况下。目标是通过引入智能化的参数寻优手段,改善现有控制策略的效果,降低人为干预的需求,提高系统的鲁棒性和性能。 其他说明:文章强调了在实际应用中应注意的问题,如避免过拟合、考虑硬件限制等,并提出了未来研究方向,例如探索非对角Q矩阵的可能性。此外,还分享了一些实践经验,如如何处理高频抖动现象,以及如何结合不同类型的元启发式算法以获得更好的优化结果。
内容概要:本文详细介绍了LLC谐振变换器的设计方法及其仿真模型的应用。首先,通过参数设计程序,如Excel表格和Matlab脚本,进行关键参数的计算,确保设计符合预期性能。其次,利用Matlab/Simulink构建闭环控制仿真模型,优化PID控制器和PWM生成模块,提高系统的稳定性和响应速度。最后,提供了详细的模态分析和波形解读,帮助理解和规避常见设计陷阱。文中强调了参数选择的重要性,如电感比k值、死区时间和谐振元件的实际测量值,并分享了多个实战经验和调试技巧。 适合人群:从事电力电子设计的技术人员,尤其是对LLC谐振变换器感兴趣的工程师。 使用场景及目标:适用于需要高效、稳定的电源转换解决方案的研发项目。主要目标是掌握LLC谐振变换器的设计原理和技术要点,能够独立完成从参数计算到闭环调试的全过程。 其他说明:文中提供的工具和方法不仅有助于初学者快速入门,也能为有经验的工程师提供宝贵的参考资料。特别提到了一些容易忽视的细节和常见的错误,帮助读者避免不必要的损失。
内容概要:本文探讨了利用深度强化学习(DRL)解决现代电网复杂控制问题的方法,特别是针对自主电压控制(AVC)的应用。文中介绍了多智能体系统(MAS)与深度确定性策略梯度(MADDPG)相结合的MA-AVC算法,展示了如何将电网划分为多个子区域,每个子区域由一个智能体负责,通过集中训练和分散执行的方式进行电压控制。文章详细解释了智能体网络的设计、训练过程、奖励机制以及在伊利诺伊200总线系统上的实验验证。结果显示,相比传统方法,该算法在处理负荷突变、N-1故障和通信延迟等方面表现出显著优势。 适合人群:对深度强化学习、电力系统自动化感兴趣的科研人员和技术开发者,尤其是希望了解如何将AI应用于实际工业场景的研究者。 使用场景及目标:适用于需要提高电网稳定性和响应速度的实际应用场景,特别是在可再生能源接入和快速需求响应的要求下。目标是通过智能化手段提升电网的自适应能力和鲁棒性。 其他说明:文章提供了详细的代码示例和实验结果,帮助读者理解和复现相关算法。特别强调了奖励函数设计和电网仿真的重要性,指出了一些常见的实现陷阱及其解决方案。
内容概要:本文详细介绍了MIMO通信系统的三个重要方面:空间编码、系统容量计算以及信道特性仿真。首先探讨了Alamouti空时编码的具体实现方法及其在接收端的解码过程,展示了如何通过共轭转置排列实现分集增益。其次,深入讲解了MIMO系统容量公式的推导及其在Matlab中的高效实现,特别强调了使用奇异值分解提高数值稳定性的技巧。最后,讨论了信道矩阵的条件数对系统性能的影响,并提出了应对病态信道的方法如MMSE检测。 适合人群:具备一定通信理论基础和技术背景的研究人员、工程师及高校学生。 使用场景及目标:适用于希望深入了解MIMO通信系统内部机制的人群,帮助他们掌握空间编码、系统容量计算和信道建模的实际应用技能,为后续研究提供理论支持和技术储备。 其他说明:文中提供了大量实用的Matlab代码片段,便于读者快速理解和实践。同时提醒读者注意实际工程中可能遇到的问题,如数值稳定性、信道相关性和噪声增强等。
内容概要:本文档详细介绍了西门子PLC与意普测量光栅通过Modbus RTU协议进行通信的方法。硬件方面,使用了1214DC/DC/DC PLC、CB1214通讯板、ESM4810NQ-2测量光栅以及USB转485串口线缆等设备。软件部分采用博图V18进行编程,并利用调试助手modbuSCAN和sscom来辅助配置与测试。文中具体描述了创建MASTER_COMM_LOAD指令、添加MB_MASTER主站指令及轮询程序编写的步骤,包括详细的报文格式解析如站号、功能码、寄存器地址、内容及CRC校验码等信息。此外,还提供了针对光栅的初始化、波特率、奇偶校验和停止位等参数配置示例及其对应的报文解释。; 适合人群:熟悉PLC编程并希望深入了解Modbus通讯协议的应用工程师和技术人员。; 使用场景及目标:①实现PLC作为主站与测量光栅之间的稳定通信;②掌握Modbus RTU协议的具体应用细节,包括报文结构的理解与配置;③解决实际项目中可能遇到的通信问题,如线路连接、参数设置等。; 阅读建议:建议读者在阅读时结合实际硬件设备进行操作练习,同时注意文中提到的一些常见问题及其解决方案,如线序连接错误导致的乱码现象等。
内容概要:本文详细介绍了基于Qt的Modbus协议开发,涵盖协议原理、Qt框架支持、开发流程、代码示例及常见问题解决方案。Modbus协议支持串行通信(RTU/ASCII)和以太网(TCP/IP)两种传输方式,具有功能码定义、数据模型和通信模式等核心功能。Qt通过Qt Serial Bus模块提供对Modbus的支持,主要类有QModbusDevice、QModbusClient(含QModbusTcpClient和QModbusRtuSerialMaster)、QModbusDataUnit和QModbusReply。开发环境配置需在Qt项目的.pro文件中添加相应模块,并准备硬件设备。文中给出了Modbus客户端(TCP)的连接、读取和写入寄存器的代码示例,以及Modbus服务器的实现步骤。还列举了常见的问题与调试技巧,包括通讯不稳定、数据异常和性能优化的方法。最后介绍了该技术在工业自动化、能源管理和智能家居的应用场景。; 适合人群:具备一定Qt编程基础,对工业通信协议感兴趣的开发者。; 使用场景及目标:①学习Modbus协议的基本原理及其在Qt中的实现方法;②掌握Qt Modbus框架的核心类及其用法;③能够独立开发Modbus客户端和服务器程序,解决常见问题。; 阅读建议:本文内容详实,涉及多个知识点和技术细节,在阅读过程中应结合实际开发环境进行实践操作,以便更好地理解和掌握相关技术。
本书《SEO for Beginners 2021》旨在向读者介绍如何使用搜索引擎优化(SEO)技术,在谷歌上提升网站排名,吸引新客户,从而实现业务增长。作者加里·戈丁和阿伦·肯尼迪通过实例和策略指导,帮助读者了解SEO的基础知识,包括关键词研究、网站设置、链接构建、社交媒体SEO优化以及如何使用谷歌分析工具来监控SEO效果。书中还特别强调了SEO在商业世界中的重要性,并提供了在谷歌广告平台上进行有效广告投放的技巧和策略。此外,作者还分享了如何通过解决SEO常见问题、设置广告账户、撰写广告文案、创建着陆页以及监控转化率等方法,进一步优化搜索引擎营销效果。
内容概要:本文详细介绍了利用混沌系统进行图像加密的方法,重点探讨了Logistic映射生成混沌序列用于图像加密的具体实现。首先,通过Python代码生成混沌序列,确保其随机性和不可预测性。然后,采用循环移位扰乱技术对图像像素进行重新排列,使图像的像素位置发生改变。接着,通过水平和垂直扩散技术进一步打乱像素之间的关联性,增加加密强度。文中还展示了加密效果评估方法,如直方图分析、信息熵计算以及相关系数测量,验证了加密算法的有效性。 适合人群:对图像加密技术和混沌系统感兴趣的科研人员、信息安全专家及有一定编程基础的研究者。 使用场景及目标:适用于需要高强度图像加密保护的场合,如军事、医疗等领域的重要图像资料保护。目标是提供一种高效、安全的图像加密解决方案。 其他说明:文中提供了详细的Python代码示例,便于读者理解和实践。同时强调了实际应用中需要注意的问题,如参数选择和性能优化等。
内容概要:本文详细介绍了利用FLAC3D软件进行双线隧道开挖和临近既有隧道的基坑开挖的数值模拟方法和技术要点。首先,针对隧道开挖部分,采用反力支撑法控制应力释放,并使用shell壳单元模拟喷射混凝土支护结构。其次,在基坑开挖过程中,采用了地连墙加对撑的方式,分层开挖并及时安装水平对撑。文中还提供了多个关键代码片段,展示了具体的实现步骤。此外,文章强调了监测点数据采集和处理的重要性,以及如何通过调整接触面参数解决潜在问题。最后,作者分享了一些实用技巧,如固定云图色标范围、正确设置接触面摩擦系数等。 适合人群:从事地下工程、岩土工程及相关领域的研究人员和工程师。 使用场景及目标:适用于需要进行复杂地质条件下隧道和基坑开挖数值模拟的研究人员和工程师,旨在帮助他们更好地理解和掌握FLAC3D软件的应用,提高模拟精度和效率。 其他说明:文章不仅提供了详细的代码示例,还结合实际案例进行了深入分析,有助于读者将理论知识应用于实际工程项目中。
实现多数据类型的传输
内容概要:《2024年中国物联网产业创新白皮书》由深圳市物联网产业协会与AIoT星图研究院联合编制,汇集了全国30多个省市物联网组织的智慧。白皮书系统梳理了中国物联网产业的发展历程、现状及未来趋势,涵盖了物联网的概念、产业结构、市场规模、投融资情况、面临的问题与机遇。书中详细分析了感知层、传输层、平台层及应用层的关键技术,探讨了智慧城市、智能工业、车联网、智慧医疗等九大产业物联网应用领域,以及消费物联网的发展特征与热门单品。此外,白皮书还关注了物联网数据安全、法规遵从、人才短缺等挑战,并提出了相应的解决方案。 适用人群:物联网从业者、企业决策者、政策制定者及相关研究机构。 使用场景及目标:①帮助从业者深入了解物联网产业的现状和发展趋势;②为企业决策者提供战略规划依据;③为政策制定者提供政策支持和法规制定参考;④为研究机构提供详尽的数据和案例支持。 其他说明:白皮书不仅限于技术科普,更从宏观角度结合市场情况,多维度讨论了物联网产业生态,旨在为物联网企业、从业者找到最适合的技术应用场景,促进产业健康发展。报告还特别鸣谢了参与市场调研的企业,感谢他们提供的宝贵行业信息。由于时间和资源的限制,报告可能存在信息不充分之处,欢迎各界人士提出宝贵意见。
内容概要:本文介绍了如何利用Simulink实现‘质心侧偏角-横摆角速度’相平面法,用于分析车辆的动力学行为。作者详细描述了模型的构建过程,包括输入模块、车辆动力学模型以及相平面生成模块的设计。通过调整车辆速度、路面附着系数和前轮转角等参数,可以直观地观察到车辆稳定性的变化。此外,文中还提供了详细的代码示例和结果分析,帮助读者更好地理解和应用这一方法。 适合人群:对车辆动力学感兴趣的工程师和技术人员,特别是那些希望通过Simulink进行车辆稳定性分析的人。 使用场景及目标:适用于需要评估车辆在不同行驶条件下稳定性的场合,如汽车制造商的研发部门、交通安全研究机构等。目标是通过相平面法直观展示车辆动态响应,辅助优化车辆设计和改进驾驶安全性能。 其他说明:附带完整代码和Simulink模型文件,便于读者动手实践。同时,文中提到的一些调试技巧和常见问题解决方法也非常有价值。