`
Aether
  • 浏览: 14255 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

JSP拾遗(五)——jsp文件包含指令

    博客分类:
  • Java
阅读更多

<%@include file=”fileName” %> <jsp:include flush="true" page="fileName"> 

 

    看到很多教程已经面试中都对jsp中的两个文件包含指令比较纠结,这里就特别对这两个指令做一个比较直观的对比。

   

    参数指定:filename不带路径时默认为当前页目录,如果设置目录,则需以应用的根目录设置地址。jsp:include中的参数flush必须为true,因为在jsp1.1false是一个无效的设定值。

   

下面示例,先看一下<%@include %>的处理方式:修改MyJsp.jsp,内容如下:

<html>
  <body>
    This is my first JSP! <br/>
    <%
    	String test ="This is a test value!";
    %>
    
    Here is include a jsp file, named include.jsp.<br/>
    <%@ include file="include.jsp" %>
  </body>
</html>


新建一个include.jsp,内容如下:

 

<!-- start of include.jsp -->
<html>
  <body>
    This is the include jsp.<br/>
    Here will print the String "test" if it's existing. </br>
    test = <%= test%>
  </body>
</html>
<!-- end of include.jsp --> 

 

浏览器上刷新MyJsp.jsp页面。我们可以看到,页面输出结果为:

This is my first JSP! 
Here is include a jsp file, named include.jsp.
This is the include jsp.
Here will print the String "test" if it's existing. 
test = This is a test value!

 

由结果可以看出,Myjsp.jsp中不仅输出了include.jsp文件中的内容,而且include.jsp中程序代码也共用了MyJsp.jsp中所定义的字符串test打开work下的源文件目录,我们可以发现,目录下面并没有include_jsp.java文件。打开MyJsp_jsp.java文件:

 

 

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class MyJsp_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static java.util.Vector _jspx_dependants;

  static {
    _jspx_dependants = new java.util.Vector(1);
    _jspx_dependants.add("/include.jsp");
  }

  public java.util.List getDependants() {
    return _jspx_dependants;
  }

  public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException {

    JspFactory _jspxFactory = null;
    PageContext pageContext = null;
    HttpSession session = null;
    ServletContext application = null;
    ServletConfig config = null;
    JspWriter out = null;
    Object page = this;
    JspWriter _jspx_out = null;
    PageContext _jspx_page_context = null;


    try {
      _jspxFactory = JspFactory.getDefaultFactory();
      response.setContentType("text/html");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("<html>\r\n");
      out.write("  <body>\r\n");
      out.write("    This is my first JSP! <br/>\r\n");
      out.write("    ");

    	String test ="This is a test value!";
    
      out.write("\r\n");
      out.write("    \r\n");
      out.write("    Here is include a jsp file, named include.jsp.<br/>\r\n");
      out.write("    ");
      out.write("<!-- start of include.jsp -->\r\n");
      out.write("<html>\r\n");
      out.write("  <body>\r\n");
      out.write("    This is the include jsp.<br/>\r\n");
      out.write("    Here will print the String \"test\" if it's existing. </br>\r\n");
      out.write("    test = ");
      out.print( test);
      out.write("\r\n");
      out.write("  </body>\r\n");
      out.write("</html>\r\n");
      out.write("<!-- end of include.jsp -->");
      out.write("\r\n");
      out.write("  </body>\r\n");
      out.write("</html>");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          out.clearBuffer();
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

 

java代码中可以看到,include.jsp中的内容被直接插入到MyJsp.jsp中输出,这个操作过程相当于直接把include.jsp的内容复制到MyJsp.jsp的相应位置,因此include.jsp可以和MyJsp.jsp直接共享所有的对象,和在同一个页面中编码一样。这里应该注意的是,include.jsp中的代码是始终包含在MyJsp.jsp中的,即使把<%@ include %>放在MyJsp.jsp的最末一行,在生成的java文件中,include的内容也将包含在一个_jspService()方法中。因此include.jsp中对公共对象的设置都会对Myjsp.jsp产生影响,特别是当include.jsp中调用response.getOutputStream()输出并关闭输出流后,如果不重新打开输出流,将会引起OutputStream is already closedIO异常。

 

 

MyJsp.jsp中的包含更改成jsp:include:

 

<html>
  <body>
    This is my first JSP! <br/>
    <%
    	String test ="This is a test value!";
    %>
    
    Here is include a jsp file, named include.jsp.<br/>
    <jsp:include flush="true" page="include.jsp" %>
  </body>
</html>

 

再次刷新MyJsp.jsp页面,结果显示如下: 

This is my first JSP! 
Here is include a jsp file, named include.jsp.

 

Include.jsp的内容并没有显示出来,查看tomcat控制台我们可以看到,有异常报出: 

2009-7-12 18:47:45 org.apache.jasper.compiler.Compiler generateClass
严重: Error compiling file: /D:/Program/Java/Tomcat5/work/Catalina/localhost/test//org/apache/jsp\include_jsp.java     [javac] Compiling 1 source file

D:\Program\Java\Tomcat5\work\Catalina\localhost\test\org\apache\jsp\include_jsp.java:48: 找不到符号
符号: 变量 test
位置: 类 org.apache.jsp.include_jsp
      out.print( test);
                 ^
1 错误

  

 

    这里提示test变量未定义。打开work下源代码目录,我们可以查找到include_jsp.java文件,但找不到include_jsp.class文件,因此在编译时出现了异常。很显然,用jsp:include时,所包含的jsp文件不能共用调用者的对象,并且本身就会编译成java类。

 

查看MyJsp_jsp.java文件,我们发现,这里关于include.jsp的调用,只有一句代码

 

 

 

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

 

很明显,jsp:include只调用一个工具方法来显示被包含文件的显示结果。两者的代码互不影响(当然,有三个对象还是传递了过去,你可以在include.jsp中改变这几个对象的属性值),因此include.jsp中的异常并不会影响到MyJsp.jsp文件的正常显示。

 

介于jsp:include并不能与调用者共享自定义的对象,当调用者需要向被包含页面传入参数时,需要使用<param >标签来传入参数,并在被包含页用request.getParameter()方法来获取。将MyJsp.jsp修改一下: 

<html>
  <body>
    This is my first JSP! <br/>
    <%
    	String test ="This is a test value!";
    %>
    
    Here is include a jsp file, named include.jsp.<br/>
    <jsp:include flush="true" page="include.jsp">
    	<jsp:param name="test" value="<%=test %>"></jsp:param>
    </jsp:include>
  </body>
</html>

 

include.jsp更改为:

<!-- start of include.jsp -->
<html>
  <body>
    This is the include jsp.<br/>
    Here will print the String "test" if it's existing. </br>
    test = <%= request.getParameter("test")%>
  </body>
</html>
<!-- end of include.jsp -->

  

    刷新MyJsp.jsp,页面即正常显示了。Html: 

This is my first JSP! 
Here is include a jsp file, named include.jsp.
This is the include jsp.
Here will print the String "test" if it's existing. 
test = This is a test value

综合上面比较可以看出,<%@ include %>包含文件时,相当于直接把被包含的文件的内容插入到包含页里面,因此被包含页的每次更新,就会导致所有包含页的全部重新编译,而被包含页并不会主动被编译,可以称之为jsp编译指令。而<jsp:include>则相当于直接调用被包含页的输出结果,被包含页的任意更新并不会导致包含页重新编译,可以称之为jsp运行时调用。这也引出了一个几乎所有教程中都会提到的一个结论:在包含不会经常修改到页面时,应使用<%@include %>,在包含经常修改到的页面时,应使用jsp:include。这里的修改指的是文件本身的修改,在实际系统应用中,网站的前台页面因样式等原因修改的几率比较大,因此应该使用jsp:include,那些以html静态页和jsp动态页来区分使用哪个include的方式,显然是错误的。

分享到:
评论
1 楼 Aether 2009-07-12  
Here is include a jsp file!
This is the include jsp!
大家BS我的烂E文吧

相关推荐

    jsp网络编程——多媒体文件(7)

    在“jsp网络编程——多媒体文件(7)”这个主题中,我们将深入探讨如何在Java Server Pages(JSP)中处理多媒体文件,这对于任何想要构建动态、交互式网站的开发者来说都是至关重要的。JSP是一种服务器端脚本语言,...

    jsp网络编程——多媒体文件(8)

    在"jsp网络编程——多媒体文件(8)"这个主题中,我们可能涉及到以下几个关键知识点: 1. **多媒体文件的存储与管理**: - 存储:多媒体文件通常较大,因此需要合理存储,避免对服务器磁盘空间造成过大压力。这...

    jsp网络编程——源文件(06——09)

    【描述】"jsp网络编程——源文件(06——09)" 描述的“帮助”意味着这可能包含了示例代码、练习项目或讲解文档,旨在辅助学习者理解JSP的网络编程技巧,通过实践提升技能。通常,源文件会包含HTML、Java以及JSP页面...

    jsp网络编程——源文件(01——05)

    - 包含指令(Include Directive):静态或动态地包含其他文件,增强代码复用。 - 复用指令(Taglib Directive):引入自定义标签库或标准标签库。 4. **JSP动作元素** - JSTL简化了JSP代码,提供了处理迭代、...

    JSP源码——JSP Explorer 文件浏览器 v1.0_fileexplorer.zip

    【JSP源码——JSP Explorer 文件浏览器 v1.0】是一个基于Java Server Pages (JSP) 技术实现的简单文件浏览应用。这个压缩包包含了一整套用于创建一个在线文件管理系统的基本组件,允许用户在Web环境中查看、管理...

    jsp网络编程——多媒体文件(6)

    总结,JSP网络编程中的多媒体文件处理涉及多个方面,包括文件的存储、上传、下载、处理、流媒体以及安全和性能优化。掌握这些知识点,对于初学者来说,将有助于构建功能丰富的多媒体Web应用。通过实践和不断学习,你...

    jsp程序设计——图灵奖

    2. **JSP指令和动作**:学习如何使用page、include、forward等指令,以及useBean、setProperty等JSP动作元素。 3. **内置对象**:了解JSP的九大内置对象,如request、response、session和application,及其在处理...

    jsp网络编程——源文件(12——13)

    3. JSP页面指令的使用:如、和,它们分别用于设置页面属性、包含其他文件和引入标签库。 4. Servlet与JSP的关系:理解两者之间的转换过程,以及如何在Servlet中编写业务逻辑,JSP中处理展示逻辑。 5. MVC(Model-...

    Jsp程序设计——交友网站

    JSP的核心概念包括:脚本元素、指令元素、动作元素以及自定义标签。在这个交友网站中,JSP用于处理用户请求,生成动态响应,如用户登录、注册、查看个人信息等。 ### 2. MVC设计模式 为了实现清晰的代码结构和良好...

    jsp开发案例——租房系统jsp列子

    【jsp开发案例——租房系统jsp列子】 在IT行业中,JavaServer Pages(JSP)是一种广泛使用的服务器端脚本语言,用于动态网页开发。本案例是基于JSP技术开发的一个租房系统,它涵盖了用户登录、房屋信息查询以及会员...

    jsp网络编程——源文件(10——11)

    【标题】"jsp网络编程——源文件(10——11)"主要涵盖了JSP(Java Server Pages)技术在网络编程中的应用,这是Java Web开发的重要组成部分。这两个章节可能包括了第10章和第11章的学习内容,涉及到JSP的基础语法、...

    用JSP写的——企业人力资源系统

    1. **Web Pages (JSP文件)**:展示用户界面,负责与用户交互,通常包括登录、注册、个人信息查看、职位发布等功能的页面。 2. **JavaBeans / Servlets**:作为业务逻辑层,处理JSP提交的请求,执行计算、数据验证和...

    JSP网络编程——多媒体(1——3)

    "JSP网络编程——多媒体(1——3)"这一主题,显然关注的是如何利用JSP技术处理和展示多媒体内容,如图像、音频、视频等。下面我们将深入探讨这个主题,了解相关知识点。 1. **JSP基本概念**: JSP是由Sun ...

    JSP核心技术——JSP引擎内幕(2010).pdf

    ### JSP核心技术——JSP引擎内幕 #### 一、JSP引擎的工作原理 JSP(Java Server Pages)是一种基于Java的服务器端脚本技术,它允许开发者将动态内容嵌入到HTML网页中。JSP的核心功能是通过JSP引擎来实现的。JSP...

    JSP毕业设计——JSP网上选课系统.zip

    它涉及到的技术栈主要包括JSP、Servlet、JavaBean以及可能的数据库技术如MySQL。 一、JSP基础 JSP是Java平台的一部分,它允许开发人员将HTML或XML文档与Java代码混合编写,以生成动态内容。JSP页面由两部分组成:...

    jsp毕业设计——jsp报名系统.zip

    【描述】"jsp毕业设计——jsp报名系统.zip"是一个包含该项目所有资源的压缩文件,用户解压后可以查看或运行整个报名系统。这个描述暗示了文件可能包括系统的设计文档、源代码、演示材料以及可能的测试数据。 【标签...

    JSP毕业设计——jsp毕业选题系统.zip

    8. **文件上传与下载**:考虑到项目中包含"jsp毕业选题系统.pdf",可能存在文件上传和下载功能,这需要处理文件流,确保文件安全传输。 9. **异常处理**:在开发过程中,良好的异常处理机制能提高程序的健壮性,...

    jsp毕业设计——jsp商品进销存系统.zip

    2. **JSP指令和动作**:包括page指令、include指令、forward动作等,用于配置页面属性、动态包含文件以及控制流程。 3. **EL(Expression Language)**:用于在JSP页面中简便地访问JavaBean或其他数据源的数据。 4...

    jsp小游戏——猜数字相加大小

    【jsp小游戏——猜数字相加大小】是一款基于JavaServer Pages(JSP)技术开发的简单游戏,旨在帮助用户更好地理解和掌握JSP的基本用法。在这个游戏中,系统会随机生成两个数字,玩家需要猜测这两个数字相加的结果是...

Global site tag (gtag.js) - Google Analytics