我这样写只能显示一层,请问怎写才能显示全部层呢?
package com.wang.servlet.ext;import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;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 com.wang.dao.BigclassDao;
import com.wang.util.Menu;
import com.wang.vo.BigclassVO;
import com.wang.vo.SmallclassVO;import dao.AllBook;
import dao.Book;public class BookServlet extends HttpServlet {
 private String menuString;    
 private List<Menu> menus;  
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
menus = new ArrayList<Menu>();
AllBook allBook=new AllBook();
List<Book> list1=allBook.fillbook();
PrintWriter out = response.getWriter();
for (int i = 0; i < list1.size(); i++) {
Menu bzmenu = new Menu();
bzmenu.setId(list1.get(i).getId());
bzmenu.setText(list1.get(i).getBookName());
//bzmenu.setLeaf(list1.get(i).getCode());    
menus.add(bzmenu);
}
 JSONArray jsonObject = JSONArray.fromObject(menus);   
       try{
       menuString = jsonObject.toString();
       }catch(Exception e){
      
        e.printStackTrace();
       }
       out.print(menuString);
}}
package dao; import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.Statement; 
import java.util.ArrayList; 
import java.util.List; import dao.Book; public class AllBook { public static final String URL="jdbc:sqlserver://localhost:1433;DatabaseName=books"; 
public static final String serName="sa"; 
public static final String Pwd="rt"; protected static Connection conn=null; 
protected static PreparedStatement pst=null; 
protected static ResultSet rs=null; 
public List fillbook(){ 
//List menuList=new ArrayList(); 
List<Book> list1=new ArrayList<Book>(); 
try { 
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 
Connection con=DriverManager.getConnection(URL,serName,Pwd); //得到连接 
Statement st=con.createStatement(); String sql="select * from book"; //查询数据SQL语句s ResultSet rs=st.executeQuery(sql); //获取结果集 
   
while (rs.next()){ 
Book book=new Book(); 
book.setId(rs.getString("id"));
book.setCode(rs.getString("Code")); 
book.setBookName(rs.getString("BookName")); 
book.setBookPrice(rs.getString("BookPrice")); 
list1.add(book); 

con.close(); //关闭连接 

catch (Exception ex) { 
ex.printStackTrace();  //输出出错信息 

return list1; 
} } 
前台代码:
<script type="text/javascript">
Ext.onReady(function() {
 var Tree = Ext.tree;
   
    var tree = new Tree.TreePanel({
        el:'tree-div',
        autoScroll:true,
        animate:true,
        enableDD:true,
        containerScroll: true,
        loader: new Tree.TreeLoader({
            dataUrl:'<%=path%>/TreeServlet'
        })
    });    // set the root node
    var root = new Tree.AsyncTreeNode({
        text: 'Ext JS',
        draggable:false,
        id:'source'
    });
    tree.setRootNode(root);    // render the tree
    tree.render();
    root.expand();
});
</script>

解决方案 »

  1.   

    与后台交互的这种,我们通常的做法是 先本地构造假数据 先让Ext界面先出来 然后再在后台拼接数据楼主的后台代码只是把对象一一加入到了list 数据结构里都未做嵌套 这界面能分层么 对吧?先看下Ext的TreePanel的数据格式
      

  2.   

    通过父子关系去构造一个树,而不是把他们全取出来。比如根据广西,获取广西下面的市。有个children属性是该节点下面的子节点
      

  3.   

    你要保证你返回json也是有层次结构的
      

  4.   

    你最好贴一下后台构建树结构的JSONArray,不过也能猜到一些,你在构建JSONArray元素的时候应该是少写了某些构建树结构时所依赖的属性,如果构建的树JSONArray属性结构完整,即使子元素没有数据,树结构也会在前台各个支线图标前默认添加"+"符号,只不过点击后就消失了,最终成为你贴的图片样子。
    以下是一个裸的树结构数据,一般情况下,如果你的数据满足以下结构,大多数ExtJS树都能接收到。[{"id":"1","text":"湖南","children":[{"text":"邵阳","leaf":true},{"text":"娄底","leaf":true}],"leaf":false},{"id":"2","text":"广东","children":[{"text":"深圳","leaf":true},{"text":"东莞","leaf":true}],"leaf":false}]以上是一个JAVA JSONArray对象数据结构,你仔细对一下,一般树结构要包括"id","leaf","iconCls","text"这些.至于你的下拉树出不来,你可以查看下,"leaf"属性是否写成了字符窜"true"or"false",如果是,请改成布尔值,比如:"leaf":true.以下是后台代码:
    private void viewClientTreeInLevelByAjaxQuest(HttpServletRequest req,
    HttpServletResponse res) throws Exception{
    JSONObject data = c_service.getClientTreeData();
    PrintWriter out = null;
    res.setContentType("text/Xml;charset=gbk");
    out = res.getWriter();
    String str = 
    "[{'id':'1','text':'湖南','leaf':false,'children':" +
    "[{'text':'邵阳','leaf':true},{'text':'娄底','leaf':true}]}," +
     "{'id':'2','text':'广东','leaf':false,'children':" +
     " [{'text':'深圳','leaf':true},{'text':'东莞','leaf':true}]}]";
    JSONArray jsonArr = JSONArray.fromObject(str);
    System.out.println(jsonArr.toString());
    if(data!=null){
    // out.println(data.get("data").toString());
    out.println(jsonArr.toString());
    }
    out.close();
    }
    以下是我自己电脑上的效果:
      

  5.   

    代码在这里。麻烦帮我修改一下 谢谢了http://dl.vmall.com/download/rt.rar?f=c0b3avju8v&i=1&h=1359957435&v=ab5843ea&u=db8cff81&ip=113.96.224.95&p=0&lpid=0&tc=u28396276
      

  6.   

    看了你的实体类Menu,2个地方要改:leaf属性改成布尔值,children属性封装成JSONArray.
    封装好数据后,你可以将你的JSONArray.toString()打印出来,和我下面提供的数据结构对比下,问题很快就解决了。
    [{"id":"1",
      "text":"湖南",
      "leaf":false,     //应该是布尔值,而不是"leaf":"false"字符窜
      "children":       //将children的属性封装成JSONArray

                [{"text":"邵阳",
                  "leaf":true},
                {"text":"娄底",
                 "leaf":true}]},
     {"id":"2",
      "text":"广东",
      "leaf":false
      "children":
                [{"text":"深圳",
                  "leaf":true},
                 {"text":"东莞",
                  "leaf":true}]}]
      

  7.   

    能不能帮修改一下呢?麻烦你了,我 刚学,我不太清楚要怎封装成JSONArray
      

  8.   

    额。是不是写得太多了,让你觉得很复杂,没有重点?你是不是应该先好好看看JSONArray怎么用,这个真心已经已经很详细了。