webwork的<ww:doubleselect>标签提供了一种级联select的解决方案,也就是说,使用这个标签可以生成两个select,分别为两个select设置列表数值,然后可以根据第一个select的选择,动态的改变第二个select的内容。当然,这部分并不是ajax的效果,只是用js实现的,当然,相关的js代码也是webwork生成的
我们看一个事例:
Action:
package ch11;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.opensymphony.xwork.ActionSupport;

public class ModifyUser extends ActionSupport ...{
private String region;
private String stateID;

public String execute() throws Exception ...{
System.out.println(this.getRegion()+"--"+this.getStateID());
return SUCCESS;
}

public String getRegion() ...{
return region;
}
public void setRegion(String region) ...{
this.region = region;
}
public String getStateID() ...{
return stateID;
}
public void setStateID(String stateID) ...{
this.stateID = stateID;
}


}
JSP:
<ww:doubleselect label="state" name="region"
doubleName="stateID"
list="{'California','Oregon'}"
doubleList="top=='California'?
{'California1','California2'}:
{'Oregon1','Oregon2'}"/>
这部分是标签定义,值得说明的是name是第一个select的名字,对应action中的region属性,doubleName是第二个select的名字,对应action中的stateID属性,doubleList是设置第二个select的动态数值,本例中使用了三元表达式,比较简单,不在赘述,当然,我们也可以使用action中定义的collection实现
运行页面,可以看到我们选择第一个select中的California1, 第二个select会自动的变成Oregon1,提交后,后台也会打印出正确的选择:Oregon--Oregon2
但是,我发现了一个问题,就是如果我的region和stateID不是action的属性,而是一个user类的属性,而user类是action的一个属性,按照其他webwork标签的做法,我们做了如下定义:
<ww:doubleselect label="state" name="user.region"
doubleName="user.stateID"
list="{'California','Oregon'}"
doubleList="top=='California'?
{'California1','California2'}:
{'Oregon1','Oregon2'}"/>
运行程序,结果出错,爆出了javascript脚本错误,打开页面的源代码,发现webwork生成了如下js:
<script type="text/javascript">
var user.regionGroup = new Array(2 + 0);
var user.regionTemp = document.testUI.user.stateID;
user.regionRedirect(0);
function user.regionRedirect(x) {
var selected = false;
for (m = user.regionTemp.options.length - 1; m >= 0; m--) {
user.regionTemp.options[m] = null;
}
for (i = 0; i < user.regionGroup[x].length; i++) {
user.regionTemp.options[i] = new Option(user.regionGroup[x][i].text, user.regionGroup[x][i].value);
}
if ((user.regionTemp.options.length > 0) && (! selected)) {
user.regionTemp.options[0].selected = true;
}
}
</script>
大家注意看红色的部分,这明显不符合js的变量命名规则(不能有"."),这就是为什么其他标签可以使用"."来表达对象属性的关系,而<ww:doubleselect>标签不可以这么做,都是因为doubleselect合其他tag不一样,她要生成javascript脚本
希望webwork在以后的版本会有所改进,我用的版本是2.2.4
本文介绍了WebWork框架中<ww:doubleselect>标签的应用,该标签用于创建级联下拉列表。文章通过示例详细解释了其工作原理,并探讨了在复杂对象属性路径上的使用限制。
483

被折叠的 条评论
为什么被折叠?



