最近在项目中用到了一个需要联动的地方,我有很多个专业课。每个专业课有很多个知识点。现在我希望的是使用选择了一个专业课之后,对应的知识点在二级下拉框中也对应改变。这个实现如果使用ajax的话,可以实现。
我用的是SSH,struts2中有联动标签,不过这个标签好像并不是很好用。还是说说我的思路吧:我先查出一个专业所对应的专业课,然后根据专业课id来查出专业课所对应的知识点。然后显示在前台,保证专业课和知识点可以联动。
/* * 查找相应课程名所对应的知识点 * */ public List<Knowl> findkno(int i) { // TODO Auto-generated method stub List<Knowl> list=new ArrayList<Knowl>(); list=this.getHibernateTemplate().find("from Knowl as kn where kn.cname="+i); return list; } /* * 查找相应专业所对应的课程 */ public List<Cname> findcno(String str) { // TODO Auto-generated method stub List<Cname> list=new ArrayList<Cname>(); list=this.getHibernateTemplate().find("from Cname as cn where cn.spec=?", str); return list; } /* * 查找相应课程所对应的id */ public List<Integer> getcnid(String str) { // TODO Auto-generated method stub List<Integer> list = new ArrayList<Integer>(); list=this.getHibernateTemplate().find("select cn.cnameId from Cname as cn where cn.cname=?",str); return list; }
用一个action来调用这些方法:
lk=new ArrayList<Knowl>();
ls=new ArrayList<Integer>();
map=new HashMap();
list=cdao.findcno("JAVA");//获得java专业所对应的专业课集合
/*
* 遍历课程名得到每一个课程的id
* */
for(int i=0;i<list.size();i++){
String str=list.get(i).getCname();//获得各个专业课所对应的专业课名字
ls=cdao.getcnid(str);//获得每一个专业课的id
for(int z=0;z<ls.size();z++){
int j=(int)ls.get(z);
lk=cdao.findkno(j);//获得每一门专业课所对应的知识点
map.put(j, lk);
}
}
return "success";
list是要交给前台显示的一级菜单。map是要显示的二级菜单.其中j为每个专业课所对应的id。
前台是这样显示的:
<s:doubleselect name="first" list="list" listKey="cname" listValue="cname" doubleName="second" doubleList="map.get(cnameId)" doubleListKey="knowl" doubleListValue="knowl" formName="suibian" theme="simple"> </s:doubleselect>
网上有哥们这样做,doubleList="map.get(top.id)",我试过用,没能实现。map.get(cnameId)也能直接得到那个对象。 listKey="cname"也可一些成cnameId.
cname,cnameId都是对象Cname中的属性。就是专业课那张表的属性,knowl为知识点那个对象的一个属性。
而且formName="suibian" 也要跟表单的名字保持一致,不然也出不来。我按照这种方式实现了我的要求。
希望可以提供给需要的兄弟们一些启示,有高见的也请不吝赐教。