使用 JSP include 指令、JSP include 操作和使用 JSP 标记文件来包含文件之间有什么区别?

新手上路,请多包涵

似乎有两种使用 JSP 进行模板化的方法。包含具有这些语句之一的文件

<%@ include file="foo.html" %>
<jsp:include page="foo.html" />

或者使用 JSP 标记文件

// Save this as mytag.tag
<%@ tag description="Description" pageEncoding="UTF-8"%>
<html>
<head>
</head>
<body>
    <jsp:doBody/>
</body>
</html>

在另一个 JSP 页面中调用它

<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:mytag>
    <h1>Hello World</h1>
</t:mytag>

那么我应该使用哪种方法呢?一个现在被认为已弃用,还是它们都有效并涵盖不同的用例?

编辑

使用此标记文件与使用包含文件不一样吗?

 // Save this as product.tag
<%@ tag description="Product templage" pageEncoding="UTF-8"%>
<%@ tag import="com.myapp.Product" %>
<%@ attribute name="product" required="true" type="com.myapp.Product"%>

Product name: ${product.name} <br/>
Quantity: ${product.quantity} <br/>

并在另一个 JSP 上调用它

<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:product>
    <c:forEach items="${cart.products}" var="product">
        <t:product product="${product}"/>
    </c:forEach>
</t:product>

在我看来,这与使用包含并将参数传递给它非常相同。那么 Tag Files 和 include 一样吗?

原文由 sonicboom 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 705
2 个回答

JSP 语法元素概述

首先,为了让事情更清楚,这里是 JSP 语法元素 的简短概述:

  • 指令:这些指令传达有关整个 JSP 页面的信息。
  • 脚本元素:这些是 Java 编码元素,例如声明、表达式、小脚本和注释。
  • 对象范围:JSP 对象可以显式或隐式创建,并且可以在给定范围内访问,例如从 JSP 页面或会话中的任何位置。
  • Actions :这些创建对象或影响 JSP 响应中的输出流(或两者)。

JSP 中如何包含内容

有几种机制可以重用 JSP 文件中的内容。

以下 4 种在 JSP 中包含内容的机制 可以归类为 直接重用

(前 3 种机制引用自 “Head First Servlets and JSP”

1)包含 _指令_:

 <%@ include file="header.html" %>

静态在翻译时 将文件属性值的内容添加到当前页面。该指令最初用于静态布局模板,如 HTML 标题。

2) <jsp:include> _标准动作_:

 <jsp:include page="header.jsp" />

动态在请求时 将 page 属性值的内容添加到当前页面。更多地用于来自 JSP 的动态内容。

3) <c:import> JSTL标签:

 <c:import url=”http://www.example.com/foo/bar.html” />

动态在请求时 将 URL 属性值的内容添加到当前页面。它的工作方式很像 <jsp:include> ,但它更强大和灵活:与其他两个包含不同, <c:import> URL 可以来自网络容器之外

4)前奏和尾声:

静态前奏结尾 只能应用于页面的开头和结尾

您可以通过在 --- 569e15ed8b31c9241722b6ccb --- 和 <include-coda> 元素中分别添加 <include-prelude><jsp-property-group> 569e15ed8b31c9832974a -d88— 元素 --- Web 应用程序 web.xml 部署描述符中的元素。

在这里阅读更多:

在 JSP 的开头和结尾配置隐式包含

定义隐式包含


Tag File 是一种 间接的内容复用方法,是对可复用内容进行 封装 的方式。 标记文件 是一个源文件,其中包含可作为 自定义标记 重用的 JSP 代码片段。

包含文件和标记文件的用途不同。

标记文件(JSP 2.0 引入的概念)是 创建自定义标记 的选项之一。这是构建 自定义标签 的更快、更简单的方法。 自定义标签,也称为标签扩展,是 JSP 元素,允许将其他 Java 组件提供的自定义逻辑和输出插入到 JSP 页面中。通过自定义标记提供的逻辑由称为 标记处理程序 的 Java 对象实现。

自定义标记可以执行的一些任务示例包括对隐式对象进行操作、处理表单、访问数据库和其他企业服务(例如电子邮件和目录)以及实施流量控制。


关于您的编辑

也许在您的示例中(在您的 “编辑” 段落中),使用直接包含和标记文件之间没有区别。但是 自定义标签有一组丰富的特性。他们能

  • 通过调用页面传递的属性进行定制。

  • 将变量传递回调用页面。

  • 访问 JSP 页面可用的所有对象。

  • 互相交流。您可以创建并初始化一个 JavaBeans 组件,创建一个在一个标记中引用该 bean 的公共 EL 变量,然后在另一个标记中使用该 bean。

  • 相互嵌套并通过私有变量进行通信。

另请阅读“Pro JSP 2”: Understanding JSP Custom Tags


有用的阅读。

在 JSP 页面中包含文件和小程序

  • 来自 coreservlets.com 的另一个与标记库和标记文件相关的不错的教程:

创建自定义 JSP 标记库:基础知识

  • 带有示例的官方 Java EE 5 教程:

使用标记文件封装可重用内容

  • 官方 Java EE 5 教程中的这一页应该会让您更加了解:

在 JSP 页面中重用内容

  • “Pro JSP 2”一书的摘录还讨论 了为什么需要标记文件而不是使用静态包含

重用标签文件的内容

  • 来自 Oracle 文档的非常有用的指南:

静态包含与动态包含


结论

为每项任务使用正确的工具。

使用 标记文件 作为创建 自定义标记 的快速简便方法,可以帮助您 _封装可重用的内容_。

至于 JSP 中包含的内容(引用自 此处):

  • 如果文件 _很少更改_, 请使用 include 指令。这是最快的机制。如果您的容器没有自动检测更改,您可以通过删除主页类文件来强制更改生效。
  • 仅对 经常更改 的内容 使用 include 操作,如果在请求主页之前无法决定要包含哪个页面。

原文由 informatik01 发布,翻译遵循 CC BY-SA 4.0 许可协议

可能重复的问题

<@include> - 指令标记指示 JSP 编译器在创建生成的 servlet 代码之前将包含文件的内容合并到 JSP 中。这相当于将包含页面中的文本直接剪切并粘贴到 JSP 中。

  • 运行时只执行一个 servlet。
  • 在父页面中声明的 Scriptlet 变量可以在包含页面中访问(记住,它们是同一页面)。
  • 包含的页面不需要能够编译为独立的 JSP。它可以是代码片段或纯文本。包含的页面永远不会被编译为独立页面。包含的页面也可以有任何扩展名,尽管 .jspf 已成为常规使用的扩展名。
  • 旧容器的一个缺点是,在更新父页面之前,对包含页面的更改可能不会生效。最新版本的 Tomcat 将检查包含页面是否有更新,并在更新时强制重新编译父页面。
  • 另一个缺点是,由于代码直接内联到生成的 servlet 的服务方法中,该方法可能会变得非常大。如果它超过 64 KB,您的 JSP 编译可能会失败。

<jsp:include> - 另一方面,JSP Action 标记指示容器暂停此页面的执行,运行包含的页面,并将该页面的输出合并到此页面的输出中。

  • 每个包含的页面在运行时作为单独的 servlet 执行。
  • 可以在运行时有条件地包含页面。这对于从包含构建页面的模板框架通常很有用。父页面可以根据某些运行时条件确定要包括哪个页面(如果有的话)。
  • scriptlet 变量的值需要显式传递给包含页面。
  • 包含的页面必须能够独立运行。
  • 由于生成的 servlet 类中超过了最大方法大小,您不太可能遇到编译错误。

根据您的需要,您可以使用 <@include><jsp:include>

原文由 Darth 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题