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

那么我应该使用哪种方法呢?一个现在被认为是不推荐的,还是它们都有效并且涵盖了不同的用例?

Edit

使用这个标记文件和使用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 syntax elements的简短概述:

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

内容如何包含在JSP中

有几种机制可以重用JSP文件中的内容.

The following 4 mechanisms to include content in JSP can be categorized as direct reuse:
(for the first 3 mechanisms quoting from "Head First Servlets and JSP")

1) The include directive:

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

Static:将文件属性值中的内容添加到当前页面at translation time.指令是

2) The <jsp:include> standard action:

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

Dynamic:将页面属性值中的内容添加到当前页面at request time.更适合动态

3) The <c:import> JSTL tag:

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

Dynamic:将URL属性值中的内容添加到当前页面at request time.它的工作原理很像

4) 前奏曲和尾声:

Static: preludes and codas can be applied only to the beginnings and ends of pages.
You can implicitly include preludes (also called headers) and codas (also called footers) for a group of JSP pages by adding <include-prelude> and <include-coda> elements respectively within a <jsp-property-group> element in the Web application web.xml deployment descriptor. Read more here:
Configuring Implicit Includes at the Beginning and End of JSPs
Defining implicit includes


Tag File是内容重用的indirect method,encapsulating reusable content的方式. ATag File是包含可作为custom tag重用的JSP代码片段的源文件.

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

Tag file(JSP 2.0引入的概念)是选项for creating custom tags之一.这是一种更快更简单的建造custom tags的方法.

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


关于你的编辑

也许在您的示例中(在您的"Edit"段中),使用direct include和标记文件之间没有区别.但是custom tags have a rich set of features.他们可以

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

  • 将变量传回调用页.

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

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

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

也请阅读"ProJSP2":Understanding JSP Custom Tags.


有用的阅读.


Conclusion

Use the right tools for each task.

Use Tag Files作为一种快速简单的创建custom tags的方法,可以帮助你encapsulate reusable content.

至于在JSP中包含内容(引用自here):

  • Use the include directive如果文件是changes rarely.这是最快的机械装置.如果容器没有自动检测到更改,可以通过删除主页类文件强制更改生效.
  • Use the include action仅适用于changes often的内容,如果在请求主页之前无法决定要包含哪个页面.

Java相关问答推荐

表格栏上的事件过滤器在PFA中不起作用

Java Streams在矩阵遍历中的性能影响

BiPredicate和如何使用它

@从类文件中删除JsonProperty—Java

取消按钮,但没有任何操作方法引发和异常

缩小画布比例后更改滚动窗格的内部大小

关于泛型的覆盖规则

为什么一个Test的instance?& gt;在构造函数中接受非空对象?

Spring Boot Maven包

呈现文本和四舍五入矩形时出现的JavaFX窗格白色瑕疵

我不能再在Android Studio Hedgehog上用Java语言创建新项目了吗?

试着做一个2x2的魔方求解算法,我如何找到解路径(DFS)?

PDFBox未加载内容

Java-动态绑定-问题-了解

如何在代码中将行呈现在矩形前面?

如何配置空手道以使用FeignClient或RestTemplate代替ApacheHttpClient

Java中HashSet的搜索时间与TreeSet的搜索时间

TinyDB问题,无法解析符号';上下文&

控制器建议异常处理

ControlsFX RangeSlider在方向垂直时滞后