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

Java 停止将带有空格的JSTL函数输出呈现为不同的属性,java,jsp,jstl,Java,Jsp,Jstl,我一直在尝试获取逗号分隔字符串的内容,如 "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(

我一直在尝试获取逗号分隔字符串的内容,如

"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>
RAVI, PRASHANT, ANKIT, PANKAJ, "Nilesh Kumar Mishra", "Anoop Kumar"
<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>

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

<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>

拉维
普拉尚特
安基特
潘卡吉
尼莱什·库马尔·米什拉
阿努普·库马尔
我试着寻找解决办法,结果发现答案是肯定的。但提供的解决方案是针对PHP的,而且我无法在JSP中找到与htmlspecialchars等效的解决方案

有人能帮我避免那些不想要的属性,而是在选项标记中将整个字符串作为“value”属性的值,就像前三个属性一样


提前感谢。

我打赌当数据有空格时,逗号分隔的字符串中会有引号,如下所示:

<select class="style1" id="id" placeholder="sample placeholder" >
    <c:forEach var="name" items="${fn:split(names, ',')}">
        <option value="${name}">${name}</option>
    </c:forEach>
</select>
RAVI, PRASHANT, ANKIT, PANKAJ, "Nilesh Kumar Mishra", "Anoop Kumar"
<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>
然后,当foreach运行时,引号会提前终止value属性。所以你最终得到了这个

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

鉴于您的情况,这里可能是最简单的解决方法。。。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>

${name}

这将确保分割的字符串是一个连续字符串,但输出的格式与原始格式相同(带有空格)。

尝试此:${name}并查看转义XML特殊字符时会发生什么情况,一个类似的JSTL函数可能假定为
${fn:escapeXml(name)}
或在输出时,
是隐式的(即默认情况下,
escapeXml
设置为true),但在这种情况下这不太可能有帮助。
names
包含什么,当然是逗号分隔的字符串列表?@Tiny,是的,
names
包含逗号分隔的字符串列表,如下所示:
“RAVI、PRASHANT、ANKIT、PANKAJ、Nilesh Kumar Mishra、Anoop Kumar”
很抱歉没有将该部分包含在问题本身中,但首先我们在控制器中声明字符串,如下所示:private final string name=“RAVI、PRASHANT、ANKIT、PANKAJ、Nilesh Kumar Mishra、Anoop Kumar”;然后在JSP选择的模型中设置它,如下所示:model.addAttribute(“name”,names);很抱歉回来晚了,但是这个解决方案非常有效…非常感谢!!!凉的如果对您有效,您可以单击此答案上的复选框,将其标记为已解决。