【问题标题】:What's the difference between including files with JSP include directive, JSP include action and using JSP Tag Files?使用 JSP 包含指令、JSP 包含操作和使用 JSP 标记文件包含文件有什么区别?
【发布时间】:2017-02-04 02:32:45
【问题描述】:

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

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

【问题讨论】:

    标签: java jsp include jsp-tags tagfile


    【解决方案1】:

    JSP 语法元素概述

    首先,为了让事情更清楚,这里是JSP syntax elements的简短概述:

    • Directives:这些将有关 JSP 页面的信息作为 整个。
    • Scripting elements:这些是 Java 编码元素,例如 声明、表达式、scriptlet 和 cmets。
    • Objects and scopes: JSP 对象可以显式创建,也可以创建 隐式并且在给定范围内可访问,例如从 JSP 页面或会话中的任何位置。
    • Actions:这些创建对象或影响 JSP 中的输出流 响应(或两者)。

    内容如何包含在 JSP 中

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

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

    1) 包含指令

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

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

    2)&lt;jsp:include&gt;标准动作

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

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

    3) &lt;c:import&gt; JSTL 标签:

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

    动态:将来自 URL 属性值的内容添加到当前页面,在请求时。它的工作原理很像 &lt;jsp:include&gt;,但它更强大、更灵活:不像 其他两个包括,&lt;c:import&gt; url 可以来自外部 网络容器

    4) 前奏曲和尾声:

    静态:前奏曲和尾声只能应用于页面的开头和结尾
    您可以隐式包含 preludes(也称为标题)和 codas (也称为页脚)为一组 JSP 页面添加 &lt;include-prelude&gt;&lt;include-coda&gt; 元素分别在 Web 应用程序 web.xml 部署描述符中的 &lt;jsp-property-group&gt; 元素。在此处阅读更多信息:
    Configuring Implicit Includes at the Beginning and End of JSPs
    Defining implicit includes


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

    包含文件和标记文件的目的不同。

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

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


    关于您的编辑

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

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

    • 将变量传回调用页面。

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

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

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

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


    有用的阅读。


    结论

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

    使用 标签文件 作为创建 自定义标签 的一种快速简便的方法,可以帮助您封装可重复使用的内容.

    关于JSP中包含的内容(引用自here):

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

    【讨论】:

    • 但是 和使用标签文件不一样吗?我看不出有任何区别...您可以将变量传递给包含在 中的文件,就像您可以将变量传递给标记文件一样。这两种方法都可以让您重用内容,它们似乎做的事情完全相同。他们除了名字有什么区别吗?
    • @sonicboom 更新了我的答案
    • @informatik01 非常好的答案,我欣赏深度、漂亮的格式和非常方便的 4 机制列表。
    • 与 相比究竟有什么优势?
    • @Stefan 不是每一次,但只有在它被更改时,即与包含(“父”)JSP 的方式相同。使用&lt;jsp:include&gt; 时生成的代码示例参见this answer。这也是对"JSP Execution" 进程的非常有用的描述。
    【解决方案2】:

    根据: Java Revisited

    1. include 指令包含的资源在 jsp 翻译期间加载,而 include 操作包含的资源在请求期间加载。

    2. 在重新编译 jsp 文件之前,在包含指令的情况下,对包含资源的任何更改都将不可见。而在包含操作的情况下,包含资源的任何更改都将在下一个请求中可见。

    3. include 指令是静态导入,而 include 动作是动态导入。

    4. include 指令使用文件属性来指定要包含的资源,而 include 操作使用页面属性来达到同样的目的。

    【讨论】:

      【解决方案3】:

      &lt;jsp:include /&gt; 相对于&lt;%@ include &gt; 的主要优势是:

      &lt;jsp:include /&gt; 允许传递参数

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

      这在&lt;%@include file="somefile.jsp" %&gt;是不可能的

      【讨论】:

      • tagfiles 怎么样,我知道 inlcudes 是如何工作的。我想知道标签文件如何与包含相关,因为它们似乎提供了相同的功能。使用标签文件和使用包含有什么区别?
      • &lt;%@include file="somefile.jsp?menu=value" %&gt; 怎么样?也有限制吗?
      【解决方案4】:

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

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

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

      当您想要创建可重用的用户界面组件时,请使用标记文件。例如,如果您有一个小部件列表,并且想要遍历小部件并显示每个小部件的属性(在表格或表单中),您将创建一个标签。标签可以接受参数,使用&lt;%@tag attribute&gt;,这些参数可以是强制的或可选的——有点像方法参数。

      标记文件是一种更简单的、基于 JSP 的标记库编写机制,您必须使用 Java 代码编写(在 JSP 2.0 之前)。当标签中有大量渲染工作时,编写 JSP 标签文件会更简洁:您不需要像用 Java 编写标签那样混合 Java 和 HTML 代码。

      【讨论】:

      • 因此,如果一个 JSP 调用 &lt;jsp:include&gt; 10 次某个 other 文件,该 other 文件将被翻译 10 次(加上发送它的响应)。在使用 &lt;@include&gt; 10 次时,它只会翻译该 other 文件一次(在翻译时)。我做对了吗?
      【解决方案5】:

      Possible Duplicate Question

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

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

      &lt;jsp:include&gt; - 另一方面,JSP Action 标签指示容器暂停该页面的执行,继续运行包含的页面,并将该页面的输出合并到该页面的输出中。

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

      根据您的需要,您可以使用&lt;@include&gt;&lt;jsp:include&gt;

      【讨论】:

      • 您的意思是像您在问题中显示的那样:&lt;t:mytag&gt;&lt;h1&gt;Hello World&lt;/h1&gt;&lt;/t:mytag&gt;?这不是包含,这是标签的正常使用(如&lt;jsp:useBean&gt;&lt;c:if&gt;)。
      • 那么使用标签文件和包含标签文件似乎可以用于在页面中包含内容有什么区别?
      猜你喜欢
      • 2011-08-03
      • 2016-08-12
      • 2017-10-25
      • 2016-02-19
      • 2015-02-23
      • 1970-01-01
      • 2012-06-06
      相关资源
      最近更新 更多