如何缩短自定义 JSP 标签生成的输出?

2022-09-04 07:26:25

是否可以使我自己的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>

答案 1

正如 werkshy 已经指出的那样,为了避免 JSP 定制标记中使用的指令生成空格,

<%@ tag trimDirectiveWhitespaces="true" %>

可以使用(<%@ page trimDirectiveWhitespaces=“true” %> 在这种情况下没有帮助,因为它似乎只适用于 JSP 本身的指令,而不适用于页面使用的自定义标记)。

但是,为了允许此标记属性,可能需要指定 JSP V2.1,例如使用 implicit.tld(如 https://docs.oracle.com/javaee/5/tutorial/doc/bnamu.htmlhttps://forums.oracle.com/thread/742224 中所述),然后需要将其与标记一起放入目录中。(至少我需要为WebLogic 12c做到这一点。

implicit.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应用程序(必须与Servlet 2.5兼容!web.xml

<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 或更低版本的容器为目标,那么您必须编辑自己的容器才能全局应用它。例如,在Tomcat中,它是文件。搜索 的声明,并在声明中添加以下 servlet init 参数。web.xml/conf/web.xml<servlet>JspServlet<servlet>

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