6

既存のSpring MVC 3.0 タグ ライブラリを拡張するカスタム タグ ライブラリを作成したいと考えています。JSPコードをフレームワークから独立させたいので、これを行いたいと思っています。

つまり、Spring からStrutsに変更したい場合、JSP ページを変更する必要はありません。Struts タグ ライブラリを拡張するカスタマイズされたタグ ライブラリを変更しただけで、すべて正常に動作します。

4

4 に答える 4

16

ライブラリ全体を拡張することはできませんが、ライブラリからすべてのタグを拡張してそれらの新しい記述子を作成し、Springタグの代わりに独自のタグを使用することはできます。

たとえば、。という名前のファイルに移動しますspring-form.tld。属性の説明とタグクラス名を含むタグ記述子が表示されます。

したがって、独自のタグライブラリを作成するには、次のものを作成する必要があります。

  1. my-lib.tld([ライブラリのURI]を指定)
  2. 必要なすべてのタグを拡張する
  3. 記述子をmy-lib.tldに配置します
  4. SpringのURIの代わりにmy-lib.tldのURIを使用する

Googleで「jspカスタムタグ」を検索するだけです。または、JSPカスタムタグを見てください。

たとえば、StrutsとSpringの[form]タグの2つのクラスを考えてみましょう。

  • 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ディレクトリに配置する必要があります。このタグライブラリを含むJARファイルは、 WARファイルに含まれているJARファイルである必要があります。そうでない場合、タグライブラリは検出されません。

次に、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のすべての属性を持つようにタグを作成する必要があります。しかし、私はそれが努力する価値があるとは本当に思いません。

于 2012-10-29T20:25:58.263 に答える
3

私は実際にあなたが求めているのと同じようなことをしました。同じデザイン、使いやすさ、メンテナンスのしやすさを備えたプロジェクトが数多くあります。Spring MVCを使用しているため、私のタグの一部はSpringフォームタグのラッパーです。たとえば、入力タグ:

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;
}

私のフォームが次のようになる前は:

 <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、およびその他のタグがほとんど含まれていません。非常に大規模なプロジェクトでは、メンテナンスが簡単なため、調査する価値があると思います。

于 2012-10-31T12:50:29.777 に答える
1

動作をタグファイルにカプセル化できます。これは、Springタグライブラリまたはその他のタグライブラリに適用する場合、ある種の構成になります。

于 2012-10-29T21:08:19.420 に答える
0

JSTL タグを使用します。JSTL は、JSP がより一般的になり、JSP を使用する任意の Java Web MVC テクノロジで使用できることを意味します。

于 2012-10-29T10:50:13.273 に答える