避免使用JSTL c:set语句中的空格

fwi*_*tra 4 whitespace conditional jsp jstl el

我有一个生成LI列表的JSP文件,其中列表中的第一个和最后一个项目分配给它们的特殊类.我目前使用以下位:

<c:set var="liclass">
    <c:if test="${rowStatus.first}">first</c:if>
    <c:if test="${rowStatus.last}"> last</c:if>
</c:set>

<%-- not very pretty --%>
<li<c:if test="${not empty liclass}"> class="${liclass}"</c:if>>
Run Code Online (Sandbox Code Playgroud)

在这种情况下的问题是,在只有一个结果的情况下,该类应该变为"第一个最后"(它起作用),但它变成了first [...] last,其中[...]代表了一堆SO过滤掉的空白.

似乎<c:set>也需要使用由缩进引起的空白.我可以通过键入它而不用空格来解决它:

<c:set var="liclass"><c:if test="${rowStatus.first}">first</c:if><c:if test="${rowStatus.last}"> last</c:if></c:set>
Run Code Online (Sandbox Code Playgroud)

但我更喜欢可读的变体.另一种方法是通过一个删除多余空格的函数来拉取结果.

问题:是否有一种方法或技术可以避免在<c:set>-tag中设置这样的空格?

Bal*_*usC 7

我会value在条件运算符的帮助下直接在属性中执行此操作?:.

<c:set var="liclass" value="${rowStatus.first ? 'first' : ''}" />
<c:set var="liclass" value="${liclass}${rowStatus.last ? ' last' : ''}" />
Run Code Online (Sandbox Code Playgroud)

对于不漂亮的<li>部分,我只是添加

<c:set var="liclass" value="${empty liclass ? 'none' : liclass}" />
Run Code Online (Sandbox Code Playgroud)

并做

<li class="${liclass}">
Run Code Online (Sandbox Code Playgroud)

没错,它class="none"为非首先/最后一个元素添加了一个看似毫无价值的东西,但是谁在乎呢?


至于具体问题,你可以通过设置to 的trimDirectiveWhitespaces属性来修剪taglibs留下的空白.@pagetrue

<%@page trimDirectiveWhitespaces="true" %>
Run Code Online (Sandbox Code Playgroud)

(仅适用于Servlet 2.5/JSP 2.1容器)

您也可以在servletcontainer级别配置它.由于不清楚你正在使用哪一个,这里只是一个Apache Tomcat示例:在JSP servlet条目中Tomcat/conf/web.xml添加/编辑以下初始化参数:

<init-param>
    <param-name>trimSpaces</param-name>
    <param-value>true</param-value>
</init-param>
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,我无法从头顶分辨,也不能保证它能达到预期的效果first last.你必须自己尝试一下.