Почему этот пользовательский тег PrettyTime создает 11 строк пустого текста перед «красивой» датой в выводе HTML? - PullRequest
0 голосов
/ 26 октября 2010
<%@ tag language="java" pageEncoding="utf-8" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ tag import="com.ocpsoft.pretty.time.PrettyTime, java.util.Date"%>
<%@ attribute name="dateParam" required="true" type="java.util.Date" %>

<%
 PrettyTime p = new PrettyTime();
 String prettyDate = p.format(dateParam);
 jspContext.setAttribute("prettyDate", prettyDate.trim());
%>
<c:out value="${prettyDate}"/>

Не могу понять, что я делаю что-то не так в этом теге.

Предполагается, что библиотека PrettyTime просто печатает текстовую версию данных, например:

10 months ago

Но я не могу сказать, почему этот пользовательский тег создает 11 строк пустого текста до "красивой" даты в выводе HTML?

Ответы [ 2 ]

4 голосов
/ 26 октября 2010

Поскольку Турбьерн уже ответил на причину, я отвечу только на решение, поскольку вы, скорее всего, избавитесь от этого раздражения.

Вы можете настроить свой сервлет-контейнер на обрезку пробелов, оставшихся после обработки сценариев и библиотек тегов. Например, в Apache Tomcat вы можете сделать это, открыв /conf/web.xml, направляясь к определению <servlet> сервлета JSP, которое выглядит следующим образом для Tomcat 7

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <init-param>
        <param-name>fork</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>xpoweredBy</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>

добавить <init-param> из trimSpaces=true следующим образом к определению <servlet> сервлета JSP:

    <init-param>
        <param-name>trimSpaces</param-name>
        <param-value>true</param-value>
    </init-param>

Перезапустите Tomcat, и этот пробел должен исчезнуть. По крайней мере, большая часть исчезнет. Вам нужно только позаботиться о том, чтобы пробел, который вы ввели самостоятельно , также был физически удален из JSP.

См. Также JSP engine HOW-TO . Довольно все остальные сервлетконтейнеры имеют аналогичную конфигурацию. Обратитесь к их документации, используя ключевое слово "отделочные пространства".


Что касается общего подхода, я бы предложил преобразовать эту вещь в класс Java и вместо этого сделать из нее функцию EL. Смерть скриптлетам .

<c:out value="${my:prettyTime(date)}" />
1 голос
/ 26 октября 2010

Потому что, когда вы удаляете <% ...%>, остаются еще новые строки, которые точно воспроизводятся в сгенерированном выводе.

...