关于include指令和include动作指令的介绍见
JSP基本语法(三)
首先,我们来看一下include指令所包含的内容与当前页面是一个整体是什么意思。
我们在Tomcat安装目录下的webapps文件夹下新建一个文件夹includeTEST,在这里进行一些实验。
在includeTEST文件夹下新建一个include.jsp:
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%>
<html>
<head><title>include</title></head>
<body>
现在是:<%@ include file="date.jsp" %>
</body>
</html>
在这个JSP页面中,我们用include指令静态包含了date.jsp,接下来我们就新建一个date.jsp放在和include.jsp相同的目录下/webapps/includeTEST/
date.jsp
<%
Date date = new Date();
%>
<%=
date.toString()
%>
接下来启动Tomcat,打开浏览器输入
localhost:8080/includeTEST/include.jsp
能够正常显示出当前时间。然后我们到Tomcat安装目录下的
\work\Catalina\localhost\includeTESTorg\apache\jsp
中去查找include.jsp页面生成的对应的java文件,事实上我们会在这个目录下找到inlucde_jsp.java以及include_jsp.class,没有date_jsp.java相关的文件,说明include.jsp页面包括静态包含的date.jsp,一起只生成了一个文件,include_jsp.java截取如下:
out.write("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write(" <head><title>JSP-welcome</title></head>\r\n");
out.write(" <body>\r\n");
out.write(" 现在是:");
Date date = new Date();
out.write("\r\n");
out.write("\r\n");
out.print(
date.toString()
我们发现,在该include_jsp.java文件中,new了一个Date对象,然后进行打印输出,也就是直接将date.jsp中的内容合进来,生成了同一个文件。
作为对比,我们同样在includeTEST/下新建一个includeAction.jsp,我们这次试用jsp的include动作指令来包含date.jsp:
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%>
<html>
<head><title>includeAction</title></head>
<body>
现在是:<jsp:include page="date.jsp"/>
</body>
</html>
此时,我们打开浏览器输入
localhost:8080/includeTEST/includeAction.jsp
出现了错误!
错误信息:
org.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: 2 in the jsp file: /date.jsp
Date cannot be resolved to a type
1: <%
2: Date date = new Date();
3: %>
4:
5: <%=
错误原因很简单,Date不能识别!但是使用
<%@ include file="date.jsp" %>
时可以识别,为什么此处
<jsp:include page="date.jsp"/>
就不能识别?!
原因就在于那句话:include标签会把包含的部分和当前页面生成同一个整体!于是Date就被头部的
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%>
中的import=”java.util.*”引进来了。但是使用
<jsp:include page="date.jsp"/>
生成的是两个单独的实体,于是在date.jsp这个独立的实体中,Date将无法识别!
这时候我们再次打开以下目录:
\work\Catalina\localhost\includeTESTorg\apache\jsp
会发现,当前目录下生成了
在这里我们看到了date_jsp.java,includeAction_jsp.java以及includeAction_jsp.class文件。生成了includeAction对应的class文件,说明includeAction.jsp页面可以正常编译执行。再次说明,includeAction.jsp和date.jsp是两个单独的实体!同时,由于includeAction.jsp能够生成class文件,也说明了date_jsp.java的编译执行起码是在includeAction执行之后才进行的,实际上是执行到
现在是:<jsp:include page="date.jsp"/>
对应的语句的时候,date.jsp才第一次被请求。但是编译出错。
接下来我们做以下修改,我们把date.jsp做以下修改并另存为date1.jap:
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%>
<%
Date date = new Date();
%>
<%=
date.toString()
%>
再次在浏览器输入
localhost:8080/includeTEST/includeAction.jsp
此时,时间可以打印出来了!关于中文乱码问题我们暂时不管。
再次进入
\work\Catalina\localhost\includeTESTorg\apache\jsp
此时生成了对应的date1_jsp.java以及date1_jsp.class文件:
最后我们用打开includeAction_jsp.java,部分代码如下:
out.write("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write(" <head><title>includeAction</title></head>\r\n");
out.write(" <body>\r\n");
out.write(" �板�ㄦ��锛�");
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "date1.jsp", out, false);
out.write("\r\n");
out.write(" </body>\r\n");
out.write("</html>");
这里我们可以清楚地看到,对date1.jsp的include是通过请求的方式进行的!
通过这个实验我们可以看到include指令和include动作指令的区别。更多细节的差异,可以类似地通过更多的实验来探索验证。
相关推荐: