Java 创建扩展Spring标记库的自定义标记库

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

我想创建一个自定义标记库,它应该扩展现有的MVC3.0标记库。我这样做是因为我希望我的代码独立于任何框架


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

使用JSTL标记。JSTL意味着您的JSP将更加通用,可供任何使用JSP的Java web MVC技术使用。

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

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

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

  • my-lib.tld(指定[库的uri])
  • 扩展所有需要的标记
  • 将描述符放入my-lib.tld
  • 在my-lib.tld中使用,而不是Spring中的
  • 只需在Google上搜索“jsp自定义标记”。或者看看

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

    • org.apache.struts.taglib.html.FormTag
    • org.springframework.web.servlet.tags.form.FormTag
    您必须创建如下内容:

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

    归档我的lib.tld:

    
    我的标签库
    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>