Webwork的标签的一个bug

本文介绍了WebWork框架中<ww:doubleselect>标签的应用,该标签用于创建级联下拉列表。文章通过示例详细解释了其工作原理,并探讨了在复杂对象属性路径上的使用限制。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值