1

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> 

最初のスクリプト ソースの前と最後のスクリプト ソースの後にある角かっこ([と) に注意してください。]彼らはどこから来たのか?

4

2 に答える 2

2

何らかの理由で、それはtoString()あなたのセットを呼び出しています。これにより、セットが に変わり、この文字列[script1, script2, script3]を呼び出しforeachてカンマで分割し、目に見える効果を生み出します。


request.setAttribute("scripts", scripts);
に置き換えると、あなたが見ていたことを正確に見ることができました
request.setAttribute("scripts", scripts.toString());

これがないと、あなたが見ているものを再現できませんでしたが、Java 6 を実行していました。

回答ではありませんが、参考になれば幸いです!

于 2012-12-18T14:23:09.050 に答える
0

この問題は、次のscriptsように、変数がカスタム タグの属性を介して JSP で設定されたために発生しました。

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

もちろん、これはtoString()メソッドを呼び出してコレクションを文字列に変換しました。サーブレットでリクエスト属性を設定することで、別の方法で解決しました。

于 2012-12-19T17:32:51.920 に答える