[英]One of the difference between JSP include directive and JSP include tag
[英]What's the difference between including files with JSP include directive, JSP include action and using JSP Tag Files?
似乎有两种方法可以使用 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>
在我看来,这与使用包含并向其传递参数非常相似。 那么标签文件与包含文件相同吗?
首先,为了让事情更清楚,这里是JSP 语法元素的简短概述:
有多种机制可以重用 JSP 文件中的内容。
以下4 种在 JSP 中包含内容的机制可以归类为直接重用:
(前 3 种机制引用自“Head First Servlets and 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 Container 之外!4)前奏和尾声:
静态:前奏和尾声只能应用于页面的开头和结尾。
可以通过添加隐含地包括一组JSP页面前奏曲(也称为头)和尾波(也称为页脚)<include-prelude>
和<include-coda>
分别内的元件<jsp-property-group>
中的元素Web 应用程序web.xml部署描述符。 在此处阅读更多信息:
• 在 JSP 的开头和结尾配置隐式包含
• 定义隐式包含
Tag File是一种间接的内容复用方法,是一种封装可复用内容的方式。 标记文件是一个源文件,其中包含可作为自定义标记重用的 JSP 代码片段。
包含文件和标签文件的目的是不同的。
标记文件(JSP 2.0 引入的概念)是创建自定义标记的选项之一。 这是构建自定义标签的更快、更简单的方法。 自定义标记,也称为标记扩展,是 JSP 元素,允许将其他 Java 组件提供的自定义逻辑和输出插入到 JSP 页面中。 通过自定义标记提供的逻辑由称为标记处理程序的 Java 对象实现。
可以由自定义标签执行的一些任务示例包括对隐式对象的操作、处理表单、访问数据库和其他企业服务(例如电子邮件和目录)以及实现流控制。
也许在您的示例中(在您的“编辑”段落中),使用直接包含和标记文件之间没有区别。 但是自定义标签具有丰富的功能集。 他们能
通过从调用页面传递的属性进行自定义。
将变量传递回调用页面。
访问 JSP 页面可用的所有对象。
互相交流。 您可以创建并初始化一个 JavaBeans 组件,创建一个公共 EL 变量来引用一个标记中的那个 bean,然后在另一个标记中使用这个 bean。
相互嵌套并通过私有变量进行通信。
另请阅读“Pro JSP 2”: 了解 JSP 自定义标签。
来自coreservlet.com 的非常有用且易于理解的教程,其中包含<jsp:include> VS. <%@ include %>
精美解释<jsp:include> VS. <%@ include %>
<jsp:include> VS. <%@ include %>
对照表:
在 JSP 页面中包含文件和小程序
来自coreservlets.com 的另一个与标签库和标签文件相关的不错的教程:
创建自定义 JSP 标记库:基础知识
带有示例的官方 Java EE 5 教程:
使用标记文件封装可重用的内容。
这个来自官方 Java EE 5 教程的页面应该会让你有更多的理解:
重用 JSP 页面中的内容。
本书“Pro JSP 2”的摘录还讨论了为什么需要标记文件而不是使用静态包含:
重用带有标签文件的内容
来自 Oracle 文档的非常有用的指南:
静态包含与动态包含
为每项任务使用正确的工具。
使用标记文件作为创建自定义标记的一种快速简便的方法,可以帮助您封装可重用的内容。
至于JSP中包含的内容(引自此处):
- 如果文件很少更改,请使用 include 指令。 这是最快的机制。 如果您的容器没有自动检测更改,您可以通过删除主页类文件来强制更改生效。
- 仅对经常更改的内容使用包含操作,如果在请求主页之前无法决定包含哪个页面。
<@include>
- 指令标记指示 JSP 编译器在创建生成的 servlet 代码之前将包含文件的内容合并到 JSP 中。 这相当于将包含页面中的文本直接剪切并粘贴到 JSP 中。
<jsp:include>
- 另一方面,JSP Action 标记指示容器暂停此页面的执行,运行包含的页面,并将该页面的输出合并到该页面的输出中。
根据您的需要,您可以使用
<@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" %>
是不可能的
所有三个模板选项 - <%@include>
、 <jsp:include>
和<%@tag>
都是有效的,并且这三个选项都涵盖了不同的用例。
使用<@include>
,JSP 解析器在编译之前将包含文件的内容内联到 JSP 中(类似于 C #include
)。 您可以将此选项用于简单的静态内容:例如,如果您想将页眉、页脚或导航元素包含到您的网络应用程序的每个页面中。 包含的内容成为已编译 JSP 的一部分,并且在运行时没有额外成本。
<jsp:include>
(和 JSTL 的<c:import>
类似,甚至更强大)最适合动态内容。 当您需要包含来自另一个本地或远程 URL 的内容时,请使用这些; 当您包含的资源本身是动态的时; 或者当包含的内容使用与包含页面冲突的变量或 bean 定义时。 <c:import>
还允许您将包含的文本存储在变量中,您可以进一步操作或重用该变量。 这两者都会产生额外的调度运行时成本:这是最小的,但您需要注意动态包含不是“免费的”。
当您想要创建可重用的用户界面组件时,请使用标记文件。 例如,如果您有一个小部件列表,并且您想遍历小部件并显示每个小部件的属性(在表格中或在表单中),您需要创建一个标签。 标签可以接受参数,使用<%@tag attribute>
,这些参数可以是强制性的也可以是可选的——有点像方法参数。
标记文件是一种更简单的、基于 JSP 的标记库编写机制,您必须使用 Java 代码编写标记库(在 JSP 2.0 之前)。 当标记中有很多渲染要做时,编写 JSP 标记文件要干净得多:您不需要像用 Java 编写标记那样混合 Java 和 HTML 代码。
根据: Java Revisited
include 指令包含的资源在 jsp 转换时加载,而 include 操作包含的资源在请求时加载。
在包含指令的情况下,包含资源的任何更改都将不可见,直到再次编译 jsp 文件。 而在包含操作的情况下,包含资源的任何更改都将在下一个请求中可见。
Include指令是静态导入,而include动作是动态导入。
Include 指令使用 file 属性来指定要包含的资源,而 include 操作使用 page 属性来达到同样的目的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.