【问题标题】:JSTL for each, var contains square brackets每个 JSTL,var 包含方括号
【发布时间】:2012-12-05 17:50:17
【问题描述】:

我有一个HashSet 的字符串,它是用以下代码制作的:

Set<String> scripts = new HashSet<>();
String contextPath = request.getContextPath();
scripts.add(contextPath + "/resources/scripts/jquery.cycle2.js");
scripts.add(contextPath + "/resources/scripts/jquery.cycle2.center.js");
scripts.add(contextPath + "/resources/scripts/slideshow.js");
request.setAttribute("scripts", scripts);

现在在一个 JSP 页面中,使用 JSTL,我执行一个普通的 forEach 循环:

<c:if test="${not empty scripts}">
    <c:forEach var="script" items="${scripts}" >
        <script type="text/javascript"
                src="${script}">
                          </script> 
    </c:forEach>
</c:if>

加载页面时,结果如下:

<script type="text/javascript"
        src="[/InfoKiosk/resources/scripts/jquery.cycle2.center.js">
                          </script> 

<script type="text/javascript"
        src=" /InfoKiosk/resources/scripts/jquery.cycle2.js">
                          </script> 

<script type="text/javascript"
        src=" /InfoKiosk/resources/scripts/slideshow.js]">
                          </script> 

注意出现在第一个脚本源之前和最后一个脚本源之后的方括号[])。他们来自哪里?

【问题讨论】:

  • 尝试使用List&lt;String&gt; 而不是Set
  • @JasperdeVries 我们最初使用了 List,我们尝试了 Set 试图解决问题。原因是完全不同的,我将在自己的回答中解释。

标签: java foreach set jstl


【解决方案1】:

由于某种原因,它在您的设备上调用toString()。然后这会将你的集合变成[script1, script2, script3],在这个字符串上调用foreach,在逗号上拆分,创建我们看到的效果。

当我替换时,我可以确切地看到你所看到的
request.setAttribute("scripts", scripts);

request.setAttribute("scripts", scripts.toString());

如果没有这个,我无法重现您看到的内容,但是我运行的是 java 6。

不是答案,而是我希望的有用见解!

【讨论】:

  • 这确实是一个有用的答案。我想知道为什么会这样,因为否则完全可以将集合设置为属性...
【解决方案2】:

出现问题是因为scripts 变量是通过自定义标记的属性在JSP 中设置的,如下所示:

<t:genericpage scripts="${scripts}">
....

当然,这通过调用其toString() 方法将集合转换为字符串。我们通过在 servlet 中设置 request 属性以不同的方式解决了这个问题。

【讨论】:

    猜你喜欢
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2017-06-13
    相关资源
    最近更新 更多