项目结构:
实现效果:
index.jsp代码:
<%@ page language="java" pageEncoding="UTF-8"%>
<html>
<head>
<title>Accordion布局菜单</title>
<link rel="stylesheet" type="text/css"
href="/Accordion/ext4/resources/css/ext-all.css" />
<script type="text/javascript" src="/Accordion/ext4/ext-all-debug.js"></script>
<script type="text/javascript" src="/Accordion/ext4/locale/ext-lang-zh_CN.js"></script>
<style type="text/css">
.icon-accordion{
background-image: url(/Accordion/images/accordion.gif) !important;
}
.icon-panel{
background-image: url(/Accordion/images/panel.png) !important;
}
</style>
<script type="text/javascript">
var ajax = function(config) { //封装、简化AJAX
Ext.Ajax.request({
url : config.url, //请求地址
params : config.params, //请求参数
method : 'post', //方法
callback : function(options, success, response) {
config.callback(Ext.JSON.decode(response.responseText));
//调用回调函数
}
});
return false;
};
Ext.onReady(function() {
var win = Ext.create("Ext.window.Window", {
title : "Accordion布局动态菜单",
width : 300,
height : 500,
iconCls : "icon-accordion",
autoScroll : false,
layout : 'accordion',
layoutConfig : {
animate : true
}
});
win.show();
ajax({
url : "/Accordion/accordion",//获取面板的地址
params : {
action : "list"
},
callback : addTree
});
function addTree(data){
for ( var i = 0; i < data.length; i++) {
win.add(Ext.create("Ext.tree.Panel", {
title : data[i].title,
iconCls : data[i].iconCls,
autoScroll : true,
rootVisible : false,
viewConfig : {
loadingText : "正在加载..."
},
store : createStore(data[i].id),
listeners : {
afterlayout : function(){
if(this.getView().el){
var el = this.getView().el;
var table = el.down("table.x-grid-table");
if(table){
table.setWidth(el.getWidth());
}
}
}
}
}));
win.doLayout();
}
}
var model = Ext.define("TreeModel", { //定义树节点数据模型
extend : "Ext.data.Model",
fields : [ {name : "id",type : "string"},
{name : "text",type : "string"},
{name : "iconCls",type : "string"},
{name : "leaf",type : "boolean"}
]
});
var createStore = function(id){ //创建树面板数据源
var me = this;
return Ext.create("Ext.data.TreeStore",{
defaultRootId : id, //默认的根节点id
model : model,
proxy : {
type : "ajax", //获取方式
url : "/Accordion/accordion?action=node" //获取树节点的地址
},
clearOnLoad : true,
nodeParam : "id"//设置传递给后台的参数名,值是树节点的id属性
});
};
});
</script>
</head>
<body>
</body>
</html>
AccordionServlet代码如下:
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@SuppressWarnings("serial")
public class AccordionServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getParameter("action");
initHeader(response);
if(action.equals("list")){//获取属面板列表
renderText(this.getTreePanelList(), response);
}else if(action.equals("node")){
renderText(this.getTreeNodeList(request.getParameter("id")), response);
}
}
public String getTreeNodeList(String id){
JSONArray array = new JSONArray();
for (int j = 0; j < 5; j++) {
JSONObject json = new JSONObject();
json.element("id", id + "-" +(j+1));
json.element("text", "树节点-"+ id + "-" +(j+1));
if((j+1) % 2 == 0 && id.length() <= 3){
json.element("leaf", false);
}else{
json.element("leaf", true);
}
array.add(json);
}
return array.toString();
}
public String getTreePanelList(){
JSONArray array = new JSONArray();
for (int i = 0; i < 5; i++) { //生成5个属面板
JSONObject json = new JSONObject();
json.element("id", i+1);
json.element("iconCls", "icon-panel");
json.element("title", "Accordion菜单"+(i+1));
array.add(json);
}
return array.toString();
}
public static void renderText(final String content,HttpServletResponse response){
try{
response = initHeader(response);
response.getWriter().write(content);
response.getWriter().close();
}catch(Exception e){
e.printStackTrace();
}
}
private static HttpServletResponse initHeader(HttpServletResponse response){
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setCharacterEncoding("UTF-8");
return response;
}
}
web.xml代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name></display-name>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>AccordionServlet</servlet-name>
<servlet-class>servlet.AccordionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AccordionServlet</servlet-name>
<url-pattern>/accordion</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>