freemarker如何定义一个局部 list变量

laserdance 发布于 2011/08/12 10:26
阅读 9K+
收藏 0

遇到一个问题,freemarker使用Map<String,List>传递数据,现在有一个递归调用,如何定义一个局部list变量,由于变量名是变化的,比如我Map存item1,item2....,这几个list列表不确定,在库中查出来的,我在模板中遍历时如何把item1,item2,list变量取出来呢,,,

模板在下面,如何拼接呢,freemarker新手,查文档没查到

<node>
	<id>${ids}</id>
	<#if list?size != 0>
	<#list list as ls>
		<${ls["VC2KEY"]}>${ls["ITEMVALUE"]}</${ls["VC2KEY"]}>
	</#list>
	</#if>
	<#--公共模块列表 2-->
	<#if commonModulesList?size != 0>
	<commonModuleList>
	<@common paraList=commonModulesList value=1 />
	</commonModuleList>
	</#if>
	<#--通讯模块列表 3 -->
	<#if communicateModulesList?size != 0>
	<moduleList>
	<@common paraList=communicateModulesList value=1 />
	</moduleList>
	</#if>
	<#--功能模块列表  4 -->
	<#if functionModulesList?size != 0>
	<functionModuleList>
	<@common paraList=functionModulesList value=1 />
	</functionModuleList>
	</#if>
	<#--任务模块列表 5 -->
	<#if taskModulesList?size != 0>
	<taskListSchedule>
	<@common paraList=taskModulesList value=1 />
	</taskListSchedule>
	</#if>
</node>
<#macro common paraList value=1>
<#if paraList?size != 0>
<#list paraList as modules>
<function>
	<id>${modules["TASKID"]}</id>
	<name>${modules["TASKNAME"]}</name>
	<bean>${modules["TASKNAME"]}</bean>
	<#local y ="items${value}">
	<#local z="${y}" >
	<#if z?size != 0>
		<config key="config" desc="配置">
			<![CDATA[
				<function id="${modules["TASKID"]}" name="${modules["TASKNAME"]}" desc="${modules["VC2DESC"]}" bean="${modules["VC2DESC"]}" >
				<#list z as item>
				<item key="${item["VC2KEY"]}" value="${item["ITEMVALUE"]}" desc="${item["VC2DESC"]}" />
				</#list>
				<#-- end items -->
				</function>
			]]>
		</config>
	</#if>
</function>
<#local nextvalue="${value}+1" />
<#if taskList?size != 0 >
<@common paraList = taskList value=nextvalue />
</#if>
</#list>
</#if>
</#macro>
加载中
0
鉴客
鉴客

变量名本身是变化的,没必要啊,你不就是枚举出 Map 中的 List 吗?

用同一个固定的变量名就可以,处理完一个接着下一个

0
laserdance
laserdance

嗯,是对的,但我用Map, put的时候,是根据String的key传入的,代码如下,是递归加入变量的,如果有多个items,后面一个会覆盖前一个.

			// 任务模块列表 5
			List<?> taskModulesList = iTlTaskDAL.querySelectedTaskList(unitId,
					TASK_TYPE);
			root.put("taskModulesList", taskModulesList);
			if (taskModulesList.size() > 0) {
				recursionResolve(root, taskModulesList, TASK_TYPE);
			}	@SuppressWarnings("unchecked")
	private void recursionResolve(Map root, List<?> list, int type) {
		try {
			for (Object obj : list) {
				Map map = (Map) obj;
				String taskIdStr = String.valueOf(map.get("PROGRAMID"));
				// 得到item配置项的键值对。
				int programId;
				int taskId;
				//得到项目配置项的列表.
				List<?> items;
				// 得到选中模块列表。
				List<?> taskList;
				if (0 < taskIdStr.indexOf(":")) {
					if (1 == taskIdStr.split(":").length) {
						programId = Integer.parseInt(taskIdStr.split(":")[0]);
						items = iTlTaskDAL.queryProgramItem(programId);
						taskList = iTlTaskDAL.queryProgramList(programId);
					} else {
						taskId = Integer.parseInt(taskIdStr.split(":")[1]);
						items = iTlTaskDAL.queryTaskItem(taskId);
						taskList = iTlTaskDAL.querySelectedTaskList(taskId, 6);
					}
				} else {

					items = iTlTaskDAL.queryTaskItem(Integer
							.parseInt(taskIdStr));
					taskList = iTlTaskDAL.querySelectedTaskList(
							Integer.parseInt(taskIdStr), type);
				}
				root.put("items"+cnt.incrementAndGet(), items);
				root.put("taskList"+cnt.get(), taskList);
				// 如果有选中的模块列表
				if (taskList.size() > 0) {
					recursionResolve(root, taskList, type);
				}
			}
		} catch (Exception ex) {
			logger.error(ex.toString(), ex);
		}
	}
0
laserdance
laserdance

无解么,能不能换个思路

 

0
Andre.Z
Andre.Z

<#assign keys=mapObject?keys>
<#list keys as key>
    ........
</#list>
key有了,取list就不用说了吧

0
laserdance
laserdance

您是说我在这个地方传一个Map进来是么

返回顶部
顶部