2010-10-30 8 views
8

ist es möglich, einen benutzerdefinierten JSTL-Tag zu erstellen, die ein Nicht-String-Attribut akzeptiert?Passing Nicht-String-Attribut, um benutzerdefinierten JSTL-Tag

Ich möchte einen Tag erstellen, die Paginierung mit PagedListHolder von Spring MVC behandeln würde.

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

Dieses Tag erfordert eine Instanz der PagedListHolder-Klasse.

Art wie diese, aber ich weiß, dies ist nicht gültig.

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

Muss ich einen Tag-Handler schreiben, um dies zu erreichen?

Antwort

8

Sie haben soeben das type Attribut für das Attribut-Direktive angeben können.

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

nach einem ganzen Tag auf Dateien zu lesen, dachte ich, dass es mit einer Tag-Datei nur möglich sein sollte. Dein Kommentar hat das bestätigt. Ich habe es versucht und es funktioniert. Vielen Dank! – prasopes

+0

Ja, ich lieben Tag-Dateien. Froh, dass ich helfen konnte. :) –

2

Kurz: JSTL-Tags sind erlaubt Nicht-String-Attribute haben, wie Sie Spring MVC verwenden, das Tag-Klasse könnte wie folgt aussehen:

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

Das einzige, was Sie tun müssen, ist zu registriert sie richtig mit dem pagedList Attribute in Ihrer .tld-Datei:

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

Vielen Dank! Sieht so aus, als müsste ich schließlich in die Tag-Handler schauen. – prasopes