说明:数据库里只有一张表,名字是课程大纲表,字段只有两个,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}章 ${outline.name }</a>
<ul>
<logic:iterate id="outline" name="lessons" >
<li class="Child"> 第${outline.id}节 <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;
}
表建出来如下:
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}章 ${outline.name }</a>
<ul>
<logic:iterate id="outline" name="lessons" >
<li class="Child"> 第${outline.id}节 <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;
}
在保存数据的时候,如果是父章节(00101 第一章 ) ,那么parentId为null;
如果是子章节(0010101 第一章第一节 ),那么parentId为 00101
现在数据存储还有一些基本的查询修改都没问题,就差能一下查询"001"这门课的课程大纲---用树的形式表现出来的
001 01 第一章 1
001 01 01 第一章 第一节 2
这样怎么检索都比较方便,如果只要章,则where 深度=1
如果只要某一章,则where 章号=xxx
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直接获取的,故写法如上。
<div class="StudentTreeMenu" id="StudentCategoryTree">
<ul>
<li class="Opened"><img class=s src="../css/s.gif" onclick="javascript:ChangeStatus(this);"><a href="#">第一章 项目管理</a>
<ul>
<li class="Child">第一节 <a href="outlineinfo.htm">我是1.1</a></li>
<li class="Child">第二节 <a href="#">我是1.2</a></li>
<li class="Child">第三节 <a href="#">我是1.3</a></li>
<li class="Child">第四节 <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="#">第二章 资源管理</a>
<ul>
<li class="Child">第一节 <a href="#">我是2.1 </a></li>
<li class="Child">第二节 <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="#">第三章 人力管理</a>
<ul>
<li class="Child">第一节 <a href="#">我是3.1 </a></li>
<li class="Child">第二节 <a href="#">我是3.2</a></li>
<li class="Child">第三节 <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}章 ${outline.name }</a>
<ul>
<logic:iterate id="outline" name="lessons" >
<li class="Child"> 第${outline.id}节 <a href="#">${outline.name }</a></li>
</logic:iterate>
</ul>
</li>
</logic:iterate>
</ul>
</div>
我得到的是章节的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="#">第一章 项目管理 </a>
<ul>
<li class="Child">第一节 <a href="outlineinfo.htm">我是1.1 </a> </li>
<li class="Child">第二节 <a href="#">我是1.2 </a> </li>
<li class="Child">第三节 <a href="#">我是1.3 </a> </li>
<li class="Child">第四节 <a href="#">我是1.4 </a> </li>
</ul>
</li>
</ul>
<bean:write name="id"/>. // 序号
<bean:write name="element" property="key"/>: // 键名
<bean:write name="element" property="value"/> // 键值
</logic:iterate>