和的区别


  • JSP相关概念
    • JSP的翻译阶段Translation Phases和执行阶段Execution Phases
    • JSP页面的元素类型
      • 指令元素
      • 脚本元素
      • 执行元素
  • 结论
  • JSP代码实验

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页面接受的所有请求均有效,为翻译阶段提供信息,其对应的语法如下:

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

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

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

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

之所以称之为“胶水”,可能是因为它位于HTML文本和执行元素中间,用于生成动态的内容。
执行元素:
为请求处理阶段(也就是执行阶段)提供信息,针对不同的request可能会生成不同的内容。其实就对应JSP的TAG,语法如下:
body

结论 从概念上看,jsp:include属于执行元素(action elements),为执行阶段提供信息;include属于指令元素(directive elements),为翻译阶段提供信息。
具体到容器实现上,通过jsp:include包含的页面,是把该jsp页面生成的响应合并到父jsp的响应中,两个页面均会生成自己的Servlet;而include包含的页面,是把该jsp页面的代码合并到父jsp的代码中,服务端只生成一个Setvlet。
JSP代码实验 main.jsp
Insert title hereThe main page.

include.jsp

当通过来包含页面时,编译器报错,提示重复定义变量,因此可看出属于静态包含,包含页面和被包含页面会生成一个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生成的响应。

    推荐阅读