Struts2双选双头OGNL

时间:2014-07-02 09:26:41

标签: java struts2

我正在使用Struts 2.3.15.1 在JSP中使用doubleselect标记时如下

<s:form action="testSubmit">

<label>State and District</label>
<s:doubleselect list="#request.statDistMap.keySet()" name="statename" headerValue="#request.state" doubleName="districtid"
doubleList="#request.statDistMap[top]" doubleListKey="districtid" doubleListValue="districtname"
doubleHeaderKey="#request.districtid" doubleHeaderValue="#request.districtname"/>

<s:submit cssClass="submitButton" title="Submit" value="Submit"></s:submit>

</s:form>

...有一个Action类:

public class HelloWorld extends ActionSupport implements RequestAware {

    private Map requestMap;

    public void setRequest(Map requestMap) {
        this.requestMap = requestMap;

    }

    public String execute() throws Exception {
        Map statDistMap = new HashMap();
        List l1 = new ArrayList();
        List l2 = new ArrayList();
        DistrictDTO d1 = new DistrictDTO();
        d1.setDistrictid(1);
        d1.setDistrictname("Indiana");
        DistrictDTO d2 = new DistrictDTO();
        d2.setDistrictid(2);
        d2.setDistrictname("Ohio");
        DistrictDTO d3 = new DistrictDTO();
        d3.setDistrictid(3);
        d3.setDistrictname("Alabama");
        DistrictDTO d4 = new DistrictDTO();
        d4.setDistrictid(4);
        d4.setDistrictname("Mississippi");
        l1.add(d1);
        l1.add(d2);
        l2.add(d3);
        l2.add(d4);
        statDistMap.put("East North Central", l1);
        statDistMap.put("East South Central", l2);
        requestMap.put("statDistMap", statDistMap);
        requestMap.put("state", "Mid-Atlantic");
        requestMap.put("districtid", 5);
        requestMap.put("districtname", "New York");

        return SUCCESS;
    }
}

....渲染JSP,第二个选择不评估OGNL

doubleHeaderKey="#request.districtid" doubleHeaderValue="#request.districtname"

"#request.districtname"显示在下拉列表中。 第一个选择中的标题值工作正常。

知道我哪里错了吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

doubleselect.ftl生成一个JavaScript函数,该函数根据第一个select(作为参数)的selectedId填充第二个选择的选项。它还会在页面渲染时首次调用此函数,只是为了选择第二次选择中的一个选项

${parameters.id}Redirect(${redirectTo});

我们可以编写并调用我们自己的函数来填充第二个选择选项并首次选择所选选项,例如

function initialize() {
        var selected = false;

        ${parameters.id}Temp.options[0] = new Option("${dhv?js_string}", "${dhk?js_string}");

        if ((${parameters.id}Temp.options.length > 0) && (! selected)) {
            ${parameters.id}Temp.options[0].selected = true;
        }
    }

此外,dhv和dhk是doubleHeaderValue和doubleHeaderKey,它们可以是OGNL表达式,在ftl中指定和评估如下:

<#if parameters.doubleHeaderKey?? && parameters.doubleHeaderValue??>
             <#global dhv = stack.findString(parameters.doubleHeaderValue)/>
             <#global dhk = stack.findString(parameters.doubleHeaderKey)/>
</#if> 

我们可以删除外部迭代器中的代码,它将doubleheader添加到每个选项组:

<#if parameters.doubleHeaderKey?? && parameters.doubleHeaderValue??>
        ${parameters.id}Group[${itemCount}][${doubleItemCount}] = new Option("${doubleHeaderValue?js_string}", "${doubleHeaderKey?js_string}");
            <#assign doubleItemCount = doubleItemCount + 1/>
</#if>

事实上,有多种方法可以根据您的要求实现您的需求。希望这有助于某人。