首页 > 代码库 > ztree使用系列三(ztree与springmvc+spring+mybatis整合实现增删改查)

ztree使用系列三(ztree与springmvc+spring+mybatis整合实现增删改查)

       在springmvc+spring+mybatis里整合ztree实现增删改查,上一篇已经写了demo,下面就只贴出各层实现功能的代码:

Jsp页面实现功能的js代码如下:

<script>
      //用于捕获分类编辑按钮的 click 事件,并且根据返回值确定是否允许进入名称编辑状态
     function beforeEditName(treeId, treeNode) {
            var zTree = $.fn.zTree.getZTreeObj("treeDemo");
            zTree.selectNode(treeNode);
            return true;
     }
      //移除分类前执行
     function beforeRemove(treeId, treeNode) {
            var zTree = $.fn.zTree.getZTreeObj("treeDemo");
            zTree.selectNode(treeNode);
            var confirmFlag = confirm("确认删除分类[ " + treeNode.name + " ]吗?" )
            var confirmVal = false;
            if(confirmFlag){
                 var data = {id:treeNode.id};
                $.ajax({
                     async: false,
                     type: "post",
                     data:data,
                     url: "<%=request.getContextPath() %>/library/deleteLibrary/ ",
                     success: function(json){
                            if(json == "success" ){
                                confirmVal = true;
                           } else{
				alert('亲,删除失败!');
                           }
                     },
                     error: function(){
                           alert('亲,删除失败!');
                     }
                });
           }
            return confirmVal;
     }
      //执行删除操作后提示
     function onRemove(e, treeId, treeNode) {
           alert('亲,删除成功!');
     }
      //用于捕获分类编辑名称结束(Input 失去焦点 或 按下 Enter 键)之后,更新分类名称数据之前的事件回调函数
     function beforeRename(treeId, treeNode, newName) {
            if (newName.length == 0 || newName.indexOf("请输入名称")>=0) {
		 alert('亲,请输入分类名称!');
                 var zTree = $.fn.zTree.getZTreeObj("treeDemo");
                 setTimeout( function(){zTree.editName(treeNode)}, 10);
                 return false;
           }
            if(newName.length > 15){
		alert('亲,分类名称过长!');
                var zTree = $.fn.zTree.getZTreeObj("treeDemo");
                setTimeout( function(){zTree.editName(treeNode)}, 10);
                return false;
           }
           native_name = treeNode.name;
           return true;
     }
      //执行编辑操作
     function onRename(e, treeId, treeNode) {
            if(native_name == treeNode.name){
                 return;
            }
            var data = {id:treeNode.id,level_id:treeNode.level,pid:treeNode.pId,name:treeNode.name};
            $.ajax({
                async: false,
                type: "post",
                data:data,
                url: "<%=request.getContextPath() %>/library/updateLibraryName/ ",
                success : function(json){
                      if(json == "success" ){
			   alert('操作成功!');
                     } else{
			   alert('亲,操作失败,请稍后再试!');
                     }
                },
                error : function()    {
		     alert('亲,网络有点不给力呀!');
                }
           });
     }
     
      //添加子分类
     function addHoverDom(treeId, treeNode) {
            var sObj = $("#" + treeNode.tId + "_span");
            if (treeNode.editNameFlag || $("#addBtn_" +treeNode.tId).length>0 || treeNode.level == 3) return;
            var addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='添加分类' onfocus='this.blur();'></span>";
            sObj.after(addStr);
            var btn = $("#addBtn_" +treeNode.tId);
            if (btn) btn.bind("click" , function(){
                 var zTree = $.fn.zTree.getZTreeObj("treeDemo");
                 var treeNodes;
                $.ajax({
                     async: false,
                     type: "post",
                     url: "<%=request.getContextPath() %>/library/saveLibrary/ ",
                     success : function(libraryId){
                            if(libraryId != "" ){
                                treeNodes = zTree.addNodes(treeNode, {id:(libraryId), pId:treeNode.id, name:"请输入名称" });
                           }
                            if (treeNodes) {
                                zTree.editName(treeNodes[0]);
                           }
                     },
                     error : function(){
                           alert('亲,网络有点不给力呀!');
                     }
                });
                 return false;
           });
     }
      //父级分类去除删除功能
     function setRemoveBtn(treeId, treeNode) {
        return !treeNode.isParent;
     }
     
      //鼠标移开按钮消失
     function removeHoverDom(treeId, treeNode) {
           $( "#addBtn_"+treeNode.tId).unbind().remove();
     };
     
      //添加按钮点击事件
     function addClick(){
           $( "#addParent").bind("click" , {isParent:true}, add);
     }

      //移除分类
     function remove(e) {
            var zTree = $.fn.zTree.getZTreeObj("treeDemo"),
           nodes = zTree.getSelectedNodes(),
           treeNode = nodes[0];
            if (nodes.length == 0) {
                 alert( "亲,请先选择一个分类!" );
                 return;
           }
            var callbackFlag = $("#callbackTrigger" ).attr("checked");
           zTree.removeNode(treeNode, callbackFlag);
     };
     
      //展开全部分类
     function expandAllFlag(){
           zTree_Menu.expandAll( true);
     }
      //合并全部分类
     function combineAllFlag(){
           zTree_Menu.expandAll( false);
     }
     
      //加载ztree
     function onl oadZTree(){
            var ztreeNodes;
           $.ajax( {
                async : true, //是否异步
                cache : false, //是否使用缓存
                type : 'post', //请求方式,post
                dataType : "json", //数据传输格式
                url : "<%=request.getContextPath() %>/library/findAllLibrary/ ", //请求链接
                error : function() {
                     alert('亲,网络有点不给力呀!');
                },
                success : function(data) {
                     ztreeNodes = eval( "["+data+"]" ); //将string类型转换成json对象
                     $.fn.zTree.init($( "#treeDemo"), setting, ztreeNodes);
                     zTree_Menu = $.fn.zTree.getZTreeObj("treeDemo" );
                     $( "#selectAll").bind("click" , selectAll);
                     expandAllFlag();
                     addClick();
                }
           });
     }
     
      //初始化操作
     $(document).ready( function(){
           onl oadZTree();
     });
</script>

备注:后台传过来的json数据一定执行这个操作:eval( "["+data+"]" ) 将string转换为对象

Controller层代码如下:

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping(value=http://www.mamicode.com/"library/")>

service层代码如下:

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class LibraryService {
     protected final static Log log = LogFactory.getLog(LibraryService.class);
    
     @Autowired
     private LibraryMapper libraryMapper;
    
     /**
     * 查询所有分类信息
     * @return
     */
     public List<Object> findAllLibrary(){
          List<Object> listZTree = new ArrayList<Object>();
          List<Library> listLibrary  = libraryMapper.findAllLibrary();
          String str = "";
          for (int i = 0; i < listLibrary.size(); i++) {
               Library  library = listLibrary.get(i);//分类信息
               str = "{id:'" +library.getId() + "', pId:'"+library.getPid()+"', name:\""+library.getName()+"\" }";//封装ztree需要格式的字符串
               log.info(str);
               listZTree.add(str);
          }
          return listZTree;
     }
    
     /**
     * 保存或更新分类信息
     * @param library
     * @return
     */
     public String addOrUpdateLibrary(Library library){
          int numFlag = 0;
          //根据id查询分类信息
          if (StringUtils.isBlank(library.getId())) {
               return "error";
          }
          int num = libraryMapper.findLibraryById(library.getId());
          if (num >0) {//更新信息
               library.setUpdate_time(new Date());
               library.setCreate_user(null);
               library.setPid(null);
               numFlag = libraryMapper.updateByPrimaryKeySelective(library);
          }else{//插入信息
               if(library.getPid().equals("null")){
                    library.setPid("0");
               }
               int orderId = libraryMapper.findLastLibrary(library);
               orderId++;
               library.setCreate_time(new Date());
               library.setUpdate_time(new Date());
               library.setOrder_id(orderId);
               numFlag = libraryMapper.insert(library);
          }
          return  "success";
     }
    
     /**
     * 删除分类
     * @param id
     * @return
     */
     public String deleteLibrary(String id){
          int num = libraryMapper.deleteByPrimaryKey(id);
          return  "success";
     }
    
}
备注:执行完数据操作需要判断返回值,这里我直接返回success活error了。

Mapper层代码如下

import java.util.List;
import java.util.Map;

public interface LibraryMapper extends BaseMapper<Library,String>{
  
     /**
     * 查询所有分类信息
     * @return
     */
     public List<Library> findAllLibrary();
    
    
     /**
     * 根据id查询条数
     * @param id
     * @return
     */
     public int findLibraryById(String id);
    
     /**
     * 查询最大排序号
     * @return
     */
     public int findLastLibrary(Library library);

}
备注:BaseMapper里有几个公用的增删改查的方法,Library是数据库表对应的实体,都很简单,避免代码过多这里就省略了

<?xml version="1.0" encoding= "UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace= "LibraryMapper" >
  < resultMap id= "BaseResultMap" type= "Library" >
    <id column ="id" property="id" jdbcType= "VARCHAR" />
    <result column ="pid" property="pid" jdbcType= "VARCHAR" />
    <result column ="name" property="name" jdbcType= "VARCHAR" />
    <result column ="create_time" property="create_time" jdbcType= "TIMESTAMP" />
    <result column ="update_time" property="update_time" jdbcType= "TIMESTAMP" />
    <result column ="is_delete" property="is_delete" jdbcType= "INTEGER" />
    <result column ="update_user" property="update_user" jdbcType= "VARCHAR" />
    <result column ="create_user" property="create_user" jdbcType= "VARCHAR" />
    <result column ="level_id" property="level_id" jdbcType= "INTEGER" />
    <result column ="order_id" property="order_id" jdbcType= "INTEGER" />
  </ resultMap>
  < sql id= "Base_Column_List" >
    id, pid , name, create_time, update_time, is_delete, update_user, create_user, level_id,
    order_id
  </ sql>

  <!-- 根据id查询分类信息是否存在 -->
  < select id= "findLibraryById" parameterType ="java.lang.String" resultType= "java.lang.Integer" >
     select count(*) from onair_vms_library
     where is_delete=1 and id = #{id,jdbcType=VARCHAR}
  </ select>
  <!-- 根据 pid查询最大排序号 -->
  < select id= "findLastLibrary" resultType ="java.lang.Integer" parameterType="Library" >
     SELECT MAX(order_id) as order_id  FROM onair_vms_library
     where pid = #{pid,jdbcType=VARCHAR}
  </ select>
  <!-- 查询所有分类信息 -->
  < select id= "findAllLibrary" resultMap ="BaseResultMap">
     select
     <include refid ="Base_Column_List"/>
     from onair_vms_library
     where is_delete = 1 order by order_id
  </ select>
 
  < select id= "selectByPrimaryKey" resultMap ="BaseResultMap" parameterType="java.lang.String" >
    select
    <include refid ="Base_Column_List" />
    from onair_vms_library
    where id = #{id,jdbcType=VARCHAR}
  </ select>
  < delete id= "deleteByPrimaryKey" parameterType="java.lang.String" >
    update  onair_vms_library set is_delete = 0
    where id = #{id,jdbcType=VARCHAR}
  </ delete>
  < insert id= "insert" parameterType="Library" >
    insert into onair_vms_library (id, pid, name,
      create_time, update_time, is_delete,
      update_user, create_user, level_id,
      order_id)
    values (#{id,jdbcType=VARCHAR}, #{pid,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR},
      #{create_time,jdbcType=TIMESTAMP}, #{update_time,jdbcType=TIMESTAMP}, #{is_delete,jdbcType=INTEGER},
      #{update_user,jdbcType=VARCHAR}, #{create_user,jdbcType=VARCHAR}, #{level_id,jdbcType=INTEGER},
      #{order_id,jdbcType=INTEGER})
  </ insert>
  < update id= "updateByPrimaryKey" parameterType="Library" >
    update onair_vms_library
    set pid = #{pid,jdbcType=VARCHAR},
      name = #{name,jdbcType=VARCHAR},
      create_time = #{create_time,jdbcType=TIMESTAMP},
      update_time = #{update_time,jdbcType=TIMESTAMP},
      is_delete = #{is_delete,jdbcType=INTEGER},
      update_user = #{update_user,jdbcType=VARCHAR},
      create_user = #{create_user,jdbcType=VARCHAR},
      level_id = #{level_id,jdbcType=INTEGER},
      order_id = #{order_id,jdbcType=INTEGER}
    where id = #{id,jdbcType=VARCHAR}
  </ update>
</mapper>
备注:mapper对应的xml

与jsp对应的VO层代码如下:

public class LibraryVo {

     /*  id      */
     private String id;
     /*  目标id  */
     private String targetId;
     /*  pid     */
     private String pId;
     /*  目标pid      */
     private String targetPId;
     /*  "inner":成为子节点,"prev":成为同级前一个节点,"next":成为同级后一个节点  */
     private String moveType;

     public String getId() {
            return id;
     }

     public void setId(String id) {
            this. id = id;
     }

     public String getTargetId() {
            return targetId;
     }

     public void setTargetId(String targetId) {
            this. targetId = targetId;
     }

     public String getpId() {
            return pId;
     }

     public void setpId(String pId) {
            this. pId = pId;
     }

     public String getTargetPId() {
            return targetPId;
     }

     public void setTargetPId(String targetPId) {
            this. targetPId = targetPId;
     }

     public String getMoveType() {
            return moveType;
     }

     public void setMoveType(String moveType) {
            this. moveType = moveType;
     }
     
}


上面的代码实现了基本的增删改查,有哪些地方有问题欢迎指正,也欢迎交流,每一次的进步都离不开大家的帮助。