关于easyUI-tree组件后台代码的优化

之前写的关于easyUI-tree的使用,在后台代码的呈现上有很多的瑕疵,这次改进了一下代码。


1.新增Tree的VO类

每一个实体类都应该有一个与之对应的VO,来应对页面的多变需求,以达到不修改数据库就能来满足页面结构。 所以我们需要额外定义VO类,来处理不同的页面需求。
Tree也是一样的,我们来看看TreeVo的定义:

package com.chenqk.springmvc.vo;

import java.util.List;

import com.chenqk.springmvc.entity.Tree;

/**
 * Tree所对应的VO类,负责与页面进行交互
 * 每一个实体类都应该对应一个VO对象,
 * 我们的页面应该是灵活多变的,而不是一成不变的,
 * 而BO针对数据库设计,在大多数情况下是一成不变的
 * 所以当页面需求变化时,我们只需要修改VO即可,
 * 而不需要重新设计数据库
 * @author chenqk
 *
 */
public class TreeVo {
	private int id;//id
	private int pid;//父id
	private String text;
	private String attributes;
	private String state;
	private List<TreeVo> children;
	
	public TreeVo(Tree tree , List<TreeVo>treeList){
		this.id = tree.getId();
		this.pid = tree.getPid();
		this.text = tree.getText();
		this.attributes = tree.getAttributes();
		this.children = treeList;
		this.state = "open";
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getPid() {
		return pid;
	}
	public void setPid(int pid) {
		this.pid = pid;
	}
	public String getText() {
		return text;
	}
	public void setText(String text) {
		this.text = text;
	}
	public String getAttributes() {
		return attributes;
	}
	public void setAttributes(String attributes) {
		this.attributes = attributes;
	}
	public List<TreeVo> getChildren() {
		return children;
	}
	public void setChildren(List<TreeVo> children) {
		this.children = children;
	}
	public String getState() {
		return state;
	}
	public void setState(String state) {
		this.state = state;
	}
	
	
}

2.service中的处理

将逻辑处理放到service层中,在这里只简单的定义了三层节点,关于更多的节点层的写法,大家有兴趣的可以自己研究研究,在这里我就不做处理了。我们来看看三层节点怎么处理,其实大同小异,无非是遍历往里存放。


package com.chenqk.springmvc.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import com.chenqk.springmvc.dao.TreeDao;
import com.chenqk.springmvc.entity.Tree;
import com.chenqk.springmvc.service.TreeService;
import com.chenqk.springmvc.vo.TreeVo;
/**
 * 逻辑业务层
 * @author chenqk
 * 
 * @Qualifier 匹配者,按类型自动装配可能多个bean实例的情况,可以使用Spring的@Qualifier
 * 注解缩小范围(或指定唯一),也可以指定单独的构造器参数或方法参数。
 * 
 * @Resource 默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入
 * @Resource 有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name
 * 属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,
 * 则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name
 * 也不指定type属性,这时将通过反射机制使用byName自动注入策略。
  @Resource 装配顺序
  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为
        一个原始类型进行匹配,如果匹配则自动装配; 
 *
 * @Autowired 默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在,如果允许null值,
 * 可以设置它required属性为false。如果我们想使用按名称装配,
 * 可以结合@Qualifier注解一起使用。如下: 
 * 
 */
@Repository("TreeService")
public class TreeServiceImpl implements TreeService{
	@Autowired
	@Qualifier("TreeDao")
	private TreeDao treeDao;
	
	@Override
	public TreeVo getNodeById(int id) {
		List<TreeVo> treeVoList = new ArrayList<TreeVo>();
		//获取根节点
		Tree tree = treeDao.getNodeById(id);
		//获取根节点下的二级子节点
		List<Tree> treeList = treeDao.getNodesByParentId(id);
		for (Tree tree2 : treeList) {
			List<TreeVo> voList = new ArrayList<TreeVo>();
			List<Tree> tree2List = treeDao.getNodesByParentId(tree2.getId());
			//判断该节点下还存不存在子节点
			if(tree2List.size() > 0){
				for (Tree tree3 : tree2List) {
					TreeVo vo = new TreeVo(tree3,null);
					voList.add(vo);
				}
			}
			TreeVo vo2 = new TreeVo(tree2,voList);
			treeVoList.add(vo2);
		}
		TreeVo treeVo = new TreeVo(tree,treeVoList);
		return treeVo;
	}

	public TreeDao getTreeDao() {
		return treeDao;
	}

	public void setTreeDao(TreeDao treeDao) {
		this.treeDao = treeDao;
	}

	@Override
	public List<Tree> getNodesByParentId(int pid) {
		return treeDao.getNodesByParentId(pid);
	}

	@Override
	public void addTreeNode(Tree tree) {
		treeDao.addTreeNode(tree);
		
	}

	@Override
	public void updTreeNode(Tree tree) {
		treeDao.updTreeNode(tree);
		
	}

	@Override
	public void delTreeNode(int id) {
		treeDao.delTreeNode(id);
		
	}

}

在这里使用了对象封装来处理json格式,而不是之前的拼接格式了,这样处理起来要相对简单多了,你只要弄清楚层次结构,就简单的多了。因为对象本身转为json格式就是比较标准的形式,所以直接用对象转换要比我们拼接起来方便的多了。

3.controller层的处理

由于所有的逻辑处理都在service里面实现了,controller层就简洁了许多。

/**
	 * 根据id获取节点下的所有数据
	 * @param pid
	 */
	@RequestMapping(value="/getNodesByParentId",method=RequestMethod.POST)
	public void getNodesByParentId(@RequestParam("id") int id,HttpServletResponse response){
		response.setHeader("Content-type", "text/html;charset=UTF-8");  
		response.setCharacterEncoding("UTF-8");
		//根据id获取当前节点的信息
		TreeVo treeRoot = treeService.getNodeById(id);
		JSONObject obj = JSONObject.fromObject(treeRoot);
		System.out.println(obj);
		try {
			response.getWriter().print("["+obj+"]");
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}


其实在这里,我们还可以在进一步处理,甚至由service直接返回一个合格的json字符串也行,更简化了controller中的处理,效果图如下:


其他地方的代码没有做修改,其他的部分可以参考这篇博客:http://blog.csdn.net/chenqk_123/article/details/78662905

猜你喜欢

转载自blog.csdn.net/chenqk_123/article/details/78920588