在easyui API中可以知道,easyui tree支持树控件的异步加载,用户可以从后台动态获取,返回json数据,来完成异步请求。
1、树的json格式:
[{ "id":1, "text":"My Documents", "children":[{ "id":11, "text":"Photos", "state":"closed", "children":[{ "id":111, "text":"Friend" },{ "id":112, "text":"Wife" },{ "id":113, "text":"Company" }] },{ "id":12, "text":"Program Files", "children":[{ "id":121, "text":"Intel" },{ "id":122, "text":"Java", "attributes":{ "p1":"Custom Attribute1", "p2":"Custom Attribute2" } },{ "id":123, "text":"Microsoft Office" },{ "id":124, "text":"Games", "checked":true }] },{ "id":13, "text":"index.html" },{ "id":14, "text":"about.html" },{ "id":15, "text":"welcome.html" }] }]
其中的state可为open或closed,异步加载就是当展开一个封闭的节点时,如果节点没有加载子节点,它将把节点id作为http请求参数并命名为‘id’,在服务器上检索。
2、tree的声明:
1)在html写一个ul:
<ul id="tree"></ul>
2)js中
$('tree').tree({ url:'/EasyuiDemo/loadTree'// 本人的项目名为EasyuiDemo });
3、java代码中
后台实现的就是根据id查找是否有子节点,然后返回数据,写法大同小异,下面是笔者的思路,这里用的是Spring + SpringMVC +Spring JDBCTemplate
1)tree的bean类
public class Tree {
private String id;//节点
private String pid;//父节点
private String text;//显示内容
private String state;// 是否为封闭节点,即有子节点
public Tree() {
super();
}
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 getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
@Override
public String toString() {
return "Tree [id=" + id + ", pid=" + pid + ", state=" + state + "]";
}
}
2)controller层
@Controller public class treeController{ @Autowired treeService service; @RequestMapping(value="/loadTree") public void loadTree(HttpServletRequest request,HttpServletResponse response,String id) throws Exception{ response.setCharacterEncodiung("UTF-8"); if(id==null){ id="0"; } List list = new ArrayList(); list= service.loadTeee(id); response.getWriter().write(new Gson().toJson(list)); } }
3)service层
@Service public treeService { @Autowirwd treeDao dao; public List loadTree(String id){ List<Tree> list = dao.LoadTree(id); return list } }
4) dao层
@Repository public class treeDao{ @Autowired private JdbcTemplate template; public List loadTree(String id){ String sql = "select * from tree where pid ="+id; return template.query(sql ,new TreeRowMapper()); } public int countTree(String id){ String sql ="select count(*) from tree where pid = "+id; return template.queryForInt(sql); } class TreeRowMapper implements RowMapper{ public Object mapRow(ResultSet rs,int arg) throws SQLException { Tree tree = new Tree() Tree tree = new Tree(); tree.setId(rs.getString("id")); tree.setPid(rs.getString("pid")); tree.setText(rs.getString("text")); if(countTree(rs.getString("id"))>0){ tree.setState(rs.getString("closed")); } } } }
这里的大概意思是,根据id查询其子节点,即sql:”select * from tree where pid“ = id,,让后返回List<Tree>集合,countTree(String id)函数的作用是判断当前节点是否有子节点,有则设置state为closed。
4、数据库
三个字段:id,text,pid
注:数据库中字段名称可以随意命名,但是easyui-tree加载的数据必须是上面的json格式及对应命名
如果这种实现方式不是你想要的,可以参考easyui中文网的这种实现:easyui延迟加载树
由于某原因,不能直接拷贝工作区中的代码,上面的代码是在无编译环境的机器上打的,博客布局和代码排版有点乱,多多见谅。