之前写的关于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);
}
}
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();
}
}
其他地方的代码没有做修改,其他的部分可以参考这篇博客:http://blog.csdn.net/chenqk_123/article/details/78662905