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

发布于 2021-11-08 19:27:39 字数 2207 浏览 752 评论 3

遇到一个问题,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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

等你爱我 2021-11-11 10:18:17

无解么,能不能换个思路

 

情栀口红 2021-11-11 08:24:44

嗯,是对的,但我用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);
		}
	}
奢华的一滴泪 2021-11-10 12:27:59

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文