<jsp:include></jsp:include>和<%@ include %>的区别

JSP相关概念

    <jsp:include page="../header.jsp"></jsp:include>
    <%@ include file="../tld.jsp"%>

上述两个标签都能在jsp中引入文件,为了理解它们的区别,先了解下JSP相关的几个概念:

JSP的翻译阶段(Translation Phases)和执行阶段(Execution Phases):

在JSP页面的生命周期中包含两个阶段:翻译阶段和执行阶段。
在翻译阶段,容器需要创建或定位JSP页面的实现对象,也就是将JSP页面翻译成对应的Servlet。
在执行阶段,容器需要实例化request和response对象,并调用JSP页面的实现对象(服务端对应的Servlet)处理客户端的请求,最后将服务端的响应传递给客户端。

JSP页面的元素类型:

JSP页面中包含3种类型的元素:指令元素(directive elements)、脚本元素(scripting elements)、执行元素(action elements)。

指令元素:

指令元素提供全局的信息,对JSP页面接受的所有请求均有效,为翻译阶段提供信息,其对应的语法如下:

    <%@ directive...%>

脚本元素:

脚本元素是模板和执行元素的“胶水”(官方定义…表示不理解 - -)。对应一下具体内容,就不难理解了
The Expression Language (EL):通过它可以简化从不同数据源获取数据的操作,语法如下:

    ${expr}
    #{expr}

Declarations:声明服务端脚本(JAVA)使用的变量,语法如下:

    <%! ... %>

Scriptlet:服务端脚本(JAVA),语法如下:

     <% ... %>

Expressions:服务端表达式(JAVA),语法如下:

    <%= ... %>

之所以称之为“胶水”,可能是因为它位于HTML文本和执行元素中间,用于生成动态的内容。

执行元素:

为请求处理阶段(也就是执行阶段)提供信息,针对不同的request可能会生成不同的内容。其实就对应JSP的TAG,语法如下:

    <mytag attr1=”attribute value”...>body</mytag>
    <mytag attr1=”attribute value”.../>
    <mytag attr1=”attribute value” ...></mytag>

结论

从概念上看,jsp:include属于执行元素(action elements),为执行阶段提供信息;include属于指令元素(directive elements),为翻译阶段提供信息。

具体到容器实现上,通过jsp:include包含的页面,是把该jsp页面生成的响应合并到父jsp的响应中,两个页面均会生成自己的Servlet;而include包含的页面,是把该jsp页面的代码合并到父jsp的代码中,服务端只生成一个Setvlet。

JSP代码实验

main.jsp

<%@ page language="java" 
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%!
    String includeTest = "main";
%>
The main page.

<%@ include file="include.jsp" %>
</body>
</html>

include.jsp

<%@ page language="java" 
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%!
    String includeTest = "";
%>

当通过<%@ include %>来包含页面时,编译器报错,提示重复定义变量,因此可看出<%@ include %>属于静态包含,包含页面和被包含页面会生成一个Servlet。将其替换为jsp:include后,编译器成功编译,且服务端生成两个Servlet文件,main_jsp.java文件中通过以下代码包含inlcude.jsp页面生成的内容:

         org.apache.jasper.runtime.JspRuntimeLibrary.include(
         request, response, "include.jsp", out, false);

因此可看出jsp:include属于动态包含,父页面包含include.jsp生成的响应。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值