Servlet设置跳转
response.sendRedirect("url");(客户端作的重定向)
sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中,如:response.sendRedirect("http://www.baidu.net");
跳转后浏览器地址栏变化。这种方式要传值出去的话,只能在url中带parameter或者放在session中,无法使用request.setAttribute来传递。
该方法通过修改HTTP协议的Header部分,对浏览器下达重定向指令,让浏览器对在location中指定的URL提出请求,使浏览器重定向网页的内容。该方法可以接受绝对的或者相对的URL。如果传递到该方法的参数是一个相对的URL,那么web container在将它发送到客户端前会把它转换成一个绝对的URL。
在使用response.sendRedirect时,前面不能有HTML被送到浏览器。事实上现在的server都有cache机制,一般在8k(jsp server),这意味着除非关闭cache,或者使用了out.flush()强制刷新,那么在使用sendRedirect之前,可以允许有少量HTML输出。。在response.sendRedirect()之后应该紧跟一句return;因为转向后的输出可能导致转向失败。
request.getRequestDispatcher("this application url").forward(request, response); (服务器端作的重定向)
RequestDispatcher dispatcher = request.getRequestDispatcher("/a.jsp"); dispatcher .forward(request, response);
页面的路径是相对路径。forward方式只能跳转到本web应用中的页面上。跳转后浏览器地址栏不会变化。使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute。
服务器往client发送数据的过程为:服务器在向客户端发送数据之前,是先将数据输出到缓冲区,然后将缓冲区中数据发送给client端。缓冲区中数据发送给client端的时机:
当对来自client的request处理完,并把所有数据输出到缓冲区。
当缓冲区已满。
在程序中调用缓冲区的输出方法out.flush()或response.flushbuffer(),web container才将缓冲区中的数据发送给client。
这种重定向方式是利用服务器端的缓冲区机制,在把缓冲区的数据发送到客户端之前,原来的数据不发送,将执行转向重定向页面,发送重定向页面的数据,重定向调用页的数据将被清除。(如果在forward之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么这种重定向方式将不起作用)
JSP设置跳转
response.sendRedirect("url");
和servlet的response.sendRedirect()方式一样。此语句前不允许有out.flush(),如果有,会有异常:java.lang.IllegalStateException: Can't sendRedirect() after data has committed to the client.
跳转后浏览器地址栏变化。如果要跳到不同主机下,跳转后,此语句后面的语句会继续执行,如同新开了线程,但是对response的操作已经无意义了;如果要跳到相同主机下,此语句后面的语句执行完成后才会跳转;
response.setHeader("Refresh","等待的秒数;url=绝对路径或者相对路径");
此语句前不允许有out.flush(),如果有,页面不会跳转。
跳转后浏览器地址栏变化。此语句后面的语句执行完成后才会跳转。
Js跳转页面
直接跳转
指定自身跳转的页面top.location='xx.aspx';