enjoy——遍历Map>问题

//以下是Controller代码 获取所有的菜单 然后根据上级id作为Map的主键 按照顺序
//存储一个主菜单和所有的子菜单
public void home() {
	//获取所有的菜单
	List<Module> parentList = DaoFactory.moduleDao().findAllModule();
	Map<String, List<Module>> moduleMap = new HashMap<String, List<Module>>();
	List<Module> temp = null;
	//遍历所有的菜单,以主菜单id为主键 保存所有子菜单在一个list里
	for (Module m : parentList) {
		temp = new ArrayList<Module>();
		if (m.getPmid() == 0) {
	            temp.add(m);
		    moduleMap.put(m.getId().toString(), temp);
		} else {
	            temp = moduleMap.get(m.getPmid().toString());
		    temp.add(m);
		    moduleMap.put(m.getPmid().toString(), temp);
		}
	}
	setAttr("moduleMap", moduleMap);
	render("/admin/index.html");
}
//以下代码是前台遍历的代码
//遍历Map 获取所有菜单
#for(list:moduleMap) 
    //遍历获取到的List
     #for(m:list) 
         //获取第一个主菜单
         #if(for.first)
            <li class="layui-nav-item layui-nav-itemed"><a class=""
        	href="javascript:;">#(m.name)</a> --》这里报错
            <dl class="layui-nav-child">
         #else
         //获取所有子菜单
             <dd>
       		<a class="hp-tab-add" hp-href="#(ctx)#(m.url)"
      	        href="javascript:;">#(m.name)</a>
        	</dd>
         #end
         //补全剩余tag 
         #if(for.last)
            </dl></li>
         #end 
       #end 
#end

Map 的值 : 

{1=[{id:1, iconpath:/upload/module/20180111174509.jpg, pmid:0, name:系统管理, url:null}, 
{id:2, iconpath:/upload/module/20180111174530.jpg, pmid:1, name:菜单管理, url:/module/manage}, 
{id:3, iconpath:/upload/module/20180111174541.jpg, pmid:1, name:会员管理, url:/user/manage}, 
{id:4, iconpath:/upload/module/20180111175116.jpg, pmid:1, name:角色管理, url:/role/manage}]}


后台报错:(78行为第一个 #(m.name)的那行)

[23:28:59|ERROR|(com.jfinal.core.ActionHandler)]=[/admin/home]
com.jfinal.render.RenderException: com.jfinal.template.TemplateException:
 In the class com.jfinal.template.stat.ast.ForEntry 
 can not find getName() method, also can not find "name" field
Template: "/admin/index.html". Line: 78
	at com.jfinal.render.TemplateRender.render(TemplateRender.java:63)
	at com.jfinal.core.ActionHandler.handle(ActionHandler.java:99)
	at com.jfinal.ext.handler.ContextPathHandler.handle(ContextPathHandler.java:48)
	at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:74)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)
Caused by: com.jfinal.template.TemplateException: 
In the class com.jfinal.template.stat.ast.ForEntry 
can not find getName() method, also can not find "name" field
Template: "/admin/index.html". Line: 78
	at com.jfinal.template.expr.ast.Field.eval(Field.java:98)
	at com.jfinal.template.expr.ast.ExprList.eval(ExprList.java:59)
	at com.jfinal.template.stat.ast.Output.exec(Output.java:46)
	at com.jfinal.template.stat.ast.StatList.exec(StatList.java:47)
	at com.jfinal.template.stat.ast.If.exec(If.java:53)
	at com.jfinal.template.stat.ast.StatList.exec(StatList.java:47)
	at com.jfinal.template.stat.ast.For.forIterator(For.java:74)
	at com.jfinal.template.stat.ast.For.exec(For.java:53)
	at com.jfinal.template.stat.ast.StatList.exec(StatList.java:47)
	at com.jfinal.template.stat.ast.For.forIterator(For.java:74)
	at com.jfinal.template.stat.ast.For.exec(For.java:53)
	at com.jfinal.template.stat.ast.StatList.exec(StatList.java:47)
	at com.jfinal.template.Template.render(Template.java:49)
	at com.jfinal.render.TemplateRender.render(TemplateRender.java:61)
	... 19 more


评论区

JFinal

2018-02-03 15:03

遍历的 x : map,取值是 x.key 以及 x.value,而不是对 x 进行再次遍历,解决办法是将 #for(m:list) 改成 #for(m:list.key) 或者 #for(m:list.value)

JFinal

2018-02-03 15:06

补充一下,这种对 map 的遍历方式是 jfinal 对 Java 规则的一个扩展,当然,你也可以直接使用 Java 规则来遍历,一点不耽误,将 #for(list:moduleMap) 改成:
#for(e : moduleMap.entrySet()) 然后里头是 e.getKey() 与 e.getValue() 取值,与 Java 规则完全一样

zhongshg

2018-02-03 15:40

@JFinal 谢谢波总!还是对enjoy的理解不够深刻...

JFinal

2018-02-03 15:47

@zhongshg 当拿不定主意的时候,用你已经掌握的 Java 方面规则搞定就可以了

jfinal enjoy 保留了绝大部分 Java 规则,扩展部分极少极少,而且都是有利于开发体验的符合直觉的扩展,例如对 map 的迭代方面的扩展,可以省去你写 map.entrySet() 的代码

热门反馈

扫码入社