您的位置:首页 > 编程语言 > Java开发

<s:doubleselect 的使用-不支持EL表达式,需要使用OGNL来动态赋值-could not be resolved as a collection/array/map/enumerati

2016-08-20 11:18 393 查看
1、问题描述:

使用 struts2 设置级联下拉菜单,需要从后台数据库动态搜索下拉列表的选项,使用<s:doubleselect 标签时发现无法使用EL表达式 即 ${"name"} 动态赋值,报错

class org.apache.jasper.JasperException:tag 'doubleselect', field 'list', name 'cooperateType': The requested list key '#bs.keySet()' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location] 

2、问题分析:

网上查询之后,说struts2 在某个版本后不再支持EL表达式赋值,而是需要使用ognl 表达式了,类似于  #request.name 、#session.name

3、问题解决

第一步:

在非动态赋值下的<s:doubleselect 标签 的使用,下面的例子中对样式做了微调,关于样式调整请参考点击打开链接

css样式

<style type="text/css">
.doubleselecth br{
display: none;
}
</style>

<s:doubleselect 标签 的使用必须在 <s:form 中

<span class="doubleselecth">
<s:set name="bs2" value="#{'业务分类':{'渠道来源'<span style="font-family: Arial, Helvetica, sans-serif;">},'WAP直销':{'长春市','吉林市','延吉市','通化市'},'链接推广':{'青岛市','滨州市'},'后台对接':{'沈阳市','大连市'}}"></s:set></span>
<span style="white-space:pre"> </span><s:set name="bs" value="#bs"></s:set>
<s:form id="formfdoubleselect">
渠道选择:
<s:doubleselect doubleCssStyle="width:100px;" cssStyle="width:100px;" name="cooperateType" doubleList="#bs[top]" list="#bs.keySet()" doubleName="channelname" ></s:doubleselect>
</s:form>
</span>

第二步:
动态赋值下的<s:doubleselect 

java部分的代码提供setter和getter方法

参数的形式必须是Map<String,List> ,关于Map的无序问题请参考 点击打开链接

private Map<String,List> l2;

//getter和setter 方法

public Map<String, List> getL2() {
return l2;
}

public void setL2(Map<String, List> l2) {
this.l2 = l2;
}



参数的组织,规则是,Map是LinkedHashMap,这样Map是有序的,然后键值对的key是String,value是list,key最后就是级联列表的第一个下拉框内容,value是每个首选项的子选项,即第二个下拉框显示的内容

//查询目前所有的 渠道名、项目分类
List<Object []> l=bcCooperateService.getChannelname_cooperateTypeAll();
//业务分类 渠道来源 全部
List listx=new ArrayList();
listx.add("渠道来源");//业务分类
//WAP直销 请选择 cooperateType=00
List list00=new ArrayList();
list00.add("请选择");//WAP直销
//后台对接 请选择 cooperateType=01
List list01=new ArrayList();
list01.add("请选择");//后台对接
//链接推广 请选择 cooperateType=02
List list02=new ArrayList();
list02.add("请选择");//链接推广
//特殊账号 请选择 cooperateType=03
List list03=new ArrayList();
list03.add("请选择");//特殊账号
//合作方式 :00-(WAP直销)网销配置,非合作;01-(后台对接)接口方式;02-(链接推广)链接推广;03-(特殊账号)特殊账号
//{'业务分类':{'渠道来源',吉林','辽宁','河北','山东','山西','北京','上海'},'WAP直销':{'请选择'},'后台对接':{'吉林','辽宁'},'链接推广':{'请选择','河北','山东','山西','北京'},'特殊账号':{'请选择','上海'}}
for(Object[] obj:l){
if("00".endsWith((String) obj[0])){
listx.add(obj[1]);

list00.add(obj[1]);
}else if("01".endsWith((String) obj[0])){
listx.add(obj[1]);

list01.add(obj[1]);
}else if("02".endsWith((String) obj[0])){
listx.add(obj[1]);

list02.add(obj[1]);
}else if("03".endsWith((String) obj[0])){
listx.add(obj[1]);

list03.add(obj[1]);
}
}

l2=new LinkedHashMap();

l2.put("业务分类", listx);
l2.put("WAP直销", list00);
l2.put("后台对接", list01);
l2.put("链接推广", list02);
l2.put("特殊账号", list03);

JSP页面部分,需用ognl 语言获取后台传值

<span class="doubleselecth">
<s:form id="formfdoubleselect">
<s:set name="bs" value="#request.l2"></s:set>
渠道选择:
<s:doubleselect doubleCssStyle="width:100px;" cssStyle="width:100px;" name="cooperatetype" doubleList="#bs[top]" list="#bs.keySet()" doubleName="channelname" ></s:doubleselect>
</s:form>
</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息