Пользовательский тег JSP - как получить тело тега?

У меня есть собственный тег jsp, например:

<a:customtag>
    The body of the custom tag...
    More lines of the body...
</a:customtag>

Как в настраиваемом теге получить текст тела?


person Kyle    schedule 23.03.2010    source источник


Ответы (3)


Это сложно, потому что есть два механизма.

Если вы расширяете SimpleTagSupport, вы получаете getJspBody (). Он возвращает JspFragment, который можно invoke (Writer writer) для записи основного содержимого автору.

Вам следует использовать SimpleTagSupport, если у вас нет особой причины использовать BodyTagSupport (например, поддержку устаревших тегов), поскольку это - ну - проще.

Если вы используете классические теги, вы расширяете BodyTagSupport и таким образом получаете доступ к getBodyContent (). Это дает вам объект BodyContent, из которого вы можете получить содержимое тела.

person brabster    schedule 23.03.2010
comment
Стоит отметить, что JspFragment менее мощный, потому что он ограничен - он должен быть без скриптов, тогда как BodyContent не ограничен таким образом. BodyContent по сути похож на внутреннюю страницу JSP. - person Yoni; 27.11.2013

Если вы используете собственный тег с подходом jsp 2.0, вы можете сделать это следующим образом:

make-h1.tag

<%@tag description="Make me H1 " pageEncoding="UTF-8"%>   
<h1><jsp:doBody/></h1>

Используйте его в JSP как:

<%@ taglib prefix="t" tagdir="/WEB-INF/tags"%>
<t:make-h1>An important head line </t:make-h1>
person Alireza Fattahi    schedule 30.12.2013
comment
Если я попытаюсь использовать этот подход, у меня возникнет проблема, когда тело содержит другие теги - если я заменю An important head line на <t:MyMessageTag key="someKey">, <jsp:doBody /> похоже, заменит его на <t:mymessagetag key="someKey"> в нижнем регистре и не буду оценивать этот jsp-тег. Есть идеи, почему? Или как обрабатывать такие вложенные теги? - person outofmind; 27.03.2018
comment
Вложенный тег должен работать без проблем. Задайте его, поскольку новый вопрос может помочь! - person Alireza Fattahi; 27.03.2018
comment
Моя ошибка заключалась в том, чтобы объявить атрибут body-content как tagdependent вместо scriptless по умолчанию - теперь все в порядке. - person outofmind; 28.03.2018

Чтобы расширить Brabster's ответ, я использовал SimpleTagSupport.getJspBody(), чтобы записать JspFragment во внутренний StringWriter для проверки и манипуляций:

public class CustomTag extends SimpleTagSupport {
    @Override public void doTag() throws JspException, IOException {
        final JspWriter jspWriter = getJspContext().getOut();
        final StringWriter stringWriter = new StringWriter();
        final StringBuffer bodyContent = new StringBuffer();

        // Execute the tag's body into an internal writer
        getJspBody().invoke(stringWriter);

        // (Do stuff with stringWriter..)

        bodyContent.append("<div class='custom-div'>");
        bodyContent.append(stringWriter.getBuffer());
        bodyContent.append("</div>");

        // Output to the JSP writer
        jspWriter.write(bodyContent.toString());
    }
}

}

person brasskazoo    schedule 13.04.2010