Как я могу создать собственный тег JSP, который использует другие теги JSP? - PullRequest
11 голосов
/ 01 ноября 2011

Я хотел бы написать собственный тег JSP, вывод которого включает в себя другие теги JSP, которые также должны оцениваться динамически. Но, очевидно, все, что мой TagSupport подкласс записывает в pageContext.getOut(), просто отправляется прямо к клиенту без какой-либо дальнейшей оценки.

У меня такое ощущение, что это должно быть очень просто, поскольку кажется, что одной из первых вещей, которые нужно использовать для пользовательских тегов: инкапсуляция и повторное использование других пользовательских тегов, избегая дублирования кода.

Как заставить следующий код делать то, что он явно хочет сделать:

public class MyTag extends TagSupport {
    public int doStartTag() throws JspException {
        try {
            pageContext.getOut().println(
              "The output from this tag includes other tags " +
              "like <mypackage:myOtherTag>this one</mypackage:myOtherTag> " +
              "which should themselves be evaluated and rendered."
            )
        } catch (IOException e) {
            throw new JspException(e);
        }
        return SKIP_BODY;
    }   
}

Редактировать: некоторые фоны для моего конкретного случая использования, если это помогает. У меня есть пользовательский тег <user>, который динамически отображает имя пользователя таким образом, чтобы это было полезно для моего приложения (при наведении мыши на имя, фамилию, номер телефона и т. Д.). Сейчас я пишу еще один тег <comment> для отображения комментариев пользователей, и я хотел бы использовать свой существующий тег <user> для отображения имен пользователей в выходных данных тега <comment>.

Ответы [ 2 ]

15 голосов
/ 04 декабря 2011

Самый простой способ - написать свой обычный тег в виде файла тега JSP, а не в Java. Таким образом, новый тег может легко использовать другие пользовательские теги. Создайте файл myTag.tag в / WEB-INF / tags и используйте следующий код:

<%@ tag %>
<%@ attribute name="value" required="true" rtexprvalue="true" type="java.lang.String"%>
<%@ taglib prefix="mypackage" uri="mypackage.tld" %>
The output from this tag includes other tags 
like <mypackage:myOtherTag>${value}</mypackage:myOtherTag>
which should themselves be evaluated and rendered.

Больше информации о файлах тегов здесь: http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPTags5.html

5 голосов
/ 04 декабря 2011

Вы можете разделить свои классы на класс тегов и класс tagRenderer.

В вашей ситуации появятся два новых класса с именами CommentTagRenderer и UserTagRenderer.

Вот пример нового CommentTag

public int doStartTag() throws JspException {
    JspWriter out = pageContext.getOut(); 
    Comment comment = getComment();
    User user =  getUser();

    CommentTagRenderer commentRenderer = new CommentTagRenderer(out);
    UserTagRenderer userRenderer = new UserTagRenderer(out);

    try {
        commentRenderer.renderComment(comment);
        userRenderer.renderUser(user);          
    } catch (IOException e) {
        //some error handling
    }
    return SKIP_BODY;
  }

А вот пример CommentTagRenderer

private Writer out;
public CommentTagRenderer(Writer out) {
    this.out = out;
}

public void renderComment(Comment comment) throws IOException {
    out.write("<div>");
    out.write(comment.getComment());
    out.write("</div>");
}
...