在.jsp中使用c: Import导入特定的元素



我想将外部xhtml文件中的特定元素导入到JSP中。这在JSTL库中可能吗?

我们有一个XHTML帮助页面。每个帮助主题都在一个div元素中,每个div都有一个id元素。在应用程序的其他部分,我们希望从帮助页面导入特定的id,以提供特定于上下文的帮助。

我们一直在试验

<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在XHTML上确实很慢(约10秒)(将第一行从<!DOCTYPE...更改为<?xml...可以修复此问题)

  2. 所选元素中的任何标记都将消失。示例I <b>love</b> tacos输出为I love tacos

有没有人有从外部来源显示特定元素的好方法?有人知道如何让JSTL xml库将所选节点显示为xml而不是文本(以解决问题2)吗?

我决定使用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>

最新更新