欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JSP页面跳转方法荟萃

程序员文章站 2022-07-02 19:12:59
1. response.sendredirct("跳转到页面"); 该方法通过修改http协议的header部分,对下达重定向指令的,使浏览器显示重定向网页的内容. req...

1. response.sendredirct("跳转到页面");

该方法通过修改http协议的header部分,对下达重定向指令的,使浏览器显示重定向网页的内容.

request无法传值过去.

执行完该页所有代码,然后再跳转到页面.

跳转地址栏改变.

可以跳转到其他服务器上的页面response.sendredirct().


2.response.setheader();

该方法和response.sendredirect一样,通过修改http协议的header部分.


<%

response.setstatus(httpservletresponse.sc_moved_permanently);

string newlocn="/index.html";

response.setheader("location",newlocn);

% >


3.<: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"%>

< 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.jer.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"%>

< 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 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);
可以重定向到中去。

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 >

作者“影枫.爪哇”