2012-12-18 99 views
1

我有一個字符串,它與下面的代碼所做的HashSetJSTL每個,VAR包含方括號

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> 

通知的方括號[])出現在第一個腳本源之前和之後。他們來自哪裏?

+0

嘗試使用'List '而不是'Set'。 –

+0

@JasperdeVries我們最初使用過List,我們嘗試了Set來試圖解決這個問題。原因是完全不同的,我會在我自己的答案中解釋。 – MarioDS

回答

0

的問題發生,因爲scripts變量是在JSP通過一個屬性爲自定義標籤集,例如:

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

當然,這通過調用其toString()方法轉換的集合爲一個字符串。我們通過在servlet中設置request屬性以不同的方式解決了這個問題。

2

由於某種原因,它在您的電話上呼叫toString()。然後這將你的集合變成[script1, script2, script3],在這個字符串上調用foreach分割逗號,創建我們看到的效果。

我能看到你看到什麼,當我更換
request.setAttribute("scripts", scripts);

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

我無法重現你都沒有看到這個,但是我是運行Java 6

不是一個答案,而是一個有益的見解,我希望!

+0

這確實是一個有用的答案。我想知道這是爲什麼,因爲否則完全可以將集合設置爲屬性... – MarioDS