之前写的关于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