What's the difference between including files

2019-05-04 17:01发布

看来,有两种方法可以用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>

在我看来,是很一样使用包括和传递参数给它。 那么,标记文件一样包括?

Answer 1:

有用于在JSP文件中重复使用内容的机制。

在JSP以下4个机制包括的内容可以分为直接再利用
(对于第一3个机制从引用“头首先Servlet和JSP” )

1)包括指令:

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

静态 :将来自在翻译时文件属性为当前页面的价值含量。 该指令原本用于静态布局模板,如HTML头。

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

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

动态 :增加从页面属性添加到当前页面的值在请求时的内容。 旨在为更多动态内容采用JSP来。

3) <c:import> JSTL标签:

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

动态 :增加从URL属性到当前页面的价值内容, 在请求时 。 它的工作原理很像<jsp:include> ,但它的功能更强大和灵活的:不像其他两种包括,在<c:import> URL可以从Web容器外

4)前奏曲与尾波:

静态 :前奏和尾波可以仅适用于起点和页面端
可以通过添加隐含地包括一组JSP页面前奏曲 (也称为头)和尾波 (也称为页脚) <include-prelude><include-coda>分别内的元件<jsp-property-group>中的元素Web应用程序的web.xml部署描述符。 在这里阅读更多:
• 配置隐式包括在JSP页面的开头和结尾
• 定义隐含包括


标签文件是重复使用内容的间接方法封装可重用内容的方式。 一个标签文件是包含的JSP代码片段是可重复使用的自定义标签源文件。

目的包括和标记文件是不同的。

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

可以通过自定义标记来执行的任务的一些例子包括对隐含对象,处理表单,访问数据库和其他企业服务,如电子邮件和目录操作,并实施流量控制。


关于你的编辑

也许在你的例子(在你的编辑 ),则采用直接包含和标记文件没有区别。 但是, 自定义标签具有丰富的功能 。 他们能

  • 通过从调用页面传递的属性来定制。

  • 变量传递回调用页面。

  • 提供给JSP页面访问的所有对象。

  • 相互通信。 您可以创建和初始化一个JavaBeans组件,创建是指在豆一个标签公共EL变量,然后在另一个标签使用bean。

  • 由私有变量的方式彼此相套和沟通中。

:同样来自“临JSP 2”阅读理解JSP自定义标记 。


有用的书。

  • 区别include指令,包括在JSP动作

  • JSP技巧,使模板化更容易

  • 非常丰富和易于理解的教程从coreservlet.com与美丽的解释,其中包括<jsp:include> VS. <%@ include %> <jsp:include> VS. <%@ include %>比较表:
    包括文件和小程序中的JSP页面

  • coreservlets.com另外一个不错的教程,标记库和标记文件相关:
    创建自定义JSP标记库:基础知识

  • 官方的Java EE 5教程使用的例子:
    封装可重用内容使用标记文件编写

  • 这从官方的Java EE 5教程页面应该给你更多的了解:
    重用在JSP页面中的内容

  • 本文节选自书“临JSP 2”也铁饼为什么你需要一个标记文件,而不是使用静态包括
    标记文件的内容重用


结论

使用正确的工具的具体任务。

使用标记文件的创建自定义标签的快速简便的方法。

至于在JSP(从报价包括内容这里 ):

  • 使用include指令 ,如果该文件很少改变。 这是最快的机制。 如果你的容器没有自动检测更改,您可以强制更改删除主网页类文件生效。

  • 使用include动作只能经常更改的,如果哪个页面包含直到主页面被请求不能决定内容。



Answer 2:

可能有重复的问题

<@include> -该指令标签指示JSP编译器创建生成的servlet代码之前合并所包含的文件到JSP的内容。 它相当于切割,并从包括页面直接进入你的JSP粘贴文本。

  • 只有一个小服务程序在运行时执行。
  • 在父页面中声明Scriptlet中变量可以被包含的页面(记住,它们是同一个页面)进行访问。
  • 所包含的页面并不需要能够被编译为一个独立的JSP。 它可以是一个代码段或纯文本。 所包含的页面不会被编译为一个独立的。 所包含的页面也可以有任何扩展,虽然名.jspf已经成为常规使用的扩展。
  • 在旧的容器的一个缺点是,直到父页面更新更改包括页面可能无法生效。 Tomcat的最近的版本将检查包括更新的网页,并迫使父母重新编译,如果他们更新。
  • 另一个缺点是,由于该代码是直接联到生成的servlet的服务的方法,该方法可以变得非常大。 如果超过64 KB,你的JSP编译很可能会失败。

<jsp:include> -在另一方面,JSP操作标记指示容器暂停该页面的执行,去运行包含的页面,从该页面的输出合并成从该页面的输出。

  • 每个页面包含如在运行时单独的servlet执行。
  • 页面可以有条件地包括在运行时。 这往往是模板化是构建页面出来的包括框架有用。 父页面可以确定根据某些运行时条件包括页面,如果有的话。
  • 小脚本变量的值需要明确地传递到包括网页。
  • 所包含的网页,必须能够独立运行。
  • 你不太可能碰到编译错误是由于生成的servlet类被超过的最大尺寸的方法。

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



Answer 3:

的主要优点<jsp:include /><%@ include >是:

<jsp:include />允许通过参数

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

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



Answer 4:

所有这三个模板选项- <%@include><jsp:include><%@tag>是有效的,并且所有三个覆盖不同的使用情况。

<@include>中,JSP解析器线所包含的文件的内容,存入JSP编译(类似于一个C之前#include )。 你会使用简单的,静态内容此选项:例如,如果你想包括页眉,页脚,或导航元素融入在你的web应用程序的每一页。 所包含的内容变成编译JSP的一部分,在运行时也没有额外的费用。

<jsp:include> (和JSTL的<c:import> ,这是类似并且甚至更强大的)最适合于动态内容。 当你需要包括来自另一个URL,本地或远程内容使用这些; 当你包括资源本身是动态的; 或者当包括内容使用变量或bean定义,与包括分页冲突。 <c:import>还允许您存储在一个变量,它可以进一步处理或再利用所包括的文本。 这两种招致派遣额外的运行时代价:这是最小的,但你需要知道的是,动态包括不是“自由”。

当你想创建可重用的用户界面组件使用的标记文件。 如果你有小工具,比如一个列表,你要遍历窗口小部件和每个显示属性(在表中,或者在一种形式),你需要创建一个标签。 标签可以使用参数,使用<%@tag attribute>并且这些参数可以是强制的或可选-有点像方法参数。

标记文件编写标签库的简单的,基于JSP的机制,你不得不使用Java代码来写这(预JSP 2.0)。 这是一个很大清洁编写JSP标记文件时,有大量的渲染在标签做的:你不需要混合Java和HTML代码,你必须做,如果你用Java写的标签。



Answer 5:

Java的再访

  1. 通过包含资源包括在JSP转换时指令被加载,同时由包括资源包括在要求的时间行动被加载。
  2. 对包括资源的任何变化将不会在情况下是可见的include指令,直到JSP文件再次编译。 虽然在的情况下,包括动作,包括资源的任何变化将是下一个请求可见。
  3. include指令静态导入,而包括动作是动态的进口
  4. include指令使用文件属性来指定资源被列入,而包括同一目的的行动使用的页面属性。


文章来源: What's the difference between including files with JSP include directive, JSP include action and using JSP Tag Files?