您可以使用以下方法将 JSP 页面合并到另一个页面中:include
像这样的指令 -
<%@ include file="/path/to/yourfile.jsp" %>
或通过使用<jsp:include>
标准动作是这样的——
<jsp:include page="/path/to/yourfile.jsp"/>
从以上两种方法来看,第一种方法会导致内容yourfile.jsp
要包含在页面翻译时。也就是说,当页面被转换为成熟的 servlet 类时,yourfile.jsp
将包含在 servlet 中。因此,这种包含只会在页面翻译时发生一次,仅在应用程序启动后的第一个用户请求时发生。
如果您使用第二种方法,那么每个用户都请求来自yourfile.jsp
将在运行时包含,而不是在页面翻译时包含。
当你使用include
指令,您基本上将目标文件的内容复制并粘贴到主文件中。如果目标文件包含任何生成动态内容的标签或EL,那么它们也将成为主文件的一部分,并且它们将相应地执行并生成动态内容。那里没问题。
但这种方法有一些局限性。例如,使用以下内容包含的页面include
无法更改响应状态代码或设置标头,这意味着您无法调用addCookies()
或其他一些标头设置方法yourfile.jsp
。如果你这样做,你不会得到错误,但你只是不会得到你所希望的。如果你使用<jsp:include>
那么所有这些都可以在包含的页面中完成,并且它们将相应地工作。
这两种方法之间存在另一个重要区别。假设您要包含一个文件,其中包含一些上下文相关的文本,这些文本会根据包含它们的页面而变化。随着include
方法,你将无法优雅地完成这个任务。但随着<jsp:include>
方法,你可以这样做 -
<jsp:include page="/path/to/yourfile.jsp">
<jsp:param name="myContextSensitiveText" value="Context Sensitive!!" />
</jsp:include>
这意味着您正在指定一个新的请求参数yourfile.jsp
,然后您可以从该文件访问该文件并相应地渲染它 -
${param.myContextSensitiveText} - Context Insensitive Text!!
与include
方法,您将无法完成此任务。
您应该使用哪一种完全取决于您的设计选择。
您应该记住另一件事 - 这两种方法都会将目标文件的内容包含到主文件中,尽管方式不同。因此,如果它们都包含 html 元素,例如<html>
or <body>
,那么你最终会得到两个<html>
和两个<body>
最终渲染页面中的元素,这将是无效的。
欲了解更多信息,您可以查看here and here.
Edit
还有第三种方法来包含页面JSTL。您可以使用import用于此目的的 JSTL 标签 -
<%-- You need to declare this at the top of your jsp page--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
...............
...............
<c:import url="/path/to/yourfile.jsp" />
这种方法的工作原理与<jsp:include>
,除了它更强大一点。您可以包含应用程序目录外部页面的内容,甚至也可以包含容器外部的内容!举个例子 -
<c:import url="http://www.google.com" />
该行将包含 google 主页的 HTML 内容。
如果您需要将参数传递到包含的页面,例如<jsp:include>
,那么你可以使用param tag -
<c:import url="/path/to/yourfile.jsp">
<c:param name="myContextSensitiveText" value="Context Sensitive!!" />
</c:import>
并以同样的方式访问它 -
${param.myContextSensitiveText} - Context Insensitive Text!!