zoukankan      html  css  js  c++  java
  • JSP的动态Include的静态Include

    1. 静态导入示例

       先总结:

            1:静态include是把被引入的文件拼接到本页面中,再做为一个整体来编译,返回结果给客户端。

                 动态include是分别编译本页面和被引入的页面,再把结果合成一个html,返回结果给客户端。

            2:动态include可以传参数,可以include静态页面,也可以Include动态页面

       静态导入指令 :

    <%@include file="error.jsp"%>

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>静态导入</title>
    </head>
    <body>
        <%@include file="error.jsp"%>
    </body>
    </html>
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>这是一个静态页面</title>
    </head>
    <body>
          静态页面内容
    </body>
    </html>

    查看jsp编译之后的文件可以看到,index.jsp和error.jsp分别被编译成java文件和对应的class文件

    error_jsp.class

    error_jsp.java

    index_jsp.class

    index_jsp.java

    index_jsp.java源码

    package org.apache.jsp;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.jsp.*;
    
    public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
        implements org.apache.jasper.runtime.JspSourceDependent {
    
      private static final javax.servlet.jsp.JspFactory _jspxFactory =
              javax.servlet.jsp.JspFactory.getDefaultFactory();
    
      private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
    
      static {
        _jspx_dependants = new java.util.HashMap<java.lang.String,java.lang.Long>(1);
        _jspx_dependants.put("/error.jsp", Long.valueOf(1429692772031L));
      }
    
      private javax.el.ExpressionFactory _el_expressionfactory;
      private org.apache.tomcat.InstanceManager _jsp_instancemanager;
    
      public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
        return _jspx_dependants;
      }
    
      public void _jspInit() {
        _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
      }
    
      public void _jspDestroy() {
      }
    
      public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
            throws java.io.IOException, javax.servlet.ServletException {
    
        final javax.servlet.jsp.PageContext pageContext;
        javax.servlet.http.HttpSession session = null;
        final javax.servlet.ServletContext application;
        final javax.servlet.ServletConfig config;
        javax.servlet.jsp.JspWriter out = null;
        final java.lang.Object page = this;
        javax.servlet.jsp.JspWriter _jspx_out = null;
        javax.servlet.jsp.PageContext _jspx_page_context = null;
    
    
        try {
          response.setContentType("text/html; charset=UTF-8");
          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("
    ");
          out.write("<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    ");
          out.write("<html>
    ");
          out.write("<head>
    ");
          out.write("<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    ");
          out.write("<title>静态导入</title>
    ");
          out.write("</head>
    ");
          out.write("<body>
    ");
          out.write("    ");
          out.write("
    ");
          out.write("<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    ");
          out.write("<html>
    ");
          out.write("<head>
    ");
          out.write("<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    ");
          out.write("<title>这是一个静态页面</title>
    ");
          out.write("</head>
    ");
          out.write("<body>
    ");
          out.write("      静态页面内容
    ");
          out.write("</body>
    ");
          out.write("</html>");
          out.write("
    ");
          out.write("</body>
    ");
          out.write("</html>");
        } catch (java.lang.Throwable t) {
          if (!(t instanceof javax.servlet.jsp.SkipPageException)){
            out = _jspx_out;
            if (out != null && out.getBufferSize() != 0)
              try { out.clearBuffer(); } catch (java.io.IOException e) {}
            if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
            else throw new ServletException(t);
          }
        } finally {
          _jspxFactory.releasePageContext(_jspx_page_context);
        }
      }
    }

    从源代码里面可以看到,error.jsp的内容被整个融入到了index.jsp中

    结论:静态include是将被导入页面的代码完全融入本页面中,两个页面融合成一个整体Servlet,返回给客户端

    有一个问题,当被引入的页面中和本页面中有相同的变量定义时,会报错

    2. 动态导入示例

     动态导入指令

    <jsp:include page="error.jsp" flush="true"></jsp:include>

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>动态导入</title>
    </head>
    <body>
        <jsp:include page="error.jsp" flush="true"></jsp:include>
    </body>
    </html>

    此时index_jsp.java的源码

    out.write("
    ");
          out.write("<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    ");
          out.write("<html>
    ");
          out.write("<head>
    ");
          out.write("<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    ");
          out.write("<title>动态导入</title>
    ");
          out.write("</head>
    ");
          out.write("<body>
    ");
          out.write("    ");
          org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "error.jsp", out, true);
          out.write("
    ");
          out.write("</body>
    ");
          out.write("</html>");

    可以看到动态include只是用了include方法引入了被导入的文件

    结论: 动态include先编译被引入的文件,在包含到本页面中

    被引入的文件和本页面中有相同的变量定义时也不会报错

    3. 动态include传参数

      静态include是不能传参数的

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>动态导入</title>
    </head>
    <body>
        <jsp:include page="error.jsp" flush="true">
             <jsp:param value="hello" name="param1"/>
             <jsp:param value="world" name="param2"/>
        </jsp:include>
    </body>
    </html>
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>这是一个静态页面</title>
    </head>
    <body>
         <%
           String param1 = request.getParameter("param1");
           String param2 = request.getParameter("param2");
           String param3 = "XXXXXOOOOOOO";
         %>
         <%=param1 %>&nbsp;&nbsp;<%=param2 %>&nbsp;&nbsp;<%=param3 %>
    </body>
    </html>

    结果: hello  world  XXXXXOOOOOOO

  • 相关阅读:
    【刷题-LeetCode】204. Count Primes
    【刷题-LeetCode】205. Isomorphic Strings
    【刷题-LeetCode】207. Course Schedule
    剑指offer题解——找出数组中重复的数字
    关于c++中vector操作
    动态规划算法
    分治算法
    从零学python——组合数据类型
    从零学python—PyInstaller库的介绍
    从零学python——代码复用与函数递归
  • 原文地址:https://www.cnblogs.com/liuchao102/p/4448118.html
Copyright © 2011-2022 走看看