说明:数据库里只有一张表,名字是课程大纲表,字段只有两个,id(varchar即课程大纲ID号,assigned)和name(varchar即课程大纲标题)
表建出来如下:
00101    第一章
0010101  第一章第一节
0010102  第一章第二节
00102    第二章
0010201  第二章第一节
0010202  第二章第二节
0010203  第二章第三节
........
(补充:前三位"001"表示课程编号,这个无关紧要,反正只能是3位数,紧接着两位数"01"表示章号,再紧接着两位数"01"表示节号,另外我规定章号和节号最多只能到08)问题: 因为数据库中只有一个表,我用Hibernate对应也只有一个Outline(课程大纲类),属性有id,name两个,在DAOImpl中如何用HQL查询并保存在Collection中,然后在JSP中用struts标签遍历(logic:iterator)给显示出来下面是我目前写的JSP相关代码:
<div style="overflow:auto;" class="TreeMenu" id="CategoryTree">
  <ul>
  <logic:iterate id="outline" name="chapters" >
    <li class="Closed"><img class=s src="../css/s.gif" onclick="javascript:ChangeStatus(this);"><a href="#">第${outline.id}章 &nbsp;${outline.name }</a>
    <ul>
    <logic:iterate id="outline" name="lessons" >
     <li class="Child">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第${outline.id}节&nbsp;&nbsp;<a href="#">${outline.name }</a></li>
    </logic:iterate>
    </ul>
</li>
</logic:iterate>
</ul>
</div>但是这样输出后,章位置和内容是正确的,但是每个章底下会把所有的节都打印出来, 我只要对应章下面的所有的节的name
再把我目前写的两个方法贴上,请高手指教:
public Collection selectChaptersForBrowse(String outlineId) {
     Collection<Outline> list=new ArrayList<Outline>();
   for(int i=1;i<=8;i++){
Criteria c=getSession().createCriteria(Outline.class);
String id=outlineId+"0"+i;
System.out.println(id);
c.add(Restrictions.like("id", id, MatchMode.EXACT));
Collection<?> l=c.list();
Iterator<?> ll=l.iterator();
while(ll.hasNext()){
Outline outline=new Outline();
outline=(Outline) ll.next();
outline.setId(id.substring(4));
list.add(outline);
}
}
             return list;
}
public Collection selectLessonsForBrowse(String outlineId) {
          Collection<Outline> list=new ArrayList<Outline>();
                         for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
Criteria c=getSession().createCriteria(Outline.class);
String id=outlineId+"0"+i+"0"+j;
System.out.println(id);
c.add(Restrictions.like("id", id, MatchMode.EXACT));

Collection<?> l=c.list();
Iterator<?> ll=l.iterator();
while(ll.hasNext()){
Outline outline=new Outline();
outline=(Outline) ll.next();
outline.setId(id.substring(6));
list.add(outline);
}
}
                                 return list;
}

解决方案 »

  1.   

    最简单的办法就是    数据库中的表 加一个字段  parentId :父章节的ID
    在保存数据的时候,如果是父章节(00101    第一章 ) ,那么parentId为null;
    如果是子章节(0010101  第一章第一节 ),那么parentId为 00101
      

  2.   

    可以讲得再详细点吗? 查询得到的如果是两个集合就好办了,Collection chapters和Collection lessons, 课程问题是chapters和lessons对不上, 都是自己遍历自己的
    现在数据存储还有一些基本的查询修改都没问题,就差能一下查询"001"这门课的课程大纲---用树的形式表现出来的
      

  3.   

    加parent字段会产生另外一个问题,就是父子节点的递归问题。不如把这张表拆成六列:课程号  章号  节号  章名  节名  深度
    001    01        第一章         1 
    001    01    01  第一章 第一节  2
    这样怎么检索都比较方便,如果只要章,则where 深度=1
    如果只要某一章,则where 章号=xxx
      

  4.   

    这个这个/........最好是在不改变表的结构哈,不然偶苦心做了两天的模块要全盘重新来过了....我现在在想怎么样能把两个Collecion封装在一个类里比如起名Data,然后用的时候从Data中拿, 但问题是章和节对不上, 试验中.......还是谢谢你
      

  5.   

    我觉得啊,两天做的东西推翻很正常,重新设计一下库表,以后可能会省很多事儿。两个Collection封装到一个类应该很简单啊,两个成员变量不就可以了吗?你能说说,你最终想显示成啥样吗?你的描述让人看着晕。
      

  6.   

    思路是这样 判断你这查询出这个list集合里面的id字段值:
    1.如果长度为5,dir标识为0标识根结点 即就是的你的章节点
    2.如果长度大于5,dir标识为截取前5个字符,标识为子结点 即就是的你的节结点
    3.判断dir 进行分级显示
    <% 
    List list1 =(List) request.getAttribute("zjlist");
    for(int i=0;i<list1.size();i++)
    {
     Map mapv=(Map)list1.get(i);
     String dir="0";
     
     if(mapv.get("id").toString().length==5)
     {
        dir="0";
     }
     else(mapv.get("id").toString().length>5)                  {
        dir=mapv.get("id").toString().substring(0,5);
     }  

     }
        %>注意: 我这个list经过处理的 是可以用map直接获取的,故写法如上。
      

  7.   

    树型菜单!可以Google一下,大片大片的!
      

  8.   

    我现在静态页面里面的一个树状代码是这样的,很明显应该是用logic:iterate标签嵌套遍历的,可是问题就在于遍历章集合的时候如何对应找到并遍历显示对应的所有节,而不是在每个章地下把所有的节都遍历出来了我觉得你说的方法对我有启发,判断章集合和节集合中ID的长度,那么标示了DIV以后,根据你的意思在JSP页面里怎样写呢? 是用JavaScript判断DIV标示吗?还是怎么样?我的静态页面代码:
    <div class="StudentTreeMenu" id="StudentCategoryTree">
     <ul>
        <li class="Opened"><img class=s src="../css/s.gif" onclick="javascript:ChangeStatus(this);"><a href="#">第一章 &nbsp;项目管理</a>
        <ul>
         <li class="Child">第一节&nbsp;&nbsp;<a href="outlineinfo.htm">我是1.1</a></li>
         <li class="Child">第二节&nbsp;&nbsp;<a href="#">我是1.2</a></li>
         <li class="Child">第三节&nbsp;&nbsp;<a href="#">我是1.3</a></li>
         <li class="Child">第四节&nbsp;&nbsp;<a href="#">我是1.4</a></li>
        </ul>
    </li>
    </ul>
    <ul>
        <li class="Opened"><img class=s src="../css/s.gif" onclick="javascript:ChangeStatus(this);"><a href="#">第二章 &nbsp;资源管理</a>
        <ul>
         <li class="Child">第一节&nbsp;&nbsp;<a href="#">我是2.1 </a></li>
         <li class="Child">第二节&nbsp;&nbsp;<a href="#">我是2.2</a></li>
        </ul>
    </li>
    </ul>
    <ul>
        <li class="Opened"><img class=s src="../css/s.gif" onclick="javascript:ChangeStatus(this);"><a href="#">第三章 &nbsp;人力管理</a>
        <ul>
         <li class="Child">第一节&nbsp;&nbsp;<a href="#">我是3.1 </a></li>
         <li class="Child">第二节&nbsp;&nbsp;<a href="#">我是3.2</a></li>
          <li class="Child">第三节&nbsp;&nbsp;<a href="#">我是3.3</a></li>
        </ul>
    </li>
    </ul>
    </div>
    我的JSP页面里目前出现问题的代码:
    <div style="overflow:auto;" class="TreeMenu" id="CategoryTree">
      <ul>
      <logic:iterate id="outline" name="chapters" >
        <li class="Closed"><img class=s src="../css/s.gif" onclick="javascript:ChangeStatus(this);"><a href="#">第${outline.id}章 &nbsp;${outline.name }</a>
        <ul>
        <logic:iterate id="outline" name="lessons" >
         <li class="Child">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第${outline.id}节&nbsp;&nbsp;<a href="#">${outline.name }</a></li>
        </logic:iterate>
        </ul>
    </li>
    </logic:iterate>
    </ul>
    </div>
      

  9.   

    请问大家:
    我得到的是章节的HashMap,如何在JSP页面里打印出来,即logic:iterate对于HashMap的遍历,其中HashMap中key是"chapter"对象,value是"lesson"集合查找并获得HashMap的代码如下:
    public HashMap selectOutlineForBrowse(String outlineId) {
    HashMap h=new HashMap();
    for(int i=1;i<=8;i++){
    Criteria c=getSession().createCriteria(Outline.class);
    String chapterId=outlineId+"0"+i;
    // System.out.println(chapterId);
    c.add(Restrictions.like("id", chapterId, MatchMode.EXACT));
    Outline chapter=(Outline) c.uniqueResult();
    for(int j=1;j<=8;j++){
    Criteria cc=getSession().createCriteria(Outline.class);
    String lessonId=chapterId+"0"+j;
    // System.out.println(lessonId);
    cc.add(Restrictions.like("id", lessonId,MatchMode.EXACT));
    List lessons=cc.list();
    h.put(chapter, lessons);
    }
    }
    return h;
    }如何用logic:iterate在下面的静态页面代码中输出? 资料网上找了,但是还是迷茫?请高手指教!<ul> 
        <li class="Opened"> <img class=s src="../css/s.gif" onclick="javascript:ChangeStatus(this);"> <a href="#">第一章 &nbsp;项目管理 </a> 
        <ul> 
        <li class="Child">第一节&nbsp;&nbsp; <a href="outlineinfo.htm">我是1.1 </a> </li> 
        <li class="Child">第二节&nbsp;&nbsp; <a href="#">我是1.2 </a> </li> 
        <li class="Child">第三节&nbsp;&nbsp; <a href="#">我是1.3 </a> </li> 
        <li class="Child">第四节&nbsp;&nbsp; <a href="#">我是1.4 </a> </li> 
        </ul> 
    </li> 
    </ul>
      

  10.   

        <logic:iterate id="element" indexId="ind" name="months"> 
            <bean:write name="id"/>.                      // 序号 
            <bean:write name="element" property="key"/>:    // 键名 
            <bean:write name="element" property="value"/>    // 键值 
        </logic:iterate>