我想创建一个自定义标记库,它应该扩展现有的
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); } }
文件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不具有.我认为可能会有更多的差异.