首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

Spring MVC + Mybatis + zTee 兑现一个可增、删、改的无限级树

2013-08-01 
Spring MVC + Mybatis + zTee 实现一个可增、删、改的无限级树Spring MVC + Mybatis + zTee 实现一个可增、删

Spring MVC + Mybatis + zTee 实现一个可增、删、改的无限级树

Spring MVC + Mybatis + zTee 实现一个可增、删、改的无限级树

?

这两天帮老师做了树的增加、删除、修改的功能,查阅了不少资料,在这里分享下一些心得体会。

在这里我选用的是Spring MVC3.2.3 + Mybatis3.2.2 + zTree3.5.14

?

一:数据库的设计

数据库用的是SQLServer 2008(老师让用SQLServer,郁闷.....)

? ? 数据库名:tree,目前就一张表:menuitem

? ? 表很简单目前就三个字段(mid int primary,pid int,name varchar)

? ? 初始一个值为(1,0,‘地块管理’)

?

二:实体类的设计

? Menuitem.java

?

package cn.edu.ayit.domain;import java.io.Serializable;public class Menuitem implements Serializable {private static final long serialVersionUID = -3997052531750898095L;private Integer mid;private Integer pid;private String name;//省略getter/setter方法}

?

三:项目配置?(一)web.xml配置

此处我采用的是用类代替配置文集方式

自定义了一个类 MyWebApplicationInitializer继承MyWebApplicationInitializer

?

MyWebApplicationInitializer.java

?

package cn.edu.ayit.init;import java.util.EnumSet;import javax.servlet.DispatcherType;import javax.servlet.FilterRegistration;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletRegistration;import org.springframework.web.WebApplicationInitializer;import org.springframework.web.context.ContextLoaderListener;import org.springframework.web.filter.CharacterEncodingFilter;import org.springframework.web.servlet.DispatcherServlet;public class MyWebApplicationInitializer implements WebApplicationInitializer {@Overridepublic void onStartup(ServletContext servletContext) throws ServletException {//spring监听器servletContext.addListener(ContextLoaderListener.class);servletContext.setInitParameter("contextConfigLocation", "classpath:applicationContext.xml");//spring MVC DispatcherServletServletRegistration.Dynamic servletRegistration = servletContext.addServlet("dispatcherServlet", DispatcherServlet.class);servletRegistration.setInitParameter("contextConfigLocation", "classpath:dispatcherServlet-servlet.xml");servletRegistration.setLoadOnStartup(1);servletRegistration.addMapping("/");//spring MVC 内置字符乱码过滤器FilterRegistration.Dynamic filterRegistration = servletContext.addFilter("characterEncodingFilter", CharacterEncodingFilter.class);filterRegistration.setInitParameter("encoding", "UTF-8");filterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");}}

?

?

?

(二) Spring配置

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:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.2.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.2.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">        <!-- 此处用的是Druid数据源 --><bean id="dataSource" init-method="init" destroy-method="close"><!-- <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> --><property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=tree"/><property name="username" value="sa"/><property name="password" value=""/></bean><context:component-scan base-package="cn.edu.ayit"/><mvc:annotation-driven/><bean id="sqlSessionFactory" ref="dataSource"/><property name="configLocation" value="classpath:sqlMapConfig.xml"/></bean><bean id="transactionManager" ref="dataSource"/></bean><tx:annotation-driven transaction-manager="transactionManager"/><bean id="sqlSessionTemplate" ref="sqlSessionFactory"/></bean></beans>

?

?

(三)Spring MVC配置dispatcherServlet-servlet.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:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"><!-- 配置默认视图解析器 --><bean value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean><!-- 配置不拦截静态文件 --><mvc:default-servlet-handler/></beans>

?

(四)Mybatis配置

sqlMapConfig.xml

?

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><typeAliases><typeAlias type="cn.edu.ayit.domain.Menuitem" alias="Menuitem" /><!-- 可以用下面的方式自动扫描或者在实体类上@Alias注解 --><!-- <package name="cn.edu.ayit.domain"/> --></typeAliases><mappers><mapper resource="cn/edu/ayit/domain/MenuitemMapper.xml" /></mappers></configuration>

?MenuitemMapper.xml

?

?

<?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="cn.edu.ayit.domain.Menuitem"><cache/><resultMap type="Menuitem" id="menuitemResult"><id property="mid" column="m_mid" /><result property="pid" column="m_pid" /><result property="name" column="m_name" /></resultMap><sql id="columns">mid,pid,name</sql><sql id="columnsAlias">mid m_mid,pid m_pid,name m_name</sql><select id="getAll" resultMap="menuitemResult">select <include refid="columnsAlias"/> from menuitem</select><select id="getMax" resultType="java.lang.Integer">select max(mid) from menuitem</select><update id="update" parameterType="Menuitem">update menuitem<set><if test="pid != null">pid = #{pid},</if><if test="name != null">name = #{name}</if></set>where mid = #{mid}</update><insert id="insert" parameterType="Menuitem">insert into menuitem(<include refid="columns"/>) values(#{mid},#{pid},#{name})</insert><delete id="deleteById" parameterType="java.lang.Integer">delete from menuitem where mid = #{mid}</delete></mapper>

?

?

?

四:DAO层的设计

考虑到后来会做其它功能,所有先把整体架构搭建好,设计了一个公用的接口BaseDao和其实现类BaseDaoImpl

?

? BaseDao.java

?

package cn.edu.ayit.dao;import java.io.Serializable;import java.util.Collection;public interface BaseDao<T> {public abstract void insert(T t);public abstract void delete(T t);public abstract void deleteById(Serializable id);public abstract void update(T t);public abstract T getById(Serializable id);public abstract Collection<T> getAll();}

?

?

? BaseDaoImpl.java

?

package cn.edu.ayit.dao.impl;import java.io.Serializable;import java.lang.reflect.ParameterizedType;import java.util.Collection;import javax.annotation.Resource;import org.mybatis.spring.SqlSessionTemplate;import cn.edu.ayit.dao.BaseDao;public class BaseDaoImpl<T> implements BaseDao<T> {protected Class<T> clazz;public BaseDaoImpl() {ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass();this.clazz = (Class<T>) parameterizedType.getActualTypeArguments()[0];}@Resource(name="sqlSessionTemplate")protected SqlSessionTemplate sqlSessionTemplate;@Overridepublic void insert(T t) {this.sqlSessionTemplate.insert(this.clazz.getName() + ".insert", t);}@Overridepublic void delete(T t) {this.sqlSessionTemplate.delete(this.clazz.getName() + ".delete", t);}@Overridepublic void deleteById(Serializable id) {this.sqlSessionTemplate.delete(this.clazz.getName() + ".deleteById", id);}@Overridepublic void update(T t) {this.sqlSessionTemplate.update(this.clazz.getName() + ".update", t);}@Overridepublic T getById(Serializable id) {return this.sqlSessionTemplate.selectOne(this.clazz.getName() + ".getById", id);}@Overridepublic Collection<T> getAll() {return this.sqlSessionTemplate.selectList(this.clazz.getName() + ".getAll");}}

?

这样一来写其它的实体类的DAO都将非常简单

MenuitemDao.java

?

package cn.edu.ayit.dao;import cn.edu.ayit.domain.Menuitem;public interface MenuitemDao extends BaseDao<Menuitem> {public abstract Integer getMax();}

?MenuitemDaoImpl.java

?

?

package cn.edu.ayit.dao.impl;import org.springframework.stereotype.Repository;import cn.edu.ayit.dao.MenuitemDao;import cn.edu.ayit.domain.Menuitem;@Repository("menuitemDao")public class MenuitemDaoImpl extends BaseDaoImpl<Menuitem> implements MenuitemDao {@Overridepublic Integer getMax() {return this.sqlSessionTemplate.selectOne(this.clazz.getName() + ".getMax");}}

?

?

五:Service层的设计

Service层同样写一个公用接口BaseService和其实现类BaseServiceImpl

?

BaseService.java

?

package cn.edu.ayit.service;import java.io.Serializable;import java.util.Collection;public interface BaseService<T> {public abstract void insert(T t);public abstract void delete(T t);public abstract void deleteById(Serializable id);public abstract void update(T t);public abstract T getById(Serializable id);public abstract Collection<T> getAll();}

?BaseServiceImpl.java

?

?

package cn.edu.ayit.service.impl;import java.io.Serializable;import java.util.Collection;import org.springframework.transaction.annotation.Transactional;import cn.edu.ayit.dao.BaseDao;import cn.edu.ayit.service.BaseService;public abstract class BaseServiceImpl<T> implements BaseService<T> {        //谁继承BaseServiceImpl谁实现getDao()方法public abstract BaseDao<T> getDao();@Override@Transactionalpublic void insert(T t) {this.getDao().insert(t);}@Override@Transactionalpublic void delete(T t) {this.getDao().delete(t);}@Override@Transactionalpublic void deleteById(Serializable id) {this.getDao().deleteById(id);}@Override@Transactionalpublic void update(T t) {this.getDao().update(t);}@Overridepublic T getById(Serializable id) {return this.getDao().getById(id);}@Overridepublic Collection<T> getAll() {return this.getDao().getAll();}}

?

?

MenuitemService.java

?

package cn.edu.ayit.service;import cn.edu.ayit.domain.Menuitem;public interface MenuitemService extends BaseService<Menuitem> {public abstract Integer getMax();}

?MenuitemServiceImpl.java

?

?

package cn.edu.ayit.service.impl;import javax.annotation.Resource;import org.springframework.stereotype.Service;import cn.edu.ayit.dao.BaseDao;import cn.edu.ayit.dao.MenuitemDao;import cn.edu.ayit.domain.Menuitem;import cn.edu.ayit.service.MenuitemService;@Service("menuitemService")public class MenuitemServiceImpl extends BaseServiceImpl<Menuitem> implements MenuitemService {@Resource(name="menuitemDao")private MenuitemDao menuitemDao;public BaseDao<Menuitem> getDao() {return this.menuitemDao;}@Overridepublic Integer getMax() {return this.menuitemDao.getMax();}}

?

?

六:Controller层的设计

MenuitemController.java

?

package cn.edu.ayit.web.controller;import java.util.Collection;import javax.annotation.Resource;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import cn.edu.ayit.domain.Menuitem;import cn.edu.ayit.service.MenuitemService;@Controller("menuitemController")@RequestMapping("/menuitem")public class MenuitemController {@Resource(name="menuitemService")private MenuitemService menuitemService;@RequestMapping("/tree")public String tree() {return "tree";}@ResponseBody@RequestMapping("/getAll")public Collection<Menuitem> getAll() {return this.menuitemService.getAll();}@ResponseBody@RequestMapping("/getMax")public Integer getMax() {return this.menuitemService.getMax();}@RequestMapping("/update")public void update(Menuitem menuitem) {this.menuitemService.update(menuitem);}@RequestMapping("/insert")public void insert(Menuitem menuitem) {this.menuitemService.insert(menuitem);}@RequestMapping("/deleteById")public void deleteById(Integer mid) {this.menuitemService.deleteById(mid);}}

?

?

七:前台加载tree(一)tree.jsp ? ?位于WEB-INF/jsp/tree.jsp

?

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE html><html><head><title>tree.jsp</title><meta charset="UTF-8"><link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/css/zTreeStyle/zTreeStyle.css"><script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.10.2.js"></script><script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery.ztree.core-3.5.js"></script><script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery.ztree.exedit-3.5.js"></script><script type="text/javascript" src="${pageContext.request.contextPath }/js/tree.js"></script><style type="text/css">/*设置增加按钮的css样式*/.ztree li span.button.add {margin-left:2px; margin-right: -1px; background-position:-144px 0; vertical-align:top; *vertical-align:middle}</style></head><body><ul id="tree" name="code">var tree = {zTree : null,max : null,setting : {view : {selectedMulti : false,addHoverDom : function(treeId, treeNode){var sObj = $("#" + treeNode.tId + "_span");if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) 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 parameter = {mid:++tree.max,pid:treeNode.mid,name:"新节点 " + tree.max};tree.zTree.addNodes(treeNode, parameter);/** * 处理添加节点 */$.post("menuitem/insert",parameter);return false;});},removeHoverDom : function(treeId, treeNode){$("#addBtn_"+treeNode.tId).unbind().remove();}},data : {simpleData : {enable : true,idKey : "mid",pIdKey : "pid"}},edit : {editNameSelectAll : true,enable :true,removeTitle : "删除",renameTitle : "修改",drag : {autoExpandTrigger : false,isMove : false,isCopy : false,prev : false,next : false,inner : false}},callback : {beforeRename : function(treeId, treeNode, newName, isCancel){if(newName.trim().length == 0){alert("名称不能为空或空格!");return false;}return window.confirm("确定将 " + treeNode.name + " 修改为 " + newName + " 吗?");},onRename : function(event, treeId, treeNode, isCancel){/** * 处理更改名称 */var parameter = {mid : treeNode.mid,name : treeNode.name};$.post("menuitem/update", parameter);},beforeRemove : function(treeId, treeNode){return window.confirm("确定删除 " + treeNode.name + " 及其所有子节点吗?");},onRemove : function(event, treeId, treeNode){/** * 处理删除节点信息 */var parameter = {mid : treeNode.mid};$.post("menuitem/deleteById", parameter);var nodes = tree.zTree.transformToArray(treeNode.children);$.each(nodes,function(index,node){var parameter = {mid : node.mid};$.post("menuitem/deleteById", parameter);});}}},loadTree : function() {$.post("menuitem/getAll", null, function(data) {tree.zTree = $.fn.zTree.init($("#tree"), tree.setting, data);});$.post("menuitem/getMax", null, function(data) {tree.max = data;});}};$(document).ready(function() {tree.loadTree();});

?

?

就这么多了,最后附上整个项目

?

热点排行