停止将带有空格的 JSTL 函数输出呈现为不同的属性

Stopping JSTL function output with whitespaces from being rendered as different attributes

我一直在尝试获取像

这样的逗号分隔字符串的内容
"RAVI, PRASHANT, ANKIT, PANKAJ, Nilesh Kumar Mishra, Anoop Kumar"

此列表中的每个元素都需要显示在 JSP 页面的下拉菜单中。 JSP 执行此操作的代码如下所示:

<select class="style1" id="id" placeholder="sample placeholder" >
    <c:forEach var="name" items="${fn:split(names, ',')}">
        <option value="${name}">${name}</option>
    </c:forEach>
</select>

但是在呈现页面后,我注意到如果 ${name} 的输出包含任何空格,则空格后面的单词将呈现为选项标记内的属性。

<select class="style1" id="id" placeholder="sample placeholder" >
    <option value="RAVI">RAVI</option>
    <option value="PRASHANT">PRASHANT</option>
    <option value="ANKIT">ANKIT</option>
    <option value="PANKAJ">PANKAJ</option>
    <option value="Nilesh" kumar="" mishra="">Nilesh Kumar Mishra</option>
    <option value="Anoop" kumar="">Anoop Kumar</option>
</select>

我尝试搜索解决方案并找到了 SO link。但是提供的解决方案是针对 PHP 的,而且我无法在 JSP.

中找到 htmlspecialchars 的等效项

任何人都可以帮助我避免那些意外的属性,而是将整个字符串作为选项标签中 'value' 属性的值,就像前三个被渲染一样?

提前致谢。

我打赌当数据有白色 space 时,您的逗号分隔字符串中有引号,如下所示:

RAVI, PRASHANT, ANKIT, PANKAJ, "Nilesh Kumar Mishra", "Anoop Kumar"

然后,当 foreach 运行时,引号会过早地终止 value 属性。所以你最终得到这个...

<option value=""nilesh kumar mishra"" ...

而不是这个...

<option value="nilesh kumar mishra" ...

浏览器最终将每个字符串解释为一个属性,而不是 value 属性的数据。所以你需要去掉这样的引号:

<select class="style1" id="id" placeholder="sample placeholder" >
    <c:forEach var="name" items="${fn:split(names, ',')}">
        <option value="${fn:replace(name, '"', '')}">${name}</option>
    </c:forEach>
</select>

鉴于您的情况,这可能是最简单的处理方法...a) 用 |s 替换所有空格,b) 拆分字符串,c) 将 |s 替换回空格。以下是如何做到这一点...

<select class="style1" id="id" placeholder="sample placeholder" >
    <c:forEach var="name" items="${fn:split(fn:replace(names, ' ', '|'), ',')}">
        <option value="${fn:replace(name, '|', ' ')}">${name}</option>
    </c:forEach>
</select>

这将确保拆分后的字符串是一个连续的字符串,但输出的格式与原来的一样(带空格)。