使用 JSP 头文件包含文件、 JSP 包含动作和使用 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>

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

剪辑

使用此标记文件与使用 include 不是一样的吗?

// 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>

在我看来,这与使用 include 并向其传递参数非常相似。那么标记文件和包含文件是一样的吗?

130198 次浏览

可能的重复问题

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

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

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

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

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

<jsp:include />相对于 <%@ include >的主要优势是:

<jsp:include />允许传递参数

<jsp:include page="inclusion.jsp">
<jsp:param name="menu" value="objectValue"/>
</jsp:include>

这在 <%@include file="somefile.jsp" %>中是不可能的

JSP 语法元素概述

首先,为了让事情更清楚,下面是 JSP 语法元素的一个简短概述:

  • 指令 : 这些指令将关于 JSP 页面的信息作为 完整。
  • 脚本元素 : 这些是 Java 编码元素,如 声明、表达式、脚本和注释。
  • 对象 显微镜 : 可以显式创建 JSP 对象,也可以创建 在给定范围内可以隐式访问,如从 在 JSP 页面或会话中的任何位置。
  • 操作 : 这些操作创建对象或影响 JSP 中的输出流 回应(或两者)。

JSP 中如何包含内容

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

以下 4种在 JSP 中包含内容的机制可归类为 直接循环再用:
(引自 “头先 Servlet 和 JSP”的前3个机制)

1)包括 指令:

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

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

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

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

Dynamic : 将页面属性值的内容添加到当前页面 按要求时间。更适合动态 来自 JSP 的内容。

3) <c:import> JSTL 标签:

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

Dynamic : 将 URL 属性值的内容添加到当前页面 按要求时间。它的工作原理很像 <jsp:include>,但它更强大和灵活: 不同于 另外两个包括,<c:import> < strong > URL 可以从外部 网络容器 !

4)前奏曲和结尾:

静态 : 前奏曲Codas 只能应用于页面的开头和结尾
您可以隐式地包含 前奏曲(也称为 Header)和 Codas (也称为页脚)为一组 JSP 页添加 内的 <include-prelude><include-coda>元素 在 Web 应用程序的 Xml部署描述符中添加一个 <jsp-property-group>元素。

点击这里阅读更多:
在 JSP 的开头和结尾配置隐式包含
定义隐式包含


标签文件 是一种内容重用的 间接法间接法,是 封装可重用内容的方式。 标记文件是一个源文件,其中包含可以作为 定制标签重用的 JSP 代码片段。

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

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

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


关于你的编辑

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

  • 通过从调用页传递的属性进行自定义。

  • 将变量传递回调用页。

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

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

  • 彼此嵌套并通过私有变量进行通信。

也请阅读“ Pro JSP 2”: 了解 JSP 自定义标记中的内容。


有用的资料。


结论

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

使用 标记文件 作为一种快速简单的方法来创建可以帮助你的 封装可重用的内容定制标签

至于 JSP 中的包含内容(引自 给你) :

  • 使用头文件 如果文件 很少改变。这是最快的装置。如果容器不能自动检测到更改,则可以通过删除主页类文件来强制更改生效。
  • 只对 经常改变的内容使用 include 操作 ,如果在请求主页之前无法决定包含哪个页面,则使用 include 操作。

所有三个模板选项-<%@include><jsp:include><%@tag>都是有效的,并且所有三个都涵盖不同的用例。

使用 <@include>,JSP 解析器在编译之前将所包含文件的内容内联到 JSP 中(类似于 C #include)。您可以将此选项用于简单的静态内容: 例如,如果您想在 Web 应用程序的每个页面中包含页眉、页脚或导航元素。所包含的内容成为已编译 JSP 的一部分,并且在运行时没有额外的成本。

<jsp:include>(和 JSTL 的 <c:import>类似,甚至更强大)最适合动态内容。当您需要包含来自另一个 URL (本地或远程)的内容时,当包含的资源本身是动态的时,或者当包含的内容使用与包含页面冲突的变量或 bean 定义时,请使用这些。<c:import>还允许您将包含的文本存储在变量中,您可以进一步操作或重用该变量。这两者都会为分派带来额外的运行时成本: 这是最小的,但是您需要知道动态包含并不是“免费的”。

如果要创建可重用的用户界面组件,请使用标记文件。例如,如果您有一个 Widgets 列表,并且希望在 Widgets 上迭代并显示每个 Widgets 的属性(在表中或在表单中) ,那么您需要创建一个标记。标记可以使用 <%@tag attribute>获取参数,这些参数可以是强制的或可选的——有点像方法参数。

标记文件是一种更简单的、基于 JSP 的编写标记库的机制,您必须使用 Java 代码编写标记库(在 JSP 2.0之前)。当标记中有很多呈现要做时,编写 JSP 标记文件要干净得多: 如果使用 Java 编写标记,就不需要混合使用 Java 和 HTML 代码。

根据: 重温 Java

  1. 头文件包含的资源在 jsp 转换期间加载,而 include 操作包含的资源在请求期间加载。

  2. 在 jsp 文件再次编译之前,所包含资源的任何更改都不会显示在头文件中。而在包含操作的情况下,包含资源的任何更改都将在下一个请求中可见。

  3. 头文件是静态导入,而 include 操作是动态导入。

  4. 头文件使用 file 属性来指定要包含的资源,include 操作使用 page 属性来实现同样的目的。