【问题标题】:Import a specific element with c:import in a .jsp在 .jsp 中使用 c:import 导入特定元素
【发布时间】:2011-12-30 20:54:55
【问题描述】:

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

背景

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

我们一直在尝试

<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 秒)(将第一行从 &lt;!DOCTYPE... 更改为 &lt;?xml... 可以解决此问题。)

  2. 所选元素中的任何标记都会消失。示例 I &lt;b&gt;love&lt;/b&gt; tacos 输出为 I love tacos

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

【问题讨论】:

  • 我很好奇你为什么要在 JSP 中这样做。
  • @DaveNewton 我不会考虑模型的“帮助内容”部分。我会认为这是观点的一部分。至于为什么它在服务器端而不是使用 JavaScript 按需加载 - 我们认为如果不需要使用 AJAX 加载帮助内容,则更容易满足我们的可访问性目标(例如屏幕阅读器)。如果我误解了您的问题,请告诉我。
  • IMO 在视图中执行这种逻辑与 JSP 的用途背道而驰;视图层应该尽可能的愚蠢。以这种方式进行测试也更加困难。任何进入视图层的东西都是模型的一部分,无论它是通过上下文暴露,还是一个“官方”模型对象等等。当然,我也认为将它保存在一个巨大的 HTML 文件中也不是很棒。 YMMV。
  • @DaveNewton 感谢您的反馈。这真是一个大实验。我们的里程可能很容易为 0。

标签: java jsp xpath import jstl


【解决方案1】:

我决定使用 JSoup 和自定义标签来执行此操作。 我们的概念证明是

WEB-INF/tags/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>

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2021-05-25
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多