程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> JSP頁面跳轉方法荟萃

JSP頁面跳轉方法荟萃

編輯:關於JSP

1. response.sendRedirct("跳轉到頁面");

該方法通過修改HTTP協議的HEADER部分,對浏覽器下達重定向指令的,使浏覽器顯示重定向網頁的內容.

request無法傳值過去.

執行完該頁所有代碼,然後再跳轉到頁面.

跳轉地址欄改變.

可以跳轉到其他服務器上的頁面response.sendRedirct(http://www.sun.com).


2.response.setHeader();

該方法和response.sendRedirect一樣,通過修改HTTP協議的HEADER部分.


<%

response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);

String newLocn="/index.html";

response.setHeader("Location",newLocn);

% >


3.<jsp:forward page="跳轉頁面"/>

該方法是利用服務器端先將數據輸出到緩沖區的機制,在把緩沖區的內容發送到客戶端之前,原來的不發送,改為發送該頁面的內容,如果 在<jsp:forward>之前有很多輸出,前面的輸出已使緩沖區滿,將自動輸出到客戶端,那麼該語句將不起作用,這一點應該特別注意.

request可以傳值過去.

直接跳轉到頁面,後面的代碼不執行.

跳轉後地址欄不變.

無法跳轉到其他服務器上的頁面.

圖片不是絕對路徑無法顯示.


例子1:

from.jsp

<%@ page contentType="text/html;charset=gb2312"%>

<%@ page buffer="1kb"%>

<%

long i=0;

int j = 0;

for(i=0;i<60;i++)

{

       out.println(j++);

}

%>

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


結果: 跳到to.jsp上.


例子2

from.jsp

<%@ page contentType="text/html;charset=gb2312"%>

<%@page buffer="1kb"%>


<%

long i=0;

int j = 0;

for(i=0;i<600;i++)

{

       out.println(j++);

}

%>

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

 

報錯:


java.lang.IllegalStateException: Error: Attempt to clear a buffer that's already been flushed

org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:648)

org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:637)

org.apache.jsp.forward.from02_jsp._jspService(from02_jsp.java:58)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

org.pcvit.pan.filter.EncodingFilter.doFilter(EncodingFilter.java:19)

 

例子3:

from.jsp

<%@ page contentType="text/html;charset=gb2312"%>

<%@page buffer="1kb"%>


<%

long i=0;

int j = 0;

for(i=0;i<6000;i++)

{

       out.println(j++);

}

%>

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

 

結果: 沒有跳到to.jsp上. 但是卻顯示出了from.jsp頁面的代碼執行結果.


------------------------------------------------------------------------------


                ?


------------------------------------------------------------------------------

 

4.request.getRequestDispatcher("跳轉頁面");

request可以傳值過去.

執行完該頁所有代碼,然後再跳轉到頁面.

跳轉地址欄不變.

不可以跳轉到其他服務器上的頁面


<%

RequestDispatcher rd = request.getRequestDispatcher("to.jsp");

rd.forward(request,response);

%>


------------------------------------------------------------------------------


PS:


服務端的輸出緩沖區

缺省情況下:服務端要輸出到客戶端的內容,不直接寫到客戶端,而是先寫到一個輸出緩沖區中.只有在下面三中情況下,才會把該緩沖區的內容輸出到客戶端上:

該JSP網頁已完成信息的輸出

輸出緩沖區已滿

JSP中調用了out.flush()或response.flushbuffer()

輸出緩沖區的大小可以用:或response.setBufferSize()設置,如下:

設置輸出緩沖區的大小為1KB。或response.setBufferSize(1);

設置輸出緩沖區的大小為0,即不緩沖。或response.setBufferSize(0);

用response.getBufferSize()或out.getBufferSize()可取的輸出緩沖區的大小,單位為字 節. 用response.isCommitted()可檢查看服務端是否已將數據輸出到客戶端. 如果返回值是true則已將數據輸出到客戶端,是 false則還沒有.  


*******************************************************************************************

有以下3種方法可以做到輸出重定向:

RESPONSE.SETREDERECT("URL") 該方法通過修改HTTP協議的HEADER部分,對浏覽器下達重定向指令的,使浏覽器顯示重定向網頁的內容. response.sendRedirect("http://localhost:7001/index.html");
下面的方法也能改變HTTP HEADER屬性,它的原理和 1 是一樣的.
<%
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
String newLocn="/index.html";
response.setHeader("Location",newLocn);
% >
采用<JSP:FORWORD> 該方法是利用服務器端先將數據輸出到緩沖區的機制,在把緩沖區的內容發送到客戶端之前,原來的不發送,改為發送該頁面的內容,如果在<JSP: FORWORD>之前有很多輸出,前面的輸出已使緩沖區滿,將自動輸出到客戶端,那麼該語句將不起作用,這一點應該特別注意.
說明:
1. 方法(1),(2)可以使用變量表示重定向的地址;方法(3)不能使用變量表示重定向的地址。
String add="./index.html";
<jsp:forward page= add />
無法重定向到index.html中去

String add=http://localhost:7001/index.html
response.sendRedirect(add);
可以重定向到http://localhost:7001/index.html中去。

2. 采用方法(1),(2)request中的變量(通過request.setAttribute()保存到request中的值)不能在新的頁面中采用,采用方法(3)能. 綜上,我們應該采用(1),(2)重定向比較好.

***************************************************************************************

使用Response Buffering

通過打開“response buffering”可以緩沖一個值得輸出的整個頁面內容,這將最小化輸出到浏覽器的數據量,從而提高了整體性能。每一次輸出都耗費許多,所以寫得越少, 效果越好。TCP/IP在發送少量大的數據包時,要比發送大量小的數據包工作效率高,因為它是慢速啟動並不斷發送的。

有2種方法 打開Response Buffering。首先,可以使用Internet Services Manager為整個應用程序打開response buffering,這是推薦的方式,而且在IIS4.0和IIS5.0中,默認狀態下,response buffering是打開的。其次,在每一頁面上,可以在頭部放置如下代碼開打開response buffering:

< % Response.Buffer = True % >

這段代碼必須在任何數據輸出到浏覽器前被執行(就是說,在任何html內容顯示前和在任何cookie被設置前)。通常情況下,為整個應用程序打開response buffering是很好的方案,這麼做後就不用在每個頁面頭部設置如上的代碼。

關於打開response buffering的一個通用問題是:用戶必須要等待整個頁面全部產生後,才能看到內容。對於一個長時間運行的頁面來說,可以設置 Response.Buffer=False關閉緩沖。然後,好的策略是利用Response.Flush方法,它將輸出所有已被ASP描述的HTML內 容到浏覽器。比如,在描述了一個1,000行表格的100行後,ASP就可以使用Response.Flush來強迫輸出這100行的內容到浏覽器,這時 用戶就可以看到前100行數據,同時其余的行數據正在准備生成。

注意,關於上面的1,000行表格輸出的例子,對於一些浏覽器器 來說,除非遇到< /table >標記,它們不會輸出表格的任何內容。如果這樣,可以將表格分割成許多含有少量行的多個表格,然後在每一個表格產生後,調用 Response.Flush輸出。新版的Internet Explorer在整個表格下載後才顯示內容,並且,如果定義了表格的列寬度,生成表格的速度將特別快。

關於打開response buffering的另外一個問題是:當生成非常大的頁面時,將消耗非常大的服務器內存。


*****************************************************

1,在 <head >和 </head >之間加入這句就可以了: <meta HTTP-EQUIV=REFRESH CONTENT= "10;URL=http://www.ccb.cn " >
CONTENT後面的10表示秒數,URL後面可以是相對路徑文件名,也可以是http的絕對路徑。
這種方法屬於客戶端的跳轉。


2,JS自動跳轉
<table >
<tr >
<td id= "go_title " >3秒後自動跳轉到論壇首頁 </td >
</tr >
</table >
var time=0;
function gotoBbsIndex(){
time++;
if(time==3){
document.location.href= "bbs/main/index.html ";
}
document.getElementById( "go_title ").innerHTML=(3-time)+ "秒後自動跳轉到論壇首頁 ";
}
window.setInterval( "gotoBbsIndex() ",1000);
</script >

作者“影楓.爪哇”
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved