2010-03-23 3 views

ответ

10

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

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

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

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

+0

Спасибо, не знал об этом классе, это работает. – Kyle

+1

Стоит отметить, что JspFragment менее эффективен, потому что он ограничен - он должен быть без скриптов, где BodyContent не ограничен таким образом. BodyContent по существу похож на внутреннюю страницу JSP. – Yoni

5

Для расширения Brabster's answer, я использовал 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()); 
    } 
} 

}

6

Если вы используете пользовательский тег с JSP 2.0 подхода , вы можете сделать это, как:

косметики 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>