我想做这样的事情:
<c:import url="${myvar.url}">
<c:forEach items="${myvar.params}" var="param">
<c:param name="${param.name}" value="${param.value}"/>
</c:forEach>
</c:import>
我收到了这个错误:
“c:import”标记中的非法子标记:“c:forEach”标记
显然,c:import期望c:param在其中,它会看到c:forEach。
如果我尝试使用jsp:include和jsp:params,我会遇到同样的问题。
任何帮助?
答案 0 :(得分:9)
如果你不想担心凌乱“?”和“&amp;”逻辑你也可以使用类似下面的东西:
<c:url var="urlWithQueryString" value="${myvar.url}">
<c:forEach var="thisParam" items="${myvar.params}">
<c:param name="${thisParam.name}">${thisParam.value}</c:param>
</c:forEach>
</c:url>
<c:import url="${urlWithQueryString}"/>
答案 1 :(得分:1)
您将无法使用c:import或jsp:include。
执行此操作如果这是您不止一次要做的事情,您可以编写一个标记文件,例如:
<%@ attribute name="url" required="true" %>
<%@ attribute name="paramMap" required="false" type="java.util.Map"%>
<%@ tag trimDirectiveWhitespaces="true"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:if test="${empty paramMap}">
<c:import url="${url}"/>
</c:if>
<c:if test="${!empty paramMap}">
<c:set var="paramString" value=""/>
<c:forEach var="entry" items="${paramMap}">
<c:if test="${!empty paramString}">
<c:set var="paramString">${paramString}&</c:set>
</c:if>
<c:set var="paramString">${paramString}<c:out value="${entry.key}"/>=<c:out value="${entry.value}"/></c:set>
</c:forEach>
<c:url value="${url}?${paramString}" var="fullUrl"/>
<c:import url="${fullUrl}"/>
</c:if>
将其保存为“importParamMap.tag
”文件夹中的“WEB-INF/tags
”。要在页面中调用它,请包含tags目录并将其视为任何其他标记:
<%@ taglib tagdir="/WEB-INF/tags" prefix="tag" %>
...
<tag:importParamMap url="${myVar.url}" paramMap="${myVar.params}"/>