8

Spring:form タグを使用してコントロールをコマンド オブジェクトにバインドする JSP があります。

次のように変更したいと思います。それ以外の場合は、テキストを表示するだけです。(例: ユーザーが管理者の場合はコントロールを表示し、それ以外の場合はテキストのみを表示します。whatsit がまだ変更のために開いている場合はコントロールを表示し、それ以外の場合はテキストを表示します。)

言い換えれば、私はこれが欲しい:

<c:choose>
     <c:when test="SOME TEST HERE">
          <form:input path="SOME PATH" />
     </c:when>
     <c:otherwise>
          <p>${SOME PATH}</p>
     </c:otherwise>
</c:choose>

しかし、すべてのフィールドに対してこれを作成する簡単な方法が必要です (多数あります)。

上記のテキストを生成するカスタム タグを作成すると ("SOME PATH" を指定)、Spring カスタム タグはバインドされますか?

私が本当に求めているのは、Spring カスタム タグを生成してからバインドするカスタム タグを作成できるかということだと思います。それとも、すべてのカスタム タグ (私のものと Spring のもの) が同時に処理されますか?

4

1 に答える 1

10

多くの場合、唯一の解決策はそれを試すことです。

JSP カスタム タグ ライブラリ、パラメータ化された JSP インクルード、および JSP2 タグ ファイルという 3 つの異なる方法で試してみました。

最初の 2 つは機能しませんでしたが (タグ ライブラリは機能するのではないかと思いますが)、タグ ファイルは機能しました! このソリューションは、 Expert Spring MVC および Web Flowで示されている例に大まかに基づいています。

WEB-INF/tags/renderConditionalControl.tag のコードは次のとおりです。

<%@ tag body-content="tagdependent" isELIgnored="false" %>
<%@ attribute name="readOnly" required="true" %>
<%@ attribute name="path" required="true" %>
<%@ attribute name="type" required="false" %>
<%@ attribute name="className" required="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="form" uri="/WEB-INF/spring-form.tld" %>
<%@ taglib prefix="spring" uri="/WEB-INF/spring.tld" %>

<c:if test="${empty type}">
<c:set var="type" value="text" scope="page" />
</c:if>

<spring:bind path="${path}">
    <c:choose>
        <c:when test="${readOnly}">
            <span class="readOnly">${status.value}</span>
        </c:when>
        <c:otherwise>
           <input type="${type}" id="${status.expression}" name="${status.expression}"
                    value="${status.value}" class="${className}" />
        </c:otherwise>
    </c:choose>
</spring:bind>

jsp のコードは次のとおりです。

まず、他の taglibs ディレクティブを使用して:

<%@ taglib tagdir="/WEB-INF/tags" prefix="tag" %> 

およびフォーム内:

<tag:renderConditionalControl path="someObject.someField" type="text" readOnly="${someBoolean}" className="someClass" />
于 2009-01-20T20:31:05.093 に答える