Java 创建扩展Spring标记库的自定义标记库
我想创建一个自定义标记库,它应该扩展现有的MVC3.0标记库。我这样做是因为我希望我的代码独立于任何框架Java 创建扩展Spring标记库的自定义标记库,java,spring,jsp,spring-mvc,taglib,Java,Spring,Jsp,Spring Mvc,Taglib,我想创建一个自定义标记库,它应该扩展现有的MVC3.0标记库。我这样做是因为我希望我的代码独立于任何框架 这意味着,如果我想从Spring更改为,那么我不需要更改JSP页面中的任何内容。我只是更改了我的定制标记库,它将扩展Struts标记库,并且一切都正常。使用JSTL标记。JSTL意味着您的JSP将更加通用,可供任何使用JSP的Java web MVC技术使用。您不能扩展整个库,但您可以扩展库中的所有标记并为它们创建新的描述符,然后使用您自己的标记而不是那些标记 例如,转到名为spring f
这意味着,如果我想从Spring更改为,那么我不需要更改JSP页面中的任何内容。我只是更改了我的定制标记库,它将扩展Struts标记库,并且一切都正常。使用JSTL标记。JSTL意味着您的JSP将更加通用,可供任何使用JSP的Java web MVC技术使用。您不能扩展整个库,但您可以扩展库中的所有标记并为它们创建新的描述符,然后使用您自己的标记而不是那些标记 例如,转到名为
spring form.tld
的文件。您将看到标记描述符,其中包含属性描述和标记类名
因此,要拥有自己的标记库,您必须创建:
- org.apache.struts.taglib.html.FormTag
- org.springframework.web.servlet.tags.form.FormTag
我的标签库
3
html
http://test.com/test.tld
形式
org.my.example.tags.SpringFormTag
JSP
文件,否则将不会检测到标记库
然后将标记库包含到JSP文件中:
<%@ taglib prefix="html" uri="http://test.com/test.tld" %>
并使用它:
如果要在Struts之间切换,还必须为Struts创建这样一个库
执行此操作时,您需要记住的唯一一件事是,Spring和Struts的标记定义稍有不同,因此Struts有“焦点”,而Spring没有。我认为可能会有更多的差异
如果您真的想从一个标签切换到另一个标签,您必须使您的标签具有Spring和Struts的所有属性。但是我真的认为这不值得努力。你可以将你的行为封装到。如果应用于spring标记库或任何其他标记库,这将是一种组合。我实际上做了一些类似于您要求的事情。我们有许多项目必须具有相同的设计、可用性和易维护性。
因为我们使用SpringMVC,所以我的一些标记是围绕SpringForm标记的包装。例如,输入标记:
import org.apache.commons.lang.StringUtils;
import org.springframework.web.servlet.tags.form.InputTag;
public class InputText extends AbstractInputTag {
private String maxlength;
@Override
public void initInput() throws Exception {
InputTag input = new InputTag();
if ( StringUtils.isNotEmpty( maxlength ) ) {
input.setMaxlength( maxlength );
}
setInput( input );
}
public void setMaxlength( String maxlength ) {
this.maxlength = maxlength;
}
}
它从一个抽象标记扩展而来,该标记向输入添加了一个标签,还负责处理错误代码:
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.servlet.tags.form.AbstractHtmlInputElementTag;
import org.springframework.web.servlet.tags.form.ErrorsTag;
public abstract class AbstractInputTag extends AbstractTag {
private String path;
private String code;
private String labelWidth = "35%";
private String valueWidth = "";
private AbstractHtmlInputElementTag input;
@Override
public int doStart() throws Exception {
TaglibUtils.assertHasAncestorOfType( this, Form.class );
initInput();
TaglibUtils.doLabel( pageContext, getId(), code, labelWidth );
setParent( input );
input.setPageContext( pageContext );
input.setCssErrorClass( "zsa-validationerror-input" );
input.setPath( path );
input.setId( getId() );
if( !StringUtils.isEmpty( valueWidth ) ) {
input.setCssStyle( "width: " + valueWidth );
}
pageContext.getOut().print( "<div>" );
input.doStartTag();
return EVAL_BODY_INCLUDE;
}
@Override
public int doEnd() throws Exception {
input.doEndTag();
input.release();
pageContext.getOut().print( "</div>" );
ErrorsTag errorsTag = new ErrorsTag();
errorsTag.setParent( this );
errorsTag.setPageContext( pageContext );
errorsTag.setPath( path );
errorsTag.doStartTag();
JspWriter out = pageContext.pushBody();
out.print( "<span class=\"zsa-validationerror-flag\"></span>" );
errorsTag.setBodyContent( ( BodyContent )out );
errorsTag.doInitBody();
errorsTag.doAfterBody();
errorsTag.doEndTag();
out = pageContext.popBody();
errorsTag.release();
return EVAL_PAGE;
}
public abstract void initInput() throws Exception;
}
import javax.servlet.jsp.JspWriter;
导入javax.servlet.jsp.tagext.BodyContent;
导入org.apache.commons.lang.StringUtils;
导入org.springframework.web.servlet.tags.form.AbstractHtmlInputElementTag;
导入org.springframework.web.servlet.tags.form.ErrorsTag;
公共抽象类AbstractInputTag扩展了AbstractTag{
私有字符串路径;
私有字符串码;
专用字符串labelWidth=“35%”;
私有字符串valueWidth=“”;
私有抽象HtmlInputElementTag输入;
@凌驾
public int doStart()引发异常{
TaglibUtils.assertHasAncestorOfType(this,Form.class);
initInput();
TaglibUtils.doLabel(pageContext,getId(),代码,labelWidth);
setParent(输入);
input.setPageContext(pageContext);
setCssErrorClass(“zsa验证错误输入”);
设置路径(路径);
setId(getId());
如果(!StringUtils.isEmpty(valueWidth)){
input.setCssStyle(“宽度:”+valueWidth);
}
pageContext.getOut().print(“”);
input.doStartTag();
返回评估主体,包括:;
}
@凌驾
public int doEnd()引发异常{
input.doEndTag();
input.release();
pageContext.getOut().print(“”);
ErrorsTag ErrorsTag=新的ErrorsTag();
errorsTag.setParent(此);
errorsTag.setPageContext(pageContext);
errorsTag.setPath(路径);
errorsTag.doStartTag();
JspWriter out=pageContext.pushBody();
输出。打印(“”);
errorsTag.setBodyContent((正文内容)输出);
errorsTag.doInitBody();
errorsTag.doAfterBody();
errorsTag.doEndTag();
out=pageContext.popBody();
errorsTag.release();
返回评估页面;
}
公共抽象void initInput()引发异常;
}
在我的表格看起来像这样之前:
<portlet:actionURL var="coreSearch" portletMode="view" windowState="NORMAL"></portlet:actionURL>
<form:form commandName="searchContext" id="searchComplex" action="${coreSearch}" method="POST">
<div class="rightDivPart" style="width: 50%; padding-left: 50px">
<label class="label" for="tin">TIN: </label>
<form:input cssErrorClass="inputErrorClass" path="tin" cssClass="medium"/>
...
<ics:form id="searchComplex" commandName="searchContext" action="searchComplex" type="action">
<ics:panel id="searchComplex">
<ics:inputText id="mrn" path="mrnCriteria.mrn"/>
</ics:panel>
</ics:form>
锡:
...
制作包装标签后,它们现在看起来如下所示:
<portlet:actionURL var="coreSearch" portletMode="view" windowState="NORMAL"></portlet:actionURL>
<form:form commandName="searchContext" id="searchComplex" action="${coreSearch}" method="POST">
<div class="rightDivPart" style="width: 50%; padding-left: 50px">
<label class="label" for="tin">TIN: </label>
<form:input cssErrorClass="inputErrorClass" path="tin" cssClass="medium"/>
...
<ics:form id="searchComplex" commandName="searchContext" action="searchComplex" type="action">
<ics:panel id="searchComplex">
<ics:inputText id="mrn" path="mrnCriteria.mrn"/>
</ics:panel>
</ics:form>
现在我的JSP-s几乎没有JavaScript、Css、JQuery和其他标记。
在一个非常大的项目中,由于易于维护,我认为值得投资。我的问题是我只想将spring的标记库扩展到我的自定义标记库。但正如我所说,我想为我的自定义标记库继承该标记库。我该怎么做?你能给我一个做同样事情的例子吗?你能提供同样的工作例子吗。我不明白你想说什么。但是你的解释似乎是正确的。谢谢你的解决方案,把我的100美元奖金奖励给你,继续帮助。如果我想扩展整个spring标签库呢?那也行。在这种情况下,您不再依赖于spring的标记,并且可以轻松地将标记的实现更改为依赖于其他标记库。我基本上为几乎所有的spring标签做了包装。我的想法是使用复合标签
<ics:form id="searchComplex" commandName="searchContext" action="searchComplex" type="action">
<ics:panel id="searchComplex">
<ics:inputText id="mrn" path="mrnCriteria.mrn"/>
</ics:panel>
</ics:form>