2010-10-30 8 views
8

Czy można utworzyć niestandardowy znacznik JSTL, który akceptuje atrybut inny niż łańcuchowy?Przekazywanie niestandardowego atrybutu do niestandardowego znacznika JSTL

Chciałbym utworzyć tag, który obsługuje paginację za pomocą PagedListHolder ze 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 --%> 

Ten tag wymagałby instancji klasy PagedListHolder.

Coś w tym stylu, ale zdaję sobie sprawę, że to nie jest poprawne.

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

Czy muszę napisać moduł obsługi znaczników, aby to osiągnąć?

Odpowiedz

8

można tylko określić atrybut type sprawie dyrektywy atrybutu.

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

Po przeczytaniu całości w plikach znaczników, myślałem, że powinno być możliwe tylko z plikiem znaczników. Twój komentarz to potwierdził. Próbowałem i działa. Dzięki! – prasopes

+0

Tak, uwielbiam pliki znaczników. Cieszę się, że mogłem pomóc. :) –

2

W skrócie: tagi JSTL mogą mieć atrybuty non-strunowych, jak używasz MVC wiosny, klasa tag mógłby wyglądać następująco:

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

Jedyną rzeczą, którą musisz zrobić, to zarejestrować go prawidłowo z atrybutem pagedList w pliku .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

Dziękujemy! Wygląda na to, że będę musiał zajrzeć do obsługi znaczników. – prasopes