使用struts2 dojo标记填充其他选择的下拉列表

时间:2011-10-25 05:20:41

标签: ajax dojo struts2

我有两个下拉菜单。我想在选择第一个下拉列表时填充第二个下拉列表。 我正在使用struts-dojo-tags来实现这一目标。

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="sx" uri="/struts-dojo-tags"%>
<html>
<head>
<title>Welcome</title>
<script>
</script>
<sx:head />
</head>
<body>
<h2>Struts 2 + Ajax Example 2!</h2>
<s:form name="f1">
<s:textfield name="proj" label="Project Name" />
<s:url id="url" value="/populateStates.action" />
<s:select id="id1" list="countryList"
    listKey="countryId" listValue="countryName" headerKey="0"
    headerValue="-Select-" label="Country"/>
<s:select id="id2" list="list2" listKey="stateId"
    listValue="stateName" headerKey="0" headerValue="-Select-"
    label="State" />
<sx:bind sources="id1" targets="id2" events="onchange"
    href="%{#url}" />
</s:form>
<br>
</body>
</html>

我的动作类有两种动作方法。

        public String populateCountry() throws Exception{

    list1 = new ArrayList<Country>();
    list1.add(new Country(1, "Country1"));
    list1.add(new Country(2, "Country2"));
    list1.add(new Country(3, "Country3"));

    return SUCCESS;
}

public String populateStates() throws Exception{

    System.out.println("populateStates******************"+id1);

    list2 = new ArrayList<State>();

    if (id1 != null && !id1.equals("")) 
    {   
        if(id1.equals("1"))
        {
            list2.add(new State(1, "UMB1"));
            list2.add(new State(2, "UMB2"));
            list2.add(new State(3, "UMB3"));
        }
        else if(id1.equals("2"))
        {
            list2.add(new State(4, "UMB4"));
            list2.add(new State(5, "UMB5"));
            list2.add(new State(6, "UMB6"));
        }
        else if(id1.equals("3"))
        {
            list2.add(new State(7, "UMB7"));
            list2.add(new State(8, "UMB8"));
            list2.add(new State(9, "UMB9"));
        }       
    }
    return SUCCESS;
}

第一次加载jsp时会调用第一个操作方法(填充Country下拉列表),当我从Country下拉列表中选择一个国家/地区时,会调用第二个操作方法。

问题:States下拉列表没有填充。当我调试代码时,我看到当控制到达populateStates时,我的Action类的所有变量都被重置(id1,id2,list1,list2,proj)。由此我得到一个空状态下拉列表。请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

我认为<sx:bind>不符合您的想法;目标的HTML将被操作返回的内容替换。

你可以尝试返回只是 <option>的列表(也许这就是你正在做的事情),但我不相信它会工作。 (如果确实如此,请务必跟进自己的答案。)

我实际上建议使用jQuery插件; Dojo标签已经被弃用了一段时间,使用了一个非常过时的Dojo版本,并且通常很难使用。

另一种选择是使用普通的旧jQuery(或您选择的库) - 它几乎总是比通过标记库实现自定义功能更容易。 Ajax标签库非常适用于非常简单的用例,但只要有任何自定义,我就不相信它们会节省很多精力。 YMMV。