一、引子
我们知道一般网站的每个页面都拥有相同的页眉(如网站的logo)和页脚文件(如版权说明),而且这两个部分的内容一般是很少发生变动的。为此,我们就需要在每个页面都反复的编写同样的页眉和页脚,想想也够无聊的。既然都是重复的内容,那我们是不是可以将这些重复性的内容放到单独的一个文件(一般称为模板文件)中,然后在其他页面引入这个文件呢?答案是可以的。
在Jsp中就有一个“包含”的处理机制,目的就是用于将一些模板文件内容包含到当前页面,然后和当前页面内容一起作为响应输出。
二、Jsp中的两种包含机制:include指令(<%@ include %>)和include动作(<jsp:include >)。下面我们就来具体分析下这两种机制的作用及区别。
1、本质区别
1)include指令:该指令属于编译指令,发生在Jsp转换为Servlet的阶段。简单来说,就是在转换阶段把被包含的文件内容复制(原封不动的)到当前页面中,然后和当前页面一起编译生成一个Servlet文件。
由于容器是把两个文件合并后在执行编译,所以编译后只会生成一个class文件(main_jsp.class)。因此,不管是主文件或被包含文件发生改变,容器都需要重新编译主文件。一般使用include指令包含静态的资源文件。
我们知道,不使用包含指令时,我们需要手工地将重复的页眉(或页脚)内容复制到每一个页面中。不过有了include指令,就相当于把复制的工作交给了容器。我们要做的就是在页面中使用include指令告诉(指示)容器处理被包含的文件,剩下的工作(复制并编译等)将由容器全权负责。
2)include动作:该动作属于运行时方法调用,发生在运行Servlet生成响应的阶段。简单来说,就是在运行Servlet时插入被包含文件的响应内容。<jsp:include>动作的关键在于,容器需要根据页面(page)属性创建一个RequestDispatcher,并应用include()方法,把被包含文件的响应插到当前响应中,然后一起输出。
使用include动作时,容器会分别对主文件和被包含文件进行单独的编译,所以编译后会产生两个class文件:main_jsp.class和header_jsp.class。另外,被包含文件的编译工作是在主文件运行时(执行到主文件中的include()方法(容器根据include动作生成的方法调用))发生的。因此,被包含文件改变时,只需重新编译被包含文件即可,而无需重新编译主文件。一般使用include动作包含经常需要变动的文件。
2、语法(假设需要在main.jsp中包含header.jsp页面)
1)include指令:<%@ include file="header.jsp" %>
file属性:指定被包含的文件。该属性不支持任何表达式,也不允许在指令中传递参数。
2)include动作:<jsp:include page="header.jsp" />
page属性:指定了被包含页面的路径,可以是一个代表相对路径的表达式,也可以使用<jsp:param>来传递参数给被包含的页面。
3、处理流程(假设需要在main.jsp中包含header.jsp页面)
1)include指令:容器要做很多工作(转换),不过也只是针对第一个请求而已。
a)客户请求main.jsp页面。
b)容器接受到客户请求,查找到main.jsp页面,并开始执行转换工作。
c)容器发现include指令,则合并header.jsp的源代码到当前页面,然后一起转换为main Servlet文件。
d)容器把转换后的main Servlet源文件(.java)编译为字节码文件(.class)。
e)以上步骤只发生一次(第一次请求main.jsp的时候),除非man.jsp或header.jsp发生改变。
f) 容器加载编译后的字节码(.class)文件,并完成初始化工作。
g)容器为请求创建(分配)一个新的线程,并调用_jspService()方法处理请求,并最终返回响应。
2)include动作:容器不用做什么转换工作,但对应每个请求却要处理更多的事情。
a)客户请求main.jsp页面。
b)容器接受到客户请求,查找到main.jsp页面,并开始执行转换工作。
c)容器发现include动作,并利用它在main Servlet代码中插入一个方法调用(include,见后面实例代码),这会在运行main Servlet时动态地将header.jsp的响应与main.jsp的响应合并。
d)容器把转换后的main Servlet源文件(.java)编译为字节码文件(.class)。
e)以上步骤只发生一次(第一次请求main.jsp的时候),除非man.jsp发生改变。
f)容器加载编译后的字节码(.class)文件,并完成初始化工作。
g)容器为请求创建(分配)一个新的线程,并调用_jspService()方法处理请求。
h)容器在main Servlet中调用一个方法(如include())完成动态包含,即将main Servlet和header Servlet生成的响应合并,然后返回响应。(该步骤中,header.jsp会在某个时刻被容器执行转换、编译、加载及初始化。)
4、使用注意
1)include指令:由于是在编译时包含源文件,所以被包含页面可以包含可能影响主页面的JSP构造,比如属性、方法的定义和文档类型的设定等,不过要避免声明相同的变量或方法,否则会产生编译错误。
2)include动作:由于是在运行时包含响应内容,所以被包含页面不能使用任何有可能影响主页面的JSP构造,比如文档类型设定等。另外,被包含的页面不能包含开始和结束HTML及BODY标签。
3)被包含的页面不能修改响应状态码或者设置首部(可能不会发生错误,只是达不到预期的结果)。
5、实例代码(特别关注使用include和include动作生成的Servlet文件区别)
1)被包含页面:header.jsp(简单起见,就打印一句话)。
<strong>This is header.jsp!</strong><br>
2)main.jsp文件(使用include指令)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <html> <head> <title>main.jsp</title> </head> <body> <%@ include file="header.jsp" %> This is main.jsp<br> </body> </html>
转换后只生成一个main_jsp.java文件,_jspService()中关键代码。
//设置响应内容类型及编码 response.setContentType("text/html;charset=utf-8"); out.write("\r\n"); out.write("<html>\r\n"); out.write(" <head>\r\n"); out.write(" <title>main.jsp</title>\r\n"); out.write(" </head>\r\n"); out.write(" <body>\r\n"); out.write(" "); out.write("\r\n"); //只是将header.jsp的内容原封不动的输出 out.write("<strong>This is header.jsp!</strong><br>\r\n"); out.write("\r\n"); out.write(" This is main.jsp<br>\r\n"); out.write(" </body>\r\n"); out.write("</html>\r\n");
3)main.jsp文件(使用include动作)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <html> <head> <title>main.jsp</title> </head> <body> <jsp:include page="header.jsp" /> This is main.jsp<br> </body> </html>
转换后会生成两个java文件:header_jsp.java和main_jsp.java。
header_jsp.java中_jspService()的关键代码:(没什么特别的,只是简单的输出)
//设置响应内容类型及编码 response.setContentType("text/html"); out.write("\r\n"); out.write("<strong>This is header.jsp!</strong><br>\r\n");
main_jsp.java中_jspService()的关键代码:(注意容器调用的include()方法)
//设置响应内容类型及编码 response.setContentType("text/html;charset=utf-8"); out.write("\r\n"); out.write("<html>\r\n"); out.write(" <head>\r\n"); out.write(" <title>main.jsp</title>\r\n"); out.write(" </head>\r\n"); out.write(" <body>\r\n"); out.write(" "); //关键点:运行时,容器会调用include()方法实现动态包含(顺便注意下传入的参数有什么作用) org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "header.jsp", out, false); out.write("\r\n"); out.write(" This is main.jsp<br>\r\n"); out.write(" </body>\r\n"); out.write("</html>\r\n");
相关推荐
* include指令:<%@ include file="..." %>,用于将其他文件包含到当前JSP页面中。 二、脚本(Script) JSP脚本是一种Java语句或表达式,它可以嵌入到JSP页面中,从而实现动态网页的开发。常见的JSP脚本有: * ...
2. **JSP元素**:JSP页面由JSP指令(如`<%@ page %>`, `<%@ include %>`, `<jsp:include>`)、JSP动作(如`<jsp:useBean>`, `<jsp:setProperty>`, `<jsp:getProperty>`)、脚本元素(声明、脚本let、表达式)和静态...
2. **JSP指令和动作**:学习如何使用page、include、forward等指令,以及useBean、setProperty等JSP动作元素。 3. **内置对象**:了解JSP的九大内置对象,如request、response、session和application,及其在处理...
JSP有两种类型的指令:页面指令(Page Directive)和包含指令(Include Directive)。页面指令如`<%@ page %>`用来设置JSP页面的属性,如导入类、设置字符编码等。包含指令如`<jsp:include>`用于动态地将一个或多个...
《JSP实例开发源码——深入理解javapms-1.2-beta》 JSP(JavaServer Pages)是Java平台上的一种动态网页技术,它允许开发者将静态HTML与动态Java代码结合,以创建交互式Web应用。javapms-1.2-beta.zip是一个JSP实例...
这个家庭理财系统实例提供了学习和理解JSP与Applet结合开发Web应用的实践案例,对于初学者来说,通过分析源代码可以深入理解这两种技术在实际项目中的应用。同时,也是对数据库操作、MVC模式、用户认证等常见Web开发...
1. **JSP基础**:了解JSP的核心概念,如指令标签(page, include, taglib)、动作标签(jsp:useBean, jsp:setProperty, jsp:getProperty等)、脚本元素(声明、表达式、脚本块)和EL(Expression Language)。...
通过本文对Servlet和JSP技术的深入讲解,我们可以看到这两种技术在Java Web开发中的重要地位。Servlet负责处理业务逻辑,而JSP则专注于展示数据。结合使用Tomcat作为部署平台,开发者可以构建出功能强大且易于维护的...
《深入解析JSP源码——lerx2_utf8_v2_beta2_20121214》 JSP(JavaServer Pages)是Java平台上的动态网页技术,它允许开发者将HTML代码与...对于想要深入理解和提升JSP开发技能的程序员来说,这是一个宝贵的参考资料。
- `include`指令:用于静态包含其他文件,如`<%@ include file="header.jsp" %>` - `taglib`指令:引入自定义标签库,如`<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>` **3. JSP动作...
在JSP中,行为元素分为两种类型:JSP标准行为元素和用户自定义行为元素。标准行为元素是JSP规范预先定义的,如<jsp:include>和<jsp:forward>等,可以直接在JSP页面中使用。而用户自定义行为元素则是开发者根据需求...
- **元素**:JSP页面中的元素包括脚本元素、指令元素和动作元素。脚本元素主要用于声明变量、定义方法或编写运行时代码;指令元素如`<%@ page ... %>`用于配置页面属性;动作元素如`<jsp:include>`用于处理包含和...
3. **JSP表达式与脚本片段**:如何在页面上输出数据,以及在JSP页面中编写Java代码的两种方式——表达式和脚本片段。 4. **JSP指令**:包括page、include和taglib指令的使用,它们用于配置页面属性、引入其他文件和...
这门课程主要涵盖了JavaWeb开发中的一个重要组成部分——JSP(JavaServer Pages)的动作元素。JSP是Java平台上的一个动态网页技术,它允许开发者在HTML或者XML文档中嵌入Java代码,以实现服务器端的动态网页生成。...
指令如`<%@ page %>`定义页面属性,脚本元素包括声明、表达式和脚本块,动作如`<jsp:include>`用于动态包含其他页面。 2. **JSP转换**:JSP文件在服务器上会被编译成对应的Servlet类,然后由Servlet处理请求。这个...
8. **Servlet与JSP的关系**:JSP最终会被翻译成Servlet,因此,理解Servlet的工作原理有助于深入理解JSP。JSP和Servlet都是Java Web开发中的组件,但JSP更注重视图层,而Servlet则更多地涉及控制逻辑。 9. **JSP...
2. **JSP指令**:包括`page`、`include`和`taglib`指令。`page`指令用于设置JSP页面的全局属性,如导入的类、编码方式等;`include`指令用于在编译时将另一个文件的内容插入到当前页面;`taglib`指令用于引入自定义...
本书通过两个实际的项目案例——网上书店和学生成绩管理系统,将理论与实践相结合,使学习者能够更好地理解和应用JSP技术。 一、JSP基础 JSP是一种动态网页开发技术,它是Java平台的一部分,允许开发者在HTML或XML...
2. **JSP指令**:包括`<%@ page %>`, `<%@ include %>`, 和`<jsp:include>`等,用于配置页面属性或包含其他文件。 3. **JSP动作元素**:如`<jsp:useBean>`, `<jsp:setProperty>`, `<jsp:getProperty>`等,用于管理...