Можно ли создать собственный тег JSTL, который принимает нестроковый атрибут?

Я хотел бы создать тег, который бы обрабатывал разбиение на страницы с помощью PagedListHolder из 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 --%>

Для этого тега потребуется экземпляр класса PagedListHolder.

Что-то вроде этого, но я понимаю, что это неверно.

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

Нужно ли мне писать обработчик тегов для этого?

8
prasopes 30 Окт 2010 в 14:18

2 ответа

Лучший ответ

Вы можете просто указать атрибут type в директиве attribute.

<%@ attribute name="pagedList" required="true" type="org.springframework.beans.support.PagedListHolder" %>
8
Steven Benitez 3 Ноя 2010 в 02:21
Прочитав целиком файлы тегов, я подумал, что это должно быть возможно только с файлом тегов. Ваш комментарий подтвердил это. Я попробовал, и все работает. Спасибо!
 – 
prasopes
9 Ноя 2010 в 01:24
Да, я люблю файлы с тегами. Рад, что смог помочь. :)
 – 
Steven Benitez
9 Ноя 2010 в 01:45

Вкратце: теги JSTL могут иметь не строковые атрибуты, поскольку вы используете spring mvc, ваш класс тега может выглядеть так:

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

Единственное, что вам нужно сделать, это правильно зарегистрировать его с помощью атрибута pagedList в вашем .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>
...
2
bjoern.bauer 30 Окт 2010 в 14:37
Спасибо! Похоже, мне все-таки придется заняться обработчиками тегов.
 – 
prasopes
31 Окт 2010 в 01:49