我想创建一个自定义标签库,它应该扩展现有的 Spring MVC 3.0 标签库。我想这样做是因为我想要我的 JSP代码独立于任何框架。
这意味着,如果我想从 Spring 更改为 Struts那么我就不需要更改 JSP 页面中的任何内容。我只是更改了我的自定义标签库,它将扩展 Struts 标签库并且一切正常。
最佳答案
你不能扩展整个库,但你可以扩展库中的所有标签并为它们创建一个新的描述符,然后使用你自己的标签而不是 Spring
例如,转到名为 spring-form.tld
的文件。您将看到标签描述符,其中包含属性描述和标签类名称。
所以要拥有自己的标签库,您必须创建:
- my-lib.tld(指定 [库的 uri])
- 扩展你需要的所有标签
- 将描述符放入 my-lib.tld
- 使用 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/