如何在循环中将params添加到c:import标记?

时间:2011-06-16 18:12:41

标签: java jstl

我想做这样的事情:

            <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,我会遇到同样的问题。

任何帮助?

2 个答案:

答案 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}"/>