【问题标题】:How to shorten output generated by custom JSP tag?如何缩短自定义 JSP 标签生成的输出?
【发布时间】:2011-08-10 13:06:56
【问题描述】:

是否可以让我自己的 JSP 标签生成的输出更短?例如,定义如下的标签生成 5 行而不是 1 行。是否可以避免这种情况(在标签源中不将所有 5 行加入 1)?

<%@ tag description="link" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ attribute name="href" required="true" type="java.lang.String" %>
<%@ attribute name="label" required="false" type="java.lang.String" %>
<a href="<c:url value="${href}"/>">${not empty label ? label : href}</a>

不是解决方案:

<%@ tag description="standard input" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><%@ attribute name="href" required="true" type="java.lang.String" description="address relative to web-app context" %><%@ attribute name="label" required="false" type="java.lang.String" description="link label" %><a href="<c:url value="${href}"/>">${not empty label ? label : href}</a>

【问题讨论】:

  • 这不是另一个问题的精确欺骗:如何修剪自定义标签的空白输出而不简单地删除标签中的所有空白?您不能在标签中使用 。
  • 正确答案是可以在标签中添加这个:&lt;%@ tag trimDirectiveWhitespaces="true" %&gt;
  • 应该重新打开,因为正确答案(见 cmets)与原来的问题不同。

标签: java jsp


【解决方案1】:

正如 werkshy 已经指出的,为了避免 JSP 自定义标签中使用的指令生成空白,

<%@ tag trimDirectiveWhitespaces="true" %>

可以使用( 在这种情况下没有帮助,因为它似乎只适用于 JSP 本身中的指令,而不适用于页面使用的自定义标签)。

然而,为了允许这个标签属性,可能需要指定 JSP 版本 2.1,例如使用implicit.tld(如https://docs.oracle.com/javaee/5/tutorial/doc/bnamu.htmlhttps://forums.oracle.com/thread/742224 所述),然后需要将其放入带有标签的目录中。 (至少我需要为 WebLogic 12c 这样做。)

隐式.tld:

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
    <tlib-version>1.0</tlib-version>
    <short-name>implicit</short-name>
</taglib>

【讨论】:

    【解决方案2】:

    是的,您可以全局配置 JSP 解析器以修剪脚本表达式和标签留下的空白。

    将此添加到您的 web 应用的 web.xml(必须与 Servlet 2.5 兼容!):

    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <trim-directive-whitespaces>true</trim-directive-whitespaces>
        </jsp-property-group>
    </jsp-config>
    

    如果您的目标是 Servlet 2.4 或更低版本的容器,那么您必须编辑容器自己的 web.xml 以在全局范围内应用它。例如,在 Tomcat 中,它是 /conf/web.xml 文件。搜索 JspServlet&lt;servlet&gt; 声明,并在 &lt;servlet&gt; 声明中添加以下 servlet init 参数。

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

    【讨论】:

    • 你应该加粗Servlet 2.5 兼容
    • @Vlad:嗯,5 年前我会这样做。但是现在,Servlet 2.5 已经发布了 5 年......我希望每个人都已经在使用它了;)我认为那个感叹号就足够了。
    • &lt;trim-directive-whitespaces&gt; 仅适用于 .jsp 页面(与 &lt;%@ page trimDirectiveWhitespaces="true" %&gt; 相同),但不适用于我自己的标记生成的输出。只有 trimSpaces 作为 init 参数有效并获得我的标签的 1 行输出。
    【解决方案3】:

    在您的 JSP 中:

    <%@ page trimDirectiveWhitespaces="true" %>
    

    【讨论】:

    • 我正在使用 Tomcat 7.0.19 (Servlet 3.0, JSP 2.2) 和 &lt;%@ page trimDirectiveWhitespaces="true" %&gt; 在 jsp 页面上工作,但不适用于标记源(在我的示例中为 link.tag)。在使用我自己的标签的页面上使用该指令不会减少标签的输出。
    • @marioosh 好的,那么也许你应该 trim() 你的标签的输出
    • 如何使用我的问题中的标签来做到这一点?
    • @marioosh 抱歉,我以为您使用的是自定义标签
    • 这适用于我在 Tomcat 6 中:&lt;%@ tag trimDirectiveWhitespaces="true" %&gt; 我希望可以重新打开问题以添加真正的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多