Импортируйте определенный элемент с помощью c: import в .jsp - PullRequest
1 голос
/ 17 ноября 2011

Я хочу импортировать определенный элемент из внешнего файла xhtml в мою JSP. Возможно ли это с библиотеками JSTL?

фон

У нас есть страница справки по XHTML. Каждый раздел справки содержит элемент div, а каждый элемент div имеет id. В других частях нашего приложения мы хотим импортировать определенные id s со страницы справки, чтобы предоставить контекстно-зависимую помощь.

Мы экспериментировали с

<c:import var="helpData" url="file:/tmp/help.html"/>
<x:parse var="helpXml" doc="${helpData}  " />
<x:out select="$helpXml//div[@id='helpTopicXXX']" escapeXml="false"/>

однако у нас есть две проблемы

  1. parse очень медленно (~ 10 секунд) в XHTML (изменение первой строки на <?xml... с <!DOCTYPE... исправляет это.)

  2. Любая разметка внутри выбранного элемента исчезнет. Пример I <b>love</b> tacos выглядит как I love tacos

У кого-нибудь есть хороший способ отображения определенного элемента из внешнего источника? Кто-нибудь знает, как заставить библиотеку JSTL xml отображать выбранный узел как xml, а не как текст (чтобы решить проблему 2)?

1 Ответ

0 голосов
/ 18 ноября 2011

Я решил использовать JSoup и пользовательский тег для этого. Наше доказательство концепции

WEB-INF / теги / htmlParser.tag

<%@ attribute description = "The html data to parse." name="html" required="true" rtexprvalue="true" %>
<%@ attribute description = "The id to grab from the html." name="id" required="true" rtexprvalue="true" %>
<%
 org.jsoup.nodes.Document doc = org.jsoup.Jsoup.parse(html);
 org.jsoup.nodes.Element e = doc.select("#" + id).first();
 if (e != null) {
    out.println(e.outerHtml());
 } else {
getJspBody().invoke(out);
 }
%>

и образец .jsp

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="h" %>
<head></head>
<body>
<c:import var="helpData" url="file:/tmp/help.html"/>

<p>Help loaded from other file:</p>
<h:htmlParser html="${helpData}" id="helpTopic1"/>

<p>Example loading invalid id</p>
<h:htmlParser html="${helpData}" id="taco">
Display this text if id <i>taco</i> doesn't exist.
</h:htmlParser>

</body>
...