JSP静态包含和动态包含问题 整理

JSP静态包含和动态包含问题 

check.jsp的代码

<%
String login = (String)session.getAttribute("login");
if(login==null||!login.equals("success")){
response.sendRedirect("Login.jsp");
return;
}
%>

用<%@ include file="check.jsp"%>跳转正常,
用<jsp:include page="check.jsp"/>不能跳转。为什么呢?
<%@ include file="check.jsp"%>是include directive,也就是将你的check.jsp中所有代码原封不动的放到Login.jsp中这条语句所在的位置,和你直接将上面这段代码写到Login.jsp中是一样的效果;
<jsp:include page="check.jsp"/>则是将check.jsp执行后的HTML代码放到Login.jsp中的相应位置,但是check.jsp中的response.redirect("")或者response.addCookie("")等等关于response的操作,都会被忽视,也就是说用户不会被送到另一个页面,即不会实现跳转。
答:静态包含是通过JSP的include指令包含页面,动态包含是通过JSP标准动作<jsp:forward>包含页面。静态包含
是编译时包含,如果包含的页面不存在则会产生编译错误,而且两个页面的"contentType"属性应保持一致,因为
两个页面会合二为一,只产生一个class文件,因此被包含页面发生的变动再包含它的页面更新前不会得到更新。动
态包含是运行时包含,可以向被包含的页面传递参数,包含页面和被包含页面是独立的,会编译出两个class文件,
如果被包含的页面不存在,不会产生编译错误,也不影响页面其他部分的执行。代码如下所示:
 
    
  JSP中有两种包含:静态包含:<%@include file="被包含页面"%>和动态包含:<jsp:include page="被包含页面"flush="true">。下面以一个例子来说明如何使用包含。

 

实例:

  项目文件树:

  header.jsp文件中内容:

 
    
1
2
3
4
5
6
7
<html>
     <head>
         <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
         <title>Insert title here</title>
    </head>
    <body>
    <h1>This is header</</h1>       
 
    

 content.jsp文件中内容:

 
    
1
2
3
4
5
6
7
8
9
10
<table border="1">
     <tr>
        <td>col1</td>
        <td>col2</td>
    </tr>
    <tr>
        <td>col1</td>
        <td>col2</td>
    </tr></table>
 
    

  footer.jsp文件中内容:

 
    
1
2
3
4
        <hr>
         copyright: 1999-2010
    </body></html>
 
    

静态包含:

index.jsp文件中内容:

 
    
1
2
3
4
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ include file="/header.jsp" %>
<%@ include file="/content.jsp" %>
<%@ include file="/footer.jsp" %>
 
    

  页面显示结果:


  被编译成的java文件:


扫描二维码关注公众号,回复: 1682426 查看本文章

 

动态包含

  index.jsp文件中内容:

1
2
3
4
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
jsp:include page="/header.jsp"></jsp:include>
jsp:include page="/content.jsp"></jsp:include>
jsp:include page="/footer.jsp"></jsp:include>

页面显示结果:


被编译成的java文件:


说明

       这个例子,使用静态包含和动态包含最终的执行结果相同,但是实现过程不同,很明显编译成的java文件数目不同。

静态和动态包含的区别与联系

  注:下文将包含有其它文件的jsp文件称为主体文件,比如上文中的index.jsp文件。将被包含的文件称为包含文件,比如上文中的header.jsp文件。

  1. <%@ include file=” ”%>是指令元素。<jsp:include page=” ”/>是行为元素
  2. 最终编译成java文件的数目不同。(从上面的例子可以看出)
    1. 静态包含在转换成为java文件的时候将包含文件的内容“复制”到主体文件,然后作为一个整体编译。最终编译为一个java文件。

    2. 动态包含是各个jsp文件分别转换,分别编译。最终编程成多个java文件。

  1. 执行时间不同

静态包含发生在:JSP---->java文件阶段。

动态包含发生在:执行class文件阶段。动态加入。

  1. 静态包含在两个文件中不能有相同的变量,动态包含允许。

由于静态包含相当于将包含文件内容直接复制到主体文件中,如果出现相同的变量,就会出现覆盖等问题,导致文件出错。而动态包含相当于调用不同的jsp,变量所在的空间不同,自然不会出现覆盖等现象。

  1. 无论是动态包含还是静态包含,其request对象都是相同的。也就是同一个request对象。

静态包含最终编译成一个java文件,有一个request对象很好理解。而动态包含最终编译成多个jsp文件,为何会使用一个request对象呢?其实这些jsp组合的过程是一个请求转发的过程,自然也使用同一个request对象了。

静态包含和动态包含的使用

简单总结一下,就一句话:被包含的页面是静态页面就用静态包含,是动态页面就用动态包含。(当然,不是很绝对,但是这样用没有错。)

猜你喜欢

转载自blog.csdn.net/qq_37954693/article/details/80749825