在.jsp中导入c:import的特定元素

在.jsp中导入c:import的特定元素

问题描述:

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

背景

我们有一个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实在是太慢了(〜10秒)的XHTML(可改变从<!DOCTYPE...修复第一线<?xml...

  2. 所选元素内的任何标记消失。例如I <b>love</b> tacos出来为I love tacos

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

+0

我很好奇,为什么你想这样做在JSP 。 –

+0

@DaveNewton我不会考虑模型的'帮助内容'部分。我会考虑它的一部分的看法。至于为什么它需要服务器端和使用JavaScript来按需加载 - 我们认为如果帮助内容不需要使用AJAX加载,我们更容易达到我们的可访问性目标(例如屏幕阅读器)。如果我误解了你的问题,请告诉我。 – Patrick

+1

在视图中执行这种逻辑的IMO运行与JSP的用途相反;视图层应该尽可能地愚蠢。这样测试也更困难。任何使它成为视图层的东西*都是模型的一部分,无论它是通过上下文暴露的,是一个“官方”模型对象等。当然,我也认为将它保存在一个巨大的HTML文件中也不是很好。因人而异。 –

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