Extjs4 treePanel异步加载菜单(后台从数据库读取)

一、首先设计编写Menu实体类,存储每个菜单项的信息

package com.deppon.entity;

public class Menu {
	private String tid;
	private String text;
	private boolean leaf;
	private String parentId;

	public String getTid() {
		return tid;
	}

	public void setTid(String tid) {
		this.tid = tid;
	}

	public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}

	public boolean isLeaf() {
		return leaf;
	}

	public void setLeaf(boolean leaf) {
		this.leaf = leaf;
	}

	public String getParentId() {
		return parentId;
	}

	public void setParentId(String parentId) {
		this.parentId = parentId;
	}

	@Override
	public String toString() {
		return "Menu [tid=" + tid + ", text=" + text + ", leaf=" + leaf
				+ ", parentId=" + parentId + "]";
	}

}
  1.  实体类有四个私有属性,tid是自身的id,
  2. text就是菜单在页面显示的的数据,
  3. leaf就是是否为叶子节点,
  4. parentId为父亲节点的id

二、接下来设计数据库,插入数据(我用的是Oracle)

create table T_TREE
(
  t_id      VARCHAR2(10),
  text      NVARCHAR2(10),
  leaf      CHAR(1),
  parent_id VARCHAR2(10)
)
  1. 需要注意的就是实体类是boolean值的leaf在数据库中用CHAR(1)存储,值为0或1
  2. 然后插入数据
insert into T_TREE values('101','一级菜单1',0,null);
insert into T_TREE values('102','一级菜单2',0,null);
insert into T_TREE values('103','一级菜单3',0,null);
insert into T_TREE values('1001','二级菜单1',1,'101');
insert into T_TREE values('1002','二级菜单2',0,'102');
insert into T_TREE values('1003','二级菜单3',0,'102');
insert into T_TREE values('1004','二级菜单4',0,'103');
insert into T_TREE values('1005','二级菜单5',0,'103');
insert into T_TREE values('10001','三级菜单1',1,'1002');
insert into T_TREE values('10002','三级菜单2',1,'1002');
insert into T_TREE values('10003','三级菜单3',1,'1003');
insert into T_TREE values('10004','三级菜单4',1,'1003');
insert into T_TREE values('10005','三级菜单5',1,'1004');
insert into T_TREE values('10006','三级菜单6',1,'1004');
insert into T_TREE values('10007','三级菜单7',1,'1004');
insert into T_TREE values('10008','三级菜单8',1,'1005');
insert into T_TREE values('10009','三级菜单9',1,'1005');

 

三、设计dao层,由于我是使用Mybatis的,就把mapper文件的代码粘贴一下

  1. 主要的思路就是,根据父亲节点的id找到所对应的所有子节点
  2. 需要注意的是, <result property="leaf" column="leaf" javaType="Boolean" jdbcType="CHAR"/>这样的话,mybatis就会自动将数据库中的CHAR类型的leaf转化成布尔类型

 下面是dao层的代码

 IMenuDao是我写的一个dao接口,其实就是Service层调用Dao层接口,Action层再调用Service层接口

 

四、接下来编写界面js

Ext.onReady(function(){
	var store = Ext.create('Ext.data.TreeStore', {
		autoLoad : true,
		proxy : {
				type : 'ajax',
				url : 'menuAction!findLeaf',//请求
				reader : {
					type : 'json',
					root : 'menuList'//数据
				},
				//传参
				extraParams : {
					tid : ''
				}
			},
		root : {
			text : '管理菜单',
			expanded : true			
		},
		listeners : {
			'beforeexpand' : function(node,eOpts){
		//点击父亲节点的菜单会将节点的id通过ajax请求,将到后台
				this.proxy.extraParams.tid = node.raw.tid;
			}
		}
	});
	
	Ext.create('Ext.tree.Panel', {
		renderTo : Ext.getBody(),
		title : '动态加载TreePanel',
		width : 300,
		height : 500,
		useArrows : true,
		store : store
	});
});

 

首次加载的时候tid的值为空,所以就会从数据库把三个一级菜单查出来,

因为三个一级菜单的parent_id is null

 

五、最后编写Action

package com.deppon.action;

import java.util.List;

import com.deppon.entity.Menu;
import com.deppon.service.IMenuService;

public class MenuAction extends BaseAction {
	private IMenuService menuService;
	private String tid;
	private List<Menu> menuList;

	public String findLeaf() {
		menuList = this.menuService.findLeaf(tid);
		System.out.println(menuList);
		return "findLeaf";
	}

	public void setMenuService(IMenuService menuService) {
		this.menuService = menuService;
	}

	public String getTid() {
		return tid;
	}

	public void setTid(String tid) {
		this.tid = tid;
	}

	public List<Menu> getMenuList() {
		return menuList;
	}

	public void setMenuList(List<Menu> menuList) {
		this.menuList = menuList;
	}

}

 在struts.xml和application.xml配置Action

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

	<package name="default" namespace="/" extends="json-default">
		<action name="menuAction" class="menuAction">
			<result name="findLeaf" type="json">
				<param name="includeProperties">menuList.*</param>
			</result>
		</action>
	</package>

</struts>

 

	<!-- 配置dao -->
	<bean id="menuDao" class="com.deppon.dao.impl.MenuDaoImpl" scope="prototype">
		<property name="sqlSessionTemplate" ref="sqlSession"></property>
	</bean>

	<!-- 配置service -->
	<bean id="menuService" class="com.deppon.service.impl.MenuServiceImpl">
		<property name="menuDao" ref="menuDao"></property>
	</bean>

	<!-- 配置Action -->
	<bean id="menuAction" class="com.deppon.action.MenuAction">
		<property name="menuService" ref="menuService"></property>
	</bean>

 这样基本上就写完了,现在我粘贴一下运行的效果

1、首次加载

 

 

2、全部展开

 

 
我是用ssm框架写的,可能有些同学没有用过,但是基本的思想,应该写的很清楚了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值