Встроенный пользовательский тег в динамическое содержимое (вложенный тег) не отображается - PullRequest
0 голосов
/ 08 сентября 2008

Встроенный пользовательский тег в динамическое содержимое (вложенный тег) не отображается.

У меня есть страница, которая извлекает динамический контент из 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>

этот тег должен выводить поле div примерно так

*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*

Важное уведомление отображается нормально, но тег цитаты не будет обрабатываться, просто вставляться в строку и помещаться как тег text / 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 ]

1 голос
/ 08 сентября 2008

Просто с помощью

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

Я бы пошел с регулярным выражением.

0 голосов
/ 30 июня 2011

Я был бы склонен изменить «архитектуру вашего тегирования», так как данные, которые вы хотите получить, не должны быть тегами внутри класса, так как это «разметка», предназначенная для страницы (хотя в неизвестности можно получить поток оценочной программы движка сервлета JSP).

Что вы, вероятно, найдете лучше и больше в рамках стандартной процедуры, так это использование "взаимодействующих тегов" с расширением класса BodyTagSupport и возвращением EVAL_BODY_BUFFERED в методе doStartTag () для повторения обработки тела и / или * 1008. * совместное использование объекта, например сохранение извлеченных данных в иерархии приложений сеанса или сеанса для пользователя.

Для получения дополнительной информации см. Учебное пособие по пользовательским тегам oracle j2ee .

...