JSP中动态INCLUDE与静态INCLUDE,forward与sendredirect的区别

本文详细介绍了JSP中动态include和静态include的使用方式,包括它们的区别和应用场景。此外,还对比了forward和sendRedirect在服务器转发和客户端重定向上的工作流程和本质区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

            1.Jsp 动态include和静态include
            2.forward和sendRedirect
                 2.1 总结一
                2.2 总结二

 

Jsp 动态include和静态include

 

  •     动态INCLUDE用jsp:include动作指令 <jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化,在转换为servlet 时不会被编译的,只有执行到该代码时才会被动态的编译载入,同时生成多个class和java,和包含页使用不同的request对象,但可以取得包含页的request对象参数,适合用于 包含动态页面,并且可以带参数.
  •     静态INCLUDE用include 编译指令,定不会检查所含文件的变化,适用于包含静态页面<%@ include file="included.htm" %>,jsp引擎会在jsp程序转换时期先把file 属性指定的文件包含进来,然后开始执行转换及编译的工作。(原封不动的把文件代码copy到该位置,然后进行转换和编译,只生成一个java和class),因此包含页面和被包含页面使用同一个request对象。不能传递参数.用的比动态多

 
    <%@ include file=" "%>

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

 

    前者是指令元素、后者是行为元素.
    通常当应用程序中所有的页面的某些部分(例如标题、页脚和导航栏)都相同的时候,我们就可以考虑用include.具体在哪些时候用<%@ include file=" "%>,哪些时候用<jsp:include page=" " flush="true"/>.这种形式.首先要明白的是它们之间的区别.
    <%@ include file=" "%>,jsp的include指令元素读入指定页面的内容.并把这些内容和原来的页面融合到一起.(这个过程是在翻译阶段:也就是jsp被转化成servlet的阶段进行的.

    由此我们就会知道:jsp页面是把include指令元素所指定的页面的实际内容(也就是代码段)加入到引入它的jsp页面中,合成一个文件后被jsp容器将它转化成servlet.可以看到这时会产生一个临时class文件和一个java文件.

    由于在主页面被请求时,这些页面还没有被引入到主页面中,所以你可以对page属性使用一个请求时属性值,以便根据运行时的情况来决定要引入哪一个页面.还可以添加一些将被引入的页面读取的请求参数.

  1. <jsp:include page="<%=pageSelectedAtRuntime%>" flush="true" >  
  2. <jsp:param name="fitstParamer" value="firstValue">  
  3. <jsp:param name="lastParamer" value="lastValue">  
  4. </jsp:include>  

    如果修改了被引入的jsp页面,那么可以立刻使用该页面的最新版本,这是因为对待被引入的页面的方式与对待由浏览器直接调用的jsp页面的方式完全相同.即容器检测页面的变化,并自动进入翻译阶段,以得到页面的最新版本.
    (注意,include行为元素同jsp其它元素一样,没有行为体时要以"/"结束.就像下面这样.
    <jsp:include page="<%=pageSelectedAtRuntime%>" flush="true" />)
    以下是对include 两种用法的区别
    主要有两个方面的不同;
    一:执行时间上:
    <%@ include file="relativeURI"%> 是在翻译阶段执行
    <jsp:include page="relativeURI" flush="true" /> 在请求处理阶段执行.
    二:引入内容的不同:
    <%@ include file="relativeURI"%> 引入静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一起.

    <jsp:include page="relativeURI" flush="true" />引入执行页面或servlet所生成的应答文本.

 

 

forward和sendRedirect

 

 总结一:

response.sendRedirect() 执行过语句后后面的内容仍然执行,可以转到服务器以外的地址,可以通过url传递参数?a=value ,客户端又向服务器发送了一次请求

<jsp:forward> 执行过后后面的不再执行,中间可以转发多次,但请求就一次,可以传递参数,可以取得转发页面的参数

 

  1.  <jsp:forward page="">  
  2.     <jsp:param value="test1" name="name1"/>  
  3. </jsp:forward>  


 

 总结二:

 

一、调用方式

 

我们知道,在servlet中调用转发、重定向的语句如下:

 

request.getRequestDispatcher("new.jsp").forward(request, response);   //转发到new.jsp

 

response.sendRedirect("new.jsp");   //重定向到new.jsp

 

在jsp页面中你也会看到通过下面的方式实现转发:

 

<jsp:forward page="apage.jsp" />

 

当然也可以在jsp页面中实现重定向:

 

<%response.sendRedirect("new.jsp"); %> //重定向到new.jsp

 

二、本质区别

 

解释一

 

一句话,转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:

 

转发过程:客户浏览器发送http请求——》web服务器接受此请求——》调用内部的一个方法在容器内部完成请求处理和转发动作——》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。

 

重定向过程:客户浏览器发送http请求——》web服务器接受后发送302状态码响应及对应新的location给客户浏览器——》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址——》服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。

 

解释二

 

重定向,其实是两次request

 

第一次,客户端request   A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。

 

例子:

 

response.sendRedirect("loginsuccess.jsp");

 

请求转发是服务器内部把对一个request/response的处理权,移交给另外一个

 

对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。传输的信息不会丢失。

 

例子:

 

       RequestDispatcher dis=request.getRequestDispatcher(“loginsuccess.jsp”);

 

       Dis.forward(request,response);

 

解释三

 

假设你去办理某个执照

 

重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。

 

转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。

 

 

 

 

 转自:http://blog.youkuaiyun.com/ljfbest/article/details/7521797

            http://blog.163.com/tsing_hua/blog/static/139622224201101110836644/

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值