2010-10-30 4 views
8

est-il possible de créer une balise JSTL personnalisée qui accepte un attribut non-chaîne?La transmission d'un attribut non-chaîne à une balise JSTL personnalisée

Je voudrais créer une balise qui serait gérer la pagination en utilisant PagedListHolder de 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 --%> 

Cette balise nécessite une instance de classe PagedListHolder.

Un peu comme ça, mais je me rends compte que ce n'est pas valide.

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

Ai-je besoin d'écrire un gestionnaire de balises pour y parvenir?

Répondre

8

Vous pouvez simplement spécifier l'attribut type sur la directive d'attribut.

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

Après avoir lu un ensemble sur les fichiers de balises, je pensais que cela devrait être possible avec un fichier de balise. Votre commentaire a confirmé cela. Je l'ai essayé et il fonctionne. Merci! – prasopes

+0

Ouais, j'adore les fichiers de tags. Heureux d'avoir pu aider. :) –

2

En bref: Les balises JSTL sont autorisés à avoir des attributs non-chaîne, comme vous utilisez mvc de printemps, votre classe tag pourrait ressembler à ceci:

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

La seule chose que vous devez faire est de enregistrer correctement avec l'attribut pagedList dans votre fichier .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

Merci! On dirait que je vais devoir regarder dans les gestionnaires de balises après tout. – prasopes

Questions connexes