当前位置: 首页 > 面试题库 >

使用JSP include指令包含文件,使用JSP include操作和使用JSP标记文件之间有什么区别?

章宏峻
2023-03-14
问题内容

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

在我看来,这与使用include并将参数传递给它完全相同。标记文件和包含的文件一样吗?


问题答案:

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

以下将在JSP中包含内容的4种机制可以归类为直接重用:(
对于引用“ Head First Servlets and JSP”的前3种机制)

1)he include directive:

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

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

2)The standard action:

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

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

3)The JSTL tag:

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

动态:在请求时,将URL属性值中的内容添加到当前页面。它的工作原理与相似 ,但功能更强大,更灵活:与其他两个包含项不同, URL可以来自Web Container外部!

4) Preludes and codas:

静态的:前奏和尾声只能应用于页面的开头和结尾。
你可以隐含包括序曲(也称为头)和音韵尾 一组JSP页面(也称为页脚)加入 <include-prelude><include-coda>一个内分别元素<jsp-property-group>在Web应用程序中元素的web.xml部署描述符。在此处了解更多信息:
• 在JSP的开头和结尾配置隐式包含
• 定义隐式包含

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

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

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

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



 类似资料:
  • 并在另一个JSP上调用它 在我看来,这与使用include并向其传递参数是一样的。那么标记文件和includes是一样的吗?

  • 根据JSP规范: JSP容器可以包含一种机制,用于在包含的文件发生更改时收到通知,因此容器可以重新编译JSP页面。但是,JSP 1.2规范没有一种方法可以指示包含文件已更改的JSP容器。 我在一个在线教程中发现了这一点: 如果包含的文件发生了更改,但包含它的JSP没有发生更改,那么这些更改只会在我们使用包含动作标记时反映出来。如果您使用include指令,这些更改将不会反映出来,因为JSP没有更改

  • 它们之间有什么区别吗?

  • 我刚刚开始使用Angular 2。 我想知道Angular 2中的组件和指令有什么区别?

  • 我想在jsp文档文件中使用类似的内容: 但是,在我看到的所有30个示例中,每个人都使用简单的jsp语法,而不是jsp文档语法。类似于这样: 根本不起作用。页面上看不到驻留在 /WEB-INF/tags中的所有标记文件。只有当我定义一个tld文件并在其中列出所有标记时,才能在页面上访问它们。是否可以避免tld声明并仍然在jsp文档页面中使用标记文件?

  • 我正在尝试创建一个安装在sling中的捆绑包,并使用自定义TagLib。我想使用标记文件,而不是使用扩展TagSupport的java类。这样,我可以使用Sling模型来表示JCR,使用JSP标记文件来表示标记。 这是我的标记文件,它是一个非常基本的锚,没有什么特别的,我只是想测试一下: 我创建了一个TLD文件,我在WEB-INF/tags和META-INF/tags文件夹中都尝试了该文件(我去掉