实验说明JSP中include指令和include动作指令的区别

  • Post author:
  • Post category:其他


关于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

出现了错误!

error

错误信息:

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动作指令的区别。更多细节的差异,可以类似地通过更多的实验来探索验证。

相关推荐:



版权声明:本文为a153375250原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。