Встроенный пользовательский тег в динамическом контенте (вложенный тег), не отображаемый
-
09-06-2019 - |
Вопрос
Встроенный пользовательский тег в динамическом контенте (вложенный тег) не отображается.
У меня есть страница, которая извлекает динамический контент из 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*
Важное уведомление отображается нормально, но тег цитаты не обрабатывается, а просто вставляется в строку и помещается как обычный текстовый / 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>
Я знаю, что это связано с процессорами и препроцессорами, но я не совсем уверен в том, как заставить это работать.
Решение
Просто используя
<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 translator разобрать его.
Вы можете использовать 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>
Я бы предпочел использовать регулярное выражение.
Другие советы
Я был бы склонен изменить "архитектуру вашей маркировки" в том смысле, что данные, которые вы хотите получить, не должны быть с помощью тега внутри класса, поскольку это "разметка", предназначенная для страницы (хотя и в безвестности можно получить оценивающий программный поток движка сервлетов JSP).
То, что вы, вероятно, нашли бы лучше и больше в рамках стандартной процедуры, - это использование "сотрудничающих тегов" с BodyTagSupport
расширение класса и возврат EVAL_BODY_BUFFERED
в методе doStartTag() для повторения обработки тела и/или совместное использование объектов, такое как хранение восстановленных данных в иерархии приложений сеанса или в сеансе для пользователя.
Видишь руководство по пользовательским тегам oracle j2ee для получения дополнительной информации.