前端 TreePanel + AsyncTreeNode + TreeLoader → 請求後端 Servlet → 返回節點 JSON → 動態渲染展開。
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
import javax.servlet.http.*;
public class TreeNodeServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String treeNode = request.getParameter("node"); // AsyncTreeNode 的 id
String json = "";
PrintWriter out = response.getWriter();
if ("0".equals(treeNode)) {
json = "[{id:1,text:'0-1'},{id:2,text:'0-2'}]";
} else if ("1".equals(treeNode)) {
json = "[{id:11,text:'0-1-1',leaf:true},{id:12,text:'0-1-2',leaf:true}]";
} else if ("2".equals(treeNode)) {
json = "[{id:21,text:'0-2-1'},{id:22,text:'0-2-2',leaf:true}]";
} else if ("21".equals(treeNode)) {
json = "[{id:211,text:'0-2-1-1',leaf:true},{id:212,text:'0-2-1-2',leaf:true}]";
}
out.write(json);
}
}
Ext.onReady(function() {
var tree = new Ext.tree.TreePanel({
el: 'div-tree',
loader: new Ext.tree.TreeLoader({dataUrl: '../TreeNodeServlet'})
});
var root = new Ext.tree.AsyncTreeNode({id: '0', text: '0'});
tree.setRootNode(root);
tree.render();
root.expand(); // 初始展開根節點,觸發首次加載
});
root.expand()TreeLoader 請求 dataUrl?node=節點IDnode 參數查詢業務數據 → 拼接 JSON 返回TreeLoader 解析 JSON → 創建子節點 → 掛載到展開節點下
node 參數白名單/長度限制,防注入{success:false,msg:'...'}ExtJS TreePanel 懶加載機制:AsyncTreeNode + TreeLoader(dataUrl) + 後端按 node 參數動態返回 JSON。掌握前端配置、後端參數約定、JSON 格式、展開觸發流程,即可實現高性能大樹結構展示。