2010-10-30 18 views
8

¿es posible crear una etiqueta JSTL personalizada que acepte un atributo que no sea de cadena?Pasando el atributo no de cadena a la etiqueta JSTL personalizada

Me gustaría crear una etiqueta que sería manejar la paginación usando PagedListHolder desde Spring MVC.

<%@tag body-content="scriptless" description="basic page template" pageEncoding="UTF-8"%> 

<%-- The list of normal or fragment attributes can be specified here: --%> 
<%@attribute name="pagedList" required="true" %> 

<%-- any content can be specified here e.g.: --%> 
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 

<c:choose> 
    <c:when test="${!pagedList.firstPage}"> 
     <a href=" 
      <c:url value="pagedList"> 
       <c:param name="page" value="${pagedList.page - 1}"/> 
      </c:url> 
      ">&lt;&lt; 
     </a> 
    </c:when> 
    <c:otherwise> 
     &lt;&lt; 
    </c:otherwise> 
</c:choose> 

<%-- ...more --%> 

Esta etiqueta requeriría una instancia de la clase PagedListHolder.

Más o menos así, pero me doy cuenta de que esto no es válido.

<templ:pagedList pagedList="${players}"/> 

¿Debo escribir un controlador de etiqueta para lograrlo?

Respuesta

8

Sólo puede especificar el atributo type en la directiva de atributo.

<%@ attribute name="pagedList" required="true" type="org.springframework.beans.support.PagedListHolder" %> 
+0

Después de leer un todo en los archivos de etiquetas, estaba pensando que debería ser posible solo con un archivo de etiqueta. Tu comentario confirmó eso. Lo intenté y funciona. ¡Gracias! – prasopes

+0

Sí, me encantan los archivos de etiquetas. Me alegro de poder ayudar. :) –

2

En pocas palabras: las etiquetas JSTL se les permite tener atributos que no son cadenas, como se está utilizando MVC primavera, la clase de etiqueta podría tener este aspecto:

public class PagedListTag extends RequestContextAwareTag { 

    private PagedListHolder pagedList; 

    @Override 
    protected int doStartTagInternal() throws Exception { 
     // do something with pagedList 
     return SKIP_BODY; 
    } 

    @Override 
    public void doFinally() { 
     this.pagedList = null; 
     super.doFinally(); 
    } 

    public void setPagedListed(PagedListHolder pagedList) { 
     this.pagedList = pagedList; 
    } 
} 

Lo único que tiene que hacer es registrarlo correctamente con el atributo pagedList en su archivo .tld:

... 
<tag> 
    <name>pagedList</name> 
    <tag-class>PagedListTag</tag-class> 
    <body-content>JSP</body-content> 
    <attribute> 
     <name>pagedList</name> 
     <required>true</required> 
     <rtexprvalue>true</rtexprvalue> 
    </attribute> 
</tag> 
... 
+0

¡Gracias! Parece que tendré que buscar controladores de etiquetas después de todo. – prasopes

Cuestiones relacionadas