構造一棵easyui前台框架的一個樹形列表為例后台框架是spring MVC+JPA。
先看一下數據庫是怎么建的,怎么存放的數據
下面是實體類
/** * 部門類 用戶所屬部門(這里的部門是一個相對抽象的詞) * 使用前綴編碼,每級增加三個數字,如:第一級 001,第二級001001,第三級001001001 * @author Administrator * */ @Entity public class Department { private String id; //部門id private String pid; //父id private String text; //部門名稱 private List<Department> children; //用於存儲子節點 @Id public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPid() { return pid; } public void setPid(String pid) { this.pid = pid; } public String getText() { return text; } public void setText(String text) { this.text = text; } @OneToMany public List<Department> getChildren() { return children; } public void setChildren(List<Department> children) { this.children = children; } }
由於使用的是easyui ,為了樹可以正確顯示,必須包含屬性id和text。
下面是控制類,用於讀取數據庫中的數據,生成一個List,該list返回到前台時會轉成json格式的數據,重點需要理解的就是getTree()和buildTree()這兩個方法,通過遞歸生成這棵樹,基本實現原理是遍歷樹的某一層,獲取每個節點的子節點們(一個list),然后將它作為父節點的一個屬性set進去
@Controller @RequestMapping("/department") public class DepartmentController { private static final String DEPARTEMNTMANAGE = "module/jsp/system/departmentManage.jsp"; @Resource(name="departmentServiceImpl") private DepartmentService departmentService; /** * 獲取部門管理頁面. * @return */ @RequestMapping("/getPage.do") public String getUserManagePage(){ return DEPARTEMNTMANAGE; } /** * 獲取部門樹形列表 */ @RequestMapping(value = "/getTree.do", method = RequestMethod.POST) @ResponseBody //此注解表明返回值跳過視圖處理部分,直接寫入 http response body中 public List<Department> getTree(){ List<Department> root = departmentService.findById("0"); //獲取根節點(獲取的值存到list中) net.sf.json.JSONArray jsonArray = net.sf.json.JSONArray.fromObject(buildTree(root)); System.out.println(jsonArray.toString()); return buildTree(root); } public List<Department> buildTree(List<Department> root){ for(int i=0;i<root.size();i++){ List<Department> children = departmentService.findByPid(root.get(i).getId()); //查詢某節點的子節點(獲取的是list) buildTree(children); root.get(i).setChildren(children); } return root; } }
這里用查詢的方法findById和findByPid是基於spring data JPA的方法,下面是相關類:
public interface DepartmentDao extends Repository<Department, Integer>{ public List<Department> findByPid(String pid); public List<Department> findById(String id); }
public interface DepartmentService { public List<Department> findByPid(String pid); public List<Department> findById(String id); }
@Service("departmentServiceImpl") public class DepartmentServiceImpl implements DepartmentService{ @Autowired private DepartmentDao departmentDao; @Override public List<Department> findByPid(String pid) { return departmentDao.findByPid(pid); } @Override public List<Department> findById(String id) { return departmentDao.findById(id); } }
前台調用如下
$(function(){ $('#tt').tree({ url: 'department/getTree.do', loadFilter: function(data){ if (data.d){ return data.d; } else { return data; } } }); });
這是后台返回給前台一個如下的json格式的數據:
[ { "children": [ { "children": [ { "children": [], "id": "001001", "pid": "001", "text": "部門一" }, { "children": [], "id": "001002", "pid": "001", "text": "部門二" } ], "id": "001", "pid": "0", "text": "一分公司" }, { "children": [ { "children": [], "id": "002001", "pid": "002", "text": "部門一" }, { "children": [], "id": "002002", "pid": "002", "text": "部門二" } ], "id": "002", "pid": "0", "text": "二分公司" }, { "children": [], "id": "003", "pid": "0", "text": "三分公司" } ], "id": "0", "pid": "-1", "text": "總公司" } ]
在頁面上如下顯示: