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 >
作者“影楓.爪哇”