加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 创建一个扩展Spring标记库的自定义标记库

发布时间:2020-12-15 02:52:13 所属栏目:Java 来源:网络整理
导读:我想创建一个自定义标记库,它应该扩展现有的 Spring MVC 3.0标记库.我想这样做是因为我希望我的 JSP代码独立于任何框架. 这意味着,如果我想从Spring更改为Struts,那么我就不需要在JSP页面中更改任何内容.我只是更改我的自定义标记库,它将扩展Struts标记库,所
我想创建一个自定义标记库,它应该扩展现有的 Spring MVC 3.0标记库.我想这样做是因为我希望我的 JSP代码独立于任何框架.

这意味着,如果我想从Spring更改为Struts,那么我就不需要在JSP页面中更改任何内容.我只是更改我的自定义标记库,它将扩展Struts标记库,所有工作正常.

解决方法

您无法扩展整个库,但您可以扩展库中的所有标记并为它们创建新的描述符,然后使用您自己的标记而不是 Spring标记.

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

因此,要拥有自己的标记库,您必须创建:

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

只需在Google上搜索“jsp自定义标记”即可.或者看看JSP custom tags.

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

> 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目录中.具有此taglibrary的JAR文件必须只是包含在WAR文件中的JAR文件,否则将无法检测到taglibraries.

然后将您的taglib包含在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的所有属性.但我真的不认为这是值得的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读