2009-01-13 20 views
8

Tengo una JSP que usa Spring: etiquetas de formulario para vincular controles a un objeto de comando.Interacción de Spring MVC tag con la etiqueta personalizada

Me gustaría modificarlo de la siguiente manera: si [alguna condición es verdadera] que mostrar los controles; de lo contrario, solo muestre el texto. (Ejemplos: si el usuario es un administrador, muestre los controles, de lo contrario solo muestre el texto. Si el archivo aún está abierto para modificación, muestre los controles; de lo contrario, muestre el texto.)

En otras palabras, quiero esto :

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

Pero quiero una manera fácil de crear esto para cada campo (hay muchos).

Si creo una etiqueta personalizada para generar el texto anterior (dado "ALGUNA RUTA"), ¿se unirán las etiquetas personalizadas de Spring?

Supongo que lo que realmente estoy preguntando es: ¿puedo crear etiquetas personalizadas que generen etiquetas personalizadas de Spring que luego consigan vinculadas? ¿O todas las etiquetas personalizadas (la mía y la de Spring) se manejan simultáneamente?

Respuesta

10

Con frecuencia, la única solución es intentarlo.

Lo probé de tres maneras diferentes: una biblioteca de etiquetas personalizadas JSP, una JSP parametrizada y un archivo de etiquetas JSP2.

Los dos primeros no funcionaron (aunque sospecho que la biblioteca de etiquetas puede funcionar), ¡pero el archivo de etiquetas sí lo hizo! La solución se basa libremente en un ejemplo dado en Expert Spring MVC and Web Flow.

Aquí está mi código en 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> 

Y aquí está el código en el jsp:

En primer lugar, con los otros Taglibs directivas:

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

y en la forma:

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

¡Esto es exactamente lo que necesito! – kosoant

+0

¿Cómo te ha ido con esto? He estado usando archivos de etiquetas pero todo se viene abajo con