java jdk1.5为什么获取不到ftl页面的值
发布网友
发布时间:2022-04-22 18:03
我来回答
共1个回答
热心网友
时间:2023-06-27 15:50
项目采用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遍历方法和网上说的一样,代码如下:
[html] view plain copy print?
<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层代码也贴出来:
[java] view plain copy print?
@Controller
@RequestMapping("/hrm/outsync/hrmOutsyncLogAct.do")
public class HrmOutsyncLogAct extends BaseAct {
@Autowired
private HrmOutsyncLogMng hrmOutsyncLogMng;
@Autowired
private 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")
@ResponseBody
public 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,,向数据库查询数据,最后获得的数据会显示在页面对应的位置。页面中有查询按钮,其中有下拉选项框select,里面的数据如前所说所获得。
疑问:通过在后端遍历证明,dataMap中有数据.我也将dataMap放到Modelp 中了,前端的遍历也是没错的,但为什么前端页面没能获取dataMap呢?
原因:症结就是这两个方法findByPage(),getAjaxData()。点击菜单后下一步,select中option的值,也就是页面中dataMap就应该接收到值,而此时并没有向后台发送请求,也就是说应该先出来option中的值,再在页面上显示从数据库中查询出来的数据。从代码
[java] view plain copy print?
<span style="color:#FF0000;">model.addAttribute("dataMap",this.getGroupidName());</span>
的位置看得出来,这句放错地方了,应该是
[java] view plain copy print?
@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中的值了.