<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>
使用 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>
相关文章推荐
- struts2中的ognl
- struts2 jquery 打造无限层次的树
- 使用struts2+Ajax+jquery验证用户名是否已被注册
- Ajax+Struts2实现验证码验证功能实例代码
- struts2入门Demo示例
- 通过Ajax两种方式讲解Struts2接收数组表单的方法
- SSH框架网上商城项目第7战之整合Struts2和Json
- Struts2+Hibernate实现数据分页的方法
- ajax交互Struts2的action(客户端/服务器端)
- struts2 spring整合fieldError问题
- Struts2的s:radio标签使用及用jquery添加change事件
- 解决jsp开发中不支持EL问题
- 使用MyEclipse 开发struts2框架实现登录功能(结构教程)
- struts2 中文乱码的解决办法分享
- Struts2访问servlet分享
- 在JSTL EL中处理java.util.Map,及嵌套List的情况
- java el简介及用法
- struts2单个文件上传的两种实现方式
- 通过实例深入学习Java的Struts框架中的OGNL表达式使用
- struts2+jsp实现文件上传的方法