java - 创建一个扩展 Spring 标签库的自定义标签库

标签 java spring jsp spring-mvc taglib

我想创建一个自定义标签库,它应该扩展现有的 Spring MVC 3.0 标签库。我想这样做是因为我想要我的 JSP代码独立于任何框架。

这意味着,如果我想从 Spring 更改为 Struts那么我就不需要更改 JSP 页面中的任何内容。我只是更改了我的自定义标签库,它将扩展 Struts 标签库并且一切正常。

最佳答案

你不能扩展整个库,但你可以扩展库中的所有标签并为它们创建一个新的描述符,然后使用你自己的标签而不是 Spring

例如,转到名为 spring-form.tld 的文件。您将看到标签描述符,其中包含属性描述和标签类名称。

所以要拥有自己的标签库,您必须创建:

  1. my-lib.tld(指定 [库的 uri])
  2. 扩展你需要的所有标签
  3. 将描述符放入 my-lib.tld
  4. 使用 URI在 my-lib.tld 而不是 Spring 中

只需在 Google 中搜索“jsp 自定义标签”。或者看看 JSP custom tags .

例如,为来自 Struts 的 [form] 标签取两个类和 Spring :

  • org.apache.struts.taglib.html.FormTag
  • org.springframework.web.servlet.tags.form.FormTag。

您必须创建如下内容:

package org.my.example.tags;

import javax.servlet.jsp.JspException;

import org.springframework.web.servlet.tags.form.FormTag;
import org.springframework.web.servlet.tags.form.TagWriter;

/**
 */
public class SpringFormTag extends FormTag {
    private static final String FOCUS_ATTRIBUTE = "focus";
    private String focus;

    public void setFocus(String focus) {
        this.focus = focus;
    }

    public String getFocus() {
        return focus;
    }

    @Override
    protected void writeDefaultAttributes(TagWriter tagWriter) throws JspException {
        writeOptionalAttribute(tagWriter, FOCUS_ATTRIBUTE, getFocus());
        super.writeDefaultAttributes(tagWriter);
    }
}

我只发布 spring 表单标签的代码。

文件 my-lib.tld:

<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version="2.0">
    <description>My tag library</description>
    <tlib-version>3.0</tlib-version>
    <short-name>html</short-name>
    <uri>http://test.com/test.tld</uri>
    <tag>
        <name>form</name>
        <tag-class>org.my.example.tags.SpringFormTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <name>action</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>acceptCharset</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>dir</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>disabled</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
            <type>boolean</type>
        </attribute>
        <attribute>
            <name>enctype</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>focus</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>focusIndex</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>lang</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>method</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>onreset</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>onsubmit</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>readonly</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
            <type>boolean</type>
        </attribute>
        <attribute>
            <name>scriptLanguage</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
            <type>boolean</type>
        </attribute>
        <attribute>
            <name>style</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>styleClass</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>styleId</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>target</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>

您还必须将 .tld 文件放入 JAR 文件的 META-INF 目录中。带有这个标签库的 JAR 文件必须只是一个包含在您的 WAR 中的 JAR 文件。文件,否则将不会检测到标签库。

然后将您的标签库包含到 JSP 文件中:

<%@ taglib prefix="html" uri="http://test.com/test.tld" %>

并使用它:

<html:form action="asd" focus="1">
    <div><input type="text"></div>
    <div><input type="submit"></div>
</html:form>

如果您想在 Struts 之间切换,您还必须为 Struts 创建这样一个库。

执行此操作时唯一需要记住的是 Spring 和 Struts 的标记定义略有不同,因此 Struts 具有“焦点”而 Spring 没有。我认为可能会有更多差异。

如果您真的想从一个切换到另一个,则必须使您的标签具有来自 Spring 和 Struts 的所有属性。但我真的认为这不值得付出努力。

关于java - 创建一个扩展 Spring 标签库的自定义标签库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13097778/

相关文章:

java - 如何在 JMX 中查询 J2EEServer MBean?

java - 如果注入(inject)器是 child ,Jersey-Guice 不会处理绑定(bind)资源?

java - JIRA - 自动向客户发送通知

spring - 访问 Scriptlet 中的模型属性

java spring Long[](数组)类型

html - 将 JSP 变量传递给 html 标记的属性的最佳做法是什么?

javascript - 使用 JSON 的 JSP 表单提交

Java在线判断错误解决方法

java - 两个具有相同自动生成 ID 的表

java - 我应该把 jar 文件放在 Tomcat 6 的什么地方?