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

2022-08-31 07:19:36

似乎有两种使用 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>

在我看来,这与使用包含并向其传递参数完全相同。那么标记文件是否与包含文件相同?


答案 1

JSP 语法元素概述

首先,为了使事情更清楚,以下是JSP语法元素的简短概述:

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

内容如何包含在 JSP 中

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

JSP 中包含内容的以下 4 种机制可以归类为直接重用
(对于引用“Head First Servlets and JSP”的前 3 种机制))

1) 包含指令

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

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

2)标准动作<jsp:include>

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

动态:在请求时将页面属性值中的内容添加到当前页面。它更适合来自 JSP 的动态内容。

3) JSTL 标签:<c:import>

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

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

4)前奏曲和codas:

静态前奏coda 只能应用于页面的开头和结尾
通过在 Web 应用程序 Web 部署描述符中的元素中分别添加和元素,可以隐式包含一组 JSP 页的前(也称为页眉).xml codas<include-prelude><include-coda><jsp-property-group>

在此处阅读更多内容:
在 JSP
的开头和结尾配置隐式包含 • 定义隐式包含


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

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

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

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


关于您的编辑

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

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

  • 将变量传递回调用页。

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

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

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

另请阅读“Pro JSP 2”:了解 JSP 自定义标记


有用的阅读。


结论

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

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

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

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

答案 2

可能的重复问题

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

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

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

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

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


推荐