请教jsf二级联动的问题
网上介绍的两种做法 我都试了 虽然可以联动了 但是调用不了bean中的方法 这是为什么呀
如方法一:
<script>
function formSubmit(){
... ...
document.getElementById( "myForm:myButton ").click();
}
</script>
<f:view>
<h:form id= "myForm ">
<h:selectOneMenu id= "gradeId "
onchange= "formSubmit() "
value= "#{myBean.gradeId} "
required= "true ">
<f:selectItems value= "#{myBean.gradeList} " />
</h:selectOneMenu>
<h:selectOneMenu id= "classId " value= "#{myBean.classId} ">
<f:selectItems value= "#{myBean.classList} " />
</h:selectOneMenu>
<h:commandButton id= "myButton "
value= "Submit "
action= "#{myBean.update} "
style= "visibility:hidden; " />
</h:form>
</f:view>
myBean:
private String gradeId;
private String classId;
public void update() {
System.out.println( "********************************* ");
System.out.println( "gradeId: " + this.gradeId);
System.out.println( "classId: " + this.classId);
}
用方法一去做 运行时 选择grade后 页面会刷新一次 又回到没选的状态 而且没有执行update方法 请问高手们 可能是什么原因呢
方法二
<h:selectOneMenu id= "gradeId "
value= "#{myBean.gradeId} "
onchange= "submit() "
required= "true "
valueChangeListener= "#{myBean.update} ">
<f:selectItems value= "#{myBean.gradeList} "/>
</h:selectOneMenu>
<h:selectOneMenu id= "classId " value= "#{myBean.classId} ">
<f:selectItems value= "#{myBean.classList} "/>
</h:selectOneMenu>
用方法二时 联动正常 而且也执行了update方法 但是打印的结果都是null 请问高手们 怎么才能在联动后得到他们的值呀 郁闷两天了
[解决办法]
方法一:
document.getElementById( "myForm:myButton ").click();
直接改为
document.forms[ "myForm "][ "myForm:_idcl "].value= "myForm:myButton ";
document.forms[ "myForm "].submit();
方法二:
如dfmouse(耗子) 所说.补充一下valueChangeListener的使用机制是不调用set方法,而action是调用set方法的.
[解决办法]
选择后还要提交刷新啊,
不用这么麻烦的,先把数据取出来再操作好了,也可以用AJAX来做
给你一个我用的
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME= "Generator " CONTENT= "EditPlus ">
<META NAME= "Author " CONTENT= " ">
<META NAME= "Keywords " CONTENT= " ">
<META NAME= "Description " CONTENT= " ">
<style type= "text/css ">
body{font-family:Courier New, Courier}
select{font-size:8pt;font-family:Courier New, Courier}
input{font-size:8pt;font-family:Courier New, Courier}
</style>
<SCRIPT LANGUAGE= "JavaScript ">
<!--
var sSele=new Array();
sSele[0]=new Array( '1 ', '11 ', '1 ');
sSele[1]=new Array( '2 ', '22 ', '1 ');
sSele[2]=new Array( '3 ', '33 ', '1 ');
sSele[3]=new Array( '4 ', '44 ', '1 ');
sSele[4]=new Array( '5 ', '55 ', '2 ');
sSele[5]=new Array( '6 ', '66 ', '2 ');
sSele[6]=new Array( '7 ', '77 ', '2 ');
sSele[7]=new Array( '8 ', '88 ', '2 ');
//上面这段你从数据库取中类表的值,第一位是ID,第二位是NAME,第三位是所属大类的ID
var sSele1=new Array();
sSele1[0]=new Array( '1 ', '11 ', '1 ');
sSele1[1]=new Array( '2 ', '22 ', '2 ');
sSele1[2]=new Array( '3 ', '33 ', '3 ');
sSele1[3]=new Array( '4 ', '44 ', '4 ');
sSele1[4]=new Array( '5 ', '55 ', '5 ');
sSele1[5]=new Array( '6 ', '66 ', '6 ');
sSele1[6]=new Array( '7 ', '77 ', '7 ');
sSele1[7]=new Array( '8 ', '88 ', '8 ');
sSele1[8]=new Array( '9 ', '99 ', '1 ');
sSele1[9]=new Array( '10 ', '10 ', '2 ');
sSele1[10]=new Array( '11 ', '11 ', '3 ');
sSele1[11]=new Array( '12 ', '12 ', '4 ');
sSele1[12]=new Array( '13 ', '13 ', '5 ');
sSele1[13]=new Array( '14 ', '14 ', '6 ');
sSele1[14]=new Array( '15 ', '15 ', '7 ');
sSele1[15]=new Array( '16 ', '16 ', '8 ');
//上面这段你从数据库取小类表的值,第一位是ID,第二位是NAME,第三位是所属中类的ID
//联动函数,type1为你所想操作的select的名字,pid为当前select的值,name为“请选择产品小类”这类你想设定操作select的默认值,sSelename为所操作select所用到那个数组
function onChange(type1,pid,name,sSele,checkname)//这里加个checkname的参数,是本类的选定ID
{
ln = type1.options.length;
while(ln--) {
type1.options[ln] = null;
}
type1.add(new Option(name, "0 "));
for(i=0;i <sSele.length;i++)
{
if(sSele[i][2]==pid)
{
if(sSele[i][0]==checkname)
type1.add(new Option(sSele[i][1],sSele[i][0],true, 'selected '));//这样写才行
else
type1.add(new Option(sSele[i][1],sSele[i][0]));
}
}
}
//呵呵,这个也是无限级联动下拉框了
//-->
</SCRIPT>
</HEAD>
<!--在BODY里加上onload来执行, 这个1是传过来的大类ID, 这个3是传过来的中类ID,这个3也是, 这个3是传过来的小类ID,你分别用 <%=fsort_id%> <%=Sort_id%> <%=Nsortid%> 代替就行了-->
<BODY BGCOLOR= "#FFFFFF " onload= "onChange(add1.sort,1, '请选择产品中类 ',sSele,3);onChange(add1.nsort,3, '请选择产品中类 ',sSele1,3); ">
<table width= "100% " border= "1 " cellspacing= "0 " cellpadding= "3 " align= "center " bordercolorlight= "#ECEEE4 " bordercolordark= "#CCCABC ">
<tr>
<td width= "100% " height= "30 " colspan= "6 " align= "center " background= "images/tablebg.gif "> <b> 产 品 信 息 管 理 </b> </td>
</tr>
<form action= "AddProduct " method= "post " enctype= "multipart/form-data " name= "add1 " onSubmit= "return check(); ">
<input type= "hidden " name= "id " value= " <%=id%> "/>
<tr>
<td height= "25 " align= "left "> 所属类别:
<select size= "1 " name= "fsort " onChange= "javascipt:onChange(add1.sort,this.value, '请选择产品中类 ',sSele); " >
<option value= "0 "> 请选择产品大类 </option>
<option value = "1 " selected> 1 </option> ;
<option value = "2 " > 2 </option> ;
</select>
<select size= "1 " name= "sort " onChange= "javascipt:onChange(add1.nsort,this.value, '请选择产品小类 ',sSele1); ">
<option value= "0 " selected> 请选择产品中类 </option>
</select>
<select size= "1 " name= "nsort ">
<option value= "0 " selected> 请选择产品小类 </option>
</select> <span class= "style1 "> * </span> </td>
</tr>
</form>
</table>
</BODY>
</HTML>
生成数组用这个方式
for(int i=0;i <parrStsUserList.size();i++)
{
pobjShangpin = (Shangpin)parrStsUserList.get(i);
out.println( "name[ "+i+ "]=new Array( ' "+pobjShangpin.getShangpin_type()+ " ', ' "+pobjShangpin.getShangpin_spec()+ " ', ' "+pobjShangpin.getShangpin_grade()+ " '); ");
}
[解决办法]
楼主可以改一下我的代码试试看,改我的代码应该不是很难吧。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN "
"http://www.w3.org/TR/html4/loose.dtd ">
<html>
<head>
<meta http-equiv= "Content-Type " content= "text/html; charset=gb2312 ">
<title> 无标题文档 </title>
</head>
<script>
function an(){
while(f.s2.length> 0){
f.s2.remove(0);
}
//l = f.s2.length ;
//for (var i=0;i <l;i++){
// f.s2.remove(0);
//}
if(f.s1.value== "1 "){
newOpt=document.createElement( "OPTION ");
newOpt.value= "1 ";
newOpt.text= "1 ";
f.s2.add(newOpt);
newOpt=document.createElement( "OPTION ");
newOpt.value= "11 ";
newOpt.text= "11 ";
f.s2.add(newOpt);
newOpt=document.createElement( "OPTION ");
newOpt.value= "111 ";
newOpt.text= "111 ";
f.s2.add(newOpt);
}
if(f.s1.value== "2 "){
newOpt=document.createElement( "OPTION ");
newOpt.value= "2 ";
newOpt.text= "2 ";
f.s2.add(newOpt);
newOpt=document.createElement( "OPTION ");
newOpt.value= "22 ";
newOpt.text= "22 ";
f.s2.add(newOpt);
newOpt=document.createElement( "OPTION ");
newOpt.value= "222 ";
newOpt.text= "222 ";
f.s2.add(newOpt);
}
if(f.s1.value== "3 "){
newOpt=document.createElement( "OPTION ");
newOpt.value= "3 ";
newOpt.text= "3 ";
f.s2.add(newOpt);
newOpt=document.createElement( "OPTION ");
newOpt.value= "33 ";
newOpt.text= "33 ";
f.s2.add(newOpt);
newOpt=document.createElement( "OPTION ");
newOpt.value= "333 ";
newOpt.text= "333 ";
f.s2.add(newOpt);
}
}
</script>
<body>
<form name= "f " method= "post " action= " ">
<select name= "s1 " onChange = "an() ">
<option value= "1 "> 1 </option>
<option value= "2 "> 2 </option>
<option value= "3 "> 3 </option>
</select>
<select name= "s2 ">
<option value= "1 "> 1 </option>
<option value= "11 "> 11 </option>
<option value= "111 "> 111 </option>
</select>
<select name= "select ">
</select>
</form>
</body>
</html>