嵌入式自定义标记在动态内容(嵌套标记)中无法呈现

时间:2008-09-08 07:28:36

标签: java jsp jstl custom-tag

动态内容中嵌入的自定义标记(嵌套标记)无法呈现。

我有一个从javabean中提取动态内容的页面,并将对象列表传递给自定义标记以便处理成html。在每个对象中都有一堆html要输出,其中包含我想要呈现的第二个自定义标记。问题是标签调用呈现为明文。

一个例子可能会更好地为我服务。

1从数据库中提取信息并通过javabean将其返回到页面。将此信息发送到自定义标记以进行输出。

<jsp:useBean id="ImportantNoticeBean" scope="page" class="com.mysite.beans.ImportantNoticeProcessBean"/>  <%-- Declare the bean --%>
<c:forEach var="noticeBean" items="${ImportantNoticeBean.importantNotices}"> <%-- Get the info --%>
    <mysite:notice importantNotice="${noticeBean}"/> <%-- give it to the tag for processing --%>
</c:forEach>

这个标签应该输出一个像这样的盒子

*SNIP* class for custom tag def and method setup etc
out.println("<div class=\"importantNotice\">");
out.println("   " + importantNotice.getMessage());
out.println("   <div class=\"importantnoticedates\">Posted: " + importantNotice.getDateFrom() + " End: " + importantNotice.getDateTo()</div>");
out.println("   <div class=\"noticeAuthor\">- " + importantNotice.getAuthor() + "</div>");
out.println("</div>");
*SNIP*

这很好,并且符合预期

<div class="importantNotice">
    <p>This is a very important message. Everyone should pay attenton to it.</p>
    <div class="importantnoticedates">Posted: 2008-09-08 End: 2008-09-08</div>
    <div class="noticeAuthor">- The author</div>
</div>

2例如,在上面的例子中,我在importantNotice.getMessage()字符串中有一个自定义标记:

*SNIP* "This is a very important message. Everyone should pay attenton to it. <mysite:quote author="Some Guy">Quote this</mysite:quote>" *SNIP*

重要通知呈现正常,但引号标签不会被处理,只是插入字符串并作为纯文本/ html标记放置。

<div class="importantNotice">
    <p>This is a very important message. Everyone should pay attenton to it. <mysite:quote author="Some Guy">Quote this</mysite:quote></p>
    <div class="importantnoticedates">Posted: 2008-09-08 End: 2008-09-08</div>
    <div class="noticeAuthor">- The author</div>
</div>

而不是

<div class="importantNotice">
    <p>This is a very important message. Everyone should pay attenton to it. <div class="quote">Quote this <span class="authorofquote">Some Guy</span></div></p>    // or wahtever I choose as the output
    <div class="importantnoticedates">Posted: 2008-09-08 End: 2008-09-08</div>
    <div class="noticeAuthor">- The author</div>
</div>

我知道这与处理器和预处理器有关,但我不确定如何使这项工作。

2 个答案:

答案 0 :(得分:1)

只需使用

<bodycontent>JSP</bodycontent>

还不够。你应该做像

这样的事情
JspFragment body = getJspBody(); 
StringWriter stringWriter = new StringWriter(); 
StringBuffer buff = stringWriter.getBuffer(); 
buff.append("<h1>"); 
body.invoke(stringWriter); 
buff.append("</h1>"); 
out.println(stringWriter);

获取内部标记(示例适用于SimpleTag doTag方法)。

但是,在问题的代码中,我看到内部标记来自一个字符串,该字符串不是作为JSP的一部分呈现的,而只是一些随机字符串。我认为你不能强迫JSP翻译解析它。

您可以在您的情况下使用regexp或尝试重新设计您的代码,以获得这样的jsp:

<jsp:useBean id="ImportantNoticeBean" scope="page class="com.mysite.beans.ImportantNoticeProcessBean"/>
<c:forEach var="noticeBean" items="${ImportantNoticeBean.importantNotices}">
    <mysite:notice importantNotice="${noticeBean}">
        <mysite:quote author="Some Guy">Quote this</mysite:quote>
        <mysite:messagebody author="Some Guy" />
    </mysite:notice>
</c:forEach>

我会选择正则表达式。

答案 1 :(得分:0)

我倾向于更改“标记的体系结构”,因为您希望实现的数据不应该通过类的内部标记,因为它是为页面设计的“标记”(虽然在默默无闻中,可以获得JSP Servlet引擎的评估程序线程。

在标准程序中你可能会发现更好,更多的是使用带有BodyTagSupport类扩展的“合作标签”并在doStartTag()方法中返回EVAL_BODY_BUFFERED来重复处理正文和/或对象共享,例如在会话的应用程序层次结构中或在用户的会话中存储已检索的数据。

有关详细信息,请参阅oracle j2ee custom tags tutorial