包含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和传递参数相同。 所以标签文件是否包含相同?

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

在JSP中包含以下4种机制可以被归类为直接重用
(从“Head First Servlets和JSP”引用的前三种机制)

1)包含指令:

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

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

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

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

dynamic在请求时将页面属性的值中的内容添加到当前页面。 更多的是来自JSP的dynamic内容。

3) <c:import> JSTL标签:

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

dynamic请求时 ,将URL属性值的内容添加到当前页面。 它的工作方式与<jsp:include>非常相似,但function更强大,更灵活:与其他两种不同, <c:import> url可以来自web Container外部

4)前奏和标语:

静态 :前奏和编尾只能应用于页面的开始和结束
您可以通过在<jsp-property-group>元素的<jsp-property-group>元素中分别添加<include-prelude><include-coda>元素,为一组JSP页面隐式地包含前奏曲 (也称为页眉)和编码 (也称为页脚) Web应用程序的web.xml部署描述符。 在这里阅读更多:
• 在JSP的开始和结束处configuration隐式包含
• 定义隐式包含


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

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

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

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


关于你的编辑

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

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

  • 将variables传递callback用页面。

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

  • 相互沟通。 您可以创build并初始化一个JavaBeans组件,创build一个公共ELvariables,该variables在一个标记中引用该bean,然后在另一个标记中使用该bean。

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

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


有用的阅读。

  • 包含指令和包含在JSP中的动作的区别

  • JSP技巧使模板更容易

  • 非常丰富且易于理解的coreservlet.com教程,包含<jsp:include> VS. <%@ include %> <jsp:include> VS. <%@ include %>比较表:
    在JSP页面中包含文件和小程序

  • coreservlets.com提供的另一个与标签库和标签文件相关的好教程:
    创build自定义JSP标记库:基础

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

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

  • 本书“Pro JSP 2”的摘录也讨论了为什么你需要一个标签文件而不是使用静态include
    重新使用标签文件的内容


结论

使用正确的工具来完成具体任务。

使用标记文件作为创build自定义标记的快捷方式。

至于JSP中的包含内容(引自这里 ):

  • 如果文件更改很less, 请使用include指令 。 这是最快的机制。 如果您的容器未自动检测到更改,则可以通过删除主页面类文件强制更改生效。

  • 使用include操作仅适用于经常更改的内容,以及在请求主页面之前无法确定要包含哪个页面。

可能的重复的问题

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

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

另一方面,JSP Action标签指示容器暂停执行此页面,运行包含的页面,并将该页面的输出合并到此页面的输出中。

  • 每个包含的页面在运行时都作为单独的servlet执行。
  • 可以在运行时有条件地包含页面。 这对于构build包含页面的模板框架通常很有用。 父页面可以根据某个运行时间条件确定哪个页面(如果有的话)包括在内。
  • scriptletvariables的值需要显式传递给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" %>是不可能的

所有三个模板选项( <%@include><jsp:include><%@tag>都是有效的,所有这三个选项都覆盖了不同的用例。

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

<jsp:include> (和JSTL的<c:import> ,类似,甚至更强大)最适合dynamic内容。 当您需要包含来自本地或远程的其他URL的内容时使用这些内容; 当你所包含的资源本身是dynamic的; 或者当包含的内容使用与包含页面冲突的variables或bean定义时。 <c:import>还允许您将包含的文本存储在一个variables中,您可以进一步处理或重用。 这两个都会导致调度额外的运行时间成本:这是最小的,但是您需要知道dynamic包含不是“免费的”。

要创build可重用的用户界面组件时使用标记文件。 如果您有一个Widgets列表,并且您想要遍历Widgets并显示每个Widgets的属性(在一个表格中,或者在一个表格中),您可以创build一个标签。 标签可以带参数,使用<%@tag attribute> ,这些参数可以是强制的或可选的 – 有点像方法参数。

标记文件是一种简单的,基于JSP的编写标记库的机制,它必须使用Java代码编写(在JSP 2.0之前)。 当标签中有大量的渲染时,编写JSP标签文件要干净得多:如果您使用Java编写代码,则无需混合使用Java和HTML代码。

Java重访

  1. include指令包含的资源在jsp编译期间被加载,而include操作包含的资源在请求时被加载。
  2. 在include指令的情况下,对包含资源的任何更改都将不可见,直到jsp文件再次编译。 在包含操作的情况下,包含资源的任何更改将在下一个请求中可见。
  3. 包含指令是静态导入,而包含动作是dynamic导入
  4. 包含指令使用文件属性指定要包含的资源,而包含操作使用页面属性用于同一目的。