2009-01-13 673 views
8

Ich habe eine JSP, die Spring: Form-Tags verwendet, um Steuerelemente an ein Befehlsobjekt zu binden.Spring MVC-Tag-Interaktion mit benutzerdefinierten Tag

Ich möchte es wie folgt ändern: Wenn [eine Bedingung ist wahr] als die Steuerelemente anzeigen; Ansonsten zeige einfach den Text an. (Beispiele: Wenn der Benutzer ein Admin ist, zeigen Sie die Steuerelemente an, ansonsten zeigen Sie nur den Text an. Wenn das Whatsit noch für Änderungen geöffnet ist, zeigen Sie die Steuerelemente an, andernfalls den Text anzeigen.)

Mit anderen Worten, ich möchte das :

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

Aber ich möchte eine einfache Möglichkeit, dies für jedes Feld zu erstellen (es gibt viele).

Wenn ich ein benutzerdefiniertes Tag zum Generieren des obigen Textes (mit "SOME PATH") erstellen, werden die benutzerdefinierten Spring-Tags gebunden?

Ich denke, was ich wirklich frage ist: Kann ich benutzerdefinierte Tags erstellen, die benutzerdefinierte Spring-Tags generieren, die dann gebunden werden? Oder werden alle benutzerdefinierten Tags (Mine und Spring) gleichzeitig behandelt?

Antwort

10

Häufig ist die einzige Lösung, es zu versuchen.

Ich habe es auf drei verschiedene Arten versucht - eine benutzerdefinierte JSP-Tag-Bibliothek, ein parametrisiertes JSP-Include und eine JSP2-Tag-Datei.

Die ersten beiden haben nicht funktioniert (obwohl ich vermute, dass die Tag-Bibliothek funktionieren kann), aber die Tag-Datei hat! Die Lösung basierte lose auf einem in Expert Spring MVC and Web Flow angegebenen Beispiel.

Hier ist mein Code in 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> 

Und hier ist der Code in der jsp:

Zuerst mit den anderen Taglibs Richtlinien:

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

und im Formular:

<tag:renderConditionalControl path="someObject.someField" type="text" readOnly="${someBoolean}" className="someClass" /> 
+0

Genau das brauche ich! – kosoant

+0

Wie hast du das verstanden? Ich habe Tag-Dateien verwendet, aber es fällt alles mit