freemarker 在ftl页面通过#list 获取后台存入map值并放去select的option中

来源:互联网 发布:淘宝固定背代码 编辑:程序博客网 时间:2024/05/29 11:41
      项目采用SpringMVC+MyBatis 框架。
       页面显示下拉选项框select中的信息(option),是用字符串类型的参数“1.AA,2.BB,3.CC”维护起来,以后修改参数就可以了,不用动代码。我在后台Controller中,通过分割截取参数,以“key=1,value=AA...”的形式存入dataMap 中,然后在前端ftl页面上利用freemarker变量之一的list来遍历dataMap 并存到下拉选项框中的option中,结果报错:freemarker.core.InvalidReferenceException: Expression dataMap is undefined 。
我的ist遍历方法和网上说的一样,代码如下:
<select name="groupid" id="groupidId" class="select01">         <option value ="">--请选择--</option>         <#if dataMap?exists>          <#list dataMap?keys as key>          <option value="${key}">${dataMap.get(key)}</option>         </#list>         </#if></select>
      上网搜了很久,还是没能解决,后来才发现关键问题所在。
       我的原Controller层代码也贴出来:
@Controller@RequestMapping("/hrm/outsync/hrmOutsyncLogAct.do")public class HrmOutsyncLogAct extends BaseAct {@Autowiredprivate HrmOutsyncLogMng hrmOutsyncLogMng; @Autowiredprivate DictSysParamMng dictSysParamMng;@RequestMapping(params ="method=findByPage")public String <span style="color:#FF0000;">findByPage</span>(HttpServletRequest request, ModelMap model,EHrmOutsyncLog eHrmOutsyncLog) throws Exception {if (!this.rightAuth(request, "SysAdmin")) {return "/msg/noright";}return "/hrm/hrmOutsyncLog/hrmOutsyncLogList";}@RequestMapping(params ="method=getAjaxData")@ResponseBodypublic String <span style="color:#FF0000;">getAjaxData</span>(HttpServletRequest request, ModelMap model,EHrmOutsyncLog eHrmOutsyncLog) throws Exception {if (!this.rightAuth(request, "SysAdmin")) {return this.beanToJson(new PagerVO());}initPageCom(request);eHrmOutsyncLog.decode();PagerVO pv = hrmOutsyncLogMng.findByPage(eHrmOutsyncLog);<span style="color:#FF0000;">model.addAttribute("dataMap",this.getGroupidName());</span>@SuppressWarnings("unchecked") List<EHrmOutsyncLog> li=(List<EHrmOutsyncLog>) pv.getDatas(); if(!Util.isBlank(li)) { for (EHrmOutsyncLog eHrmOutsyncLog2 : li) { eHrmOutsyncLog2.setGroupidName(this.getGroupidName().get(eHrmOutsyncLog2.getGroupid().toString())); } } v.setDatas(li); return this.beanToJson(pv); }public Map<Object,String> getGroupidName() throws Exception { String str = dictSysParamMng.getValueByCode("groupidName"); String[] strs = str.split(","); Map<Object, String> dataMap = new HashMap<Object, String>(); for(String s : strs){ String[] strs1 = s.split(":"); dataMap.put(strs1[0], strs1[1]);              } return dataMap; }}
    描述下业务:我点击页面对应菜单后,首先会调用findByPage()方法,然后进行权限判定,(有权限)转到hrmOutsyncLogList.ftl页面,此时页面会向后台发出getAjaxData()方法,这时候就会通过service,dao,向数据库查询数据,最后获得的数据会显示在页面对应的位置。页面中有查询按钮,其中有下拉选项框select,里面的数据如前所说所获得。
疑问:通过在后端遍历证明,dataMap中有数据.我也将dataMap放到Modelp 中了,前端的遍历也是没错的,但为什么前端页面没能获取dataMap呢?
原因:症结就是这两个方法findByPage(),getAjaxData()。点击菜单后下一步,select中option的值,也就是页面中dataMap就应该接收到值,而此时并没有向后台发送请求,也就是说应该先出来option中的值,再在页面上显示从数据库中查询出来的数据。从代码
<span style="color:#FF0000;">model.addAttribute("dataMap",this.getGroupidName());</span>
的位置看得出来,这句放错地方了,应该是
@RequestMapping(params ="method=findByPage")public String findByPage(HttpServletRequest request, ModelMap model,EHrmOutsyncLog eHrmOutsyncLog) throws Exception {if (!this.rightAuth(request, "SysAdmin")) {return "/msg/noright";}<span style="color:#FF0000;">model.addAttribute("dataMap",this.getGroupidName());</span>return "/hrm/hrmOutsyncLog/hrmOutsyncLogList";}
     这样就成功一大半了。为啥不是没问题了呢?我发现项目运行后,dataMap是有值了,但是dataMap.get(key)却取不到值,我的key是String类型的,按理说上面freemarker的遍历map方法没问题,不知道是人品问题不。后来换成了dataMap[key],这样就能成功显示option中的值了.

后记:刚接触Java不久,很多连概念都不是很熟,不过对Java挺感兴趣的,相识恨晚的感觉。为了更好的提升Java能力,也为了更好走程序这条路,今天开通博客,记录自己的成长过程。生命不息,奋斗不止!






1 0