`

request与response转向的区别

阅读更多

简要说明:

reponse.sendRedirect() 与 request...forward() 实现转向的异同

  1.前面慢,后者快

  2.前面无法读取request.setAttribute()所保存的数值,而后者可以读取

  3.前者地址栏显示真正转向后的地址,而后者显示的是转向前的地址

  4.前者,转向地址开始的"/",表示的是本机的根目录;而后者,"/"表示的是应用的根目录

定义:
不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

调用方式如下:
request.getRequestDispatcher("apage.jsp").forward(request, response);//转发到apage.jsp ,地址栏地址不变。
response.sendRedirect("apage.jsp");//重定向到apage.jsp ,地址栏地址相应变化。
在jsp页面中你也会看到通过下面的方式实现转发:



总结:
用重定向和转发不是一个习惯问题。而是什么情况下必须用什么的问题。
不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

1、dispatch还是原来的request,但是redirect则是重新建立一个request。
2、dispatch基本上都是转发到context内部的资源,而redirect可以重定向到外部的资源,如: req.sendRedriect("http://www.mocuai.com");
有关JSP/Servlet的重定向技术综述如下[补充]

1.RequestDispatcher.forward()
是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在b.jsp都可以获得,参数自动传递.
但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过request.setAttribute("name",name)来传至下一个页面.

重定向后浏览器地址栏URL不变.

例:在servlet中进行重定向


通常在servlet中使用,不在jsp中使用。

2.response.sendRedirect()
是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame.的jsp文件.
重定向后在浏览器地址栏上会出现重定向页面的URL
例:在servlet中重定向

由于response是jsp页面中的隐含对象,故在jsp页面中可以用response.sendRedirect()直接实现重定位。
注意:
(1).使用response.sendRedirect时,前面不能有HTML输出。
这并不是绝对的,不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的server都有cache机制,一般在8K(我是说JSP SERVER),这就意味着,除非你关闭了cache,或者你使用了out.flush()强制刷新,那么在使用sendRedirect之前,有少量的HTML输出也是允许的。
(2).response.sendRedirect之后,应该紧跟一句return;
我们已经知道response.sendRedirect是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出还有什么意义呢?而且有可能会因为后面的输出导致转向失败。
比较:
(1).Request Dispatcher.forward()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;
(2).response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。
前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法.

注:在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。

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

它的底层部分是由RequestDispatcher来实现的,因此它带有RequestDispatcher.forward()方法的印记。


如果在<jsp:forward>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意。
另外要注意:它不能改变浏览器地址,刷新的话会导致重复提交

4.修改HTTP header的Location属性来重定向
通过设置直接修改地址栏来实现页面的重定向。
jsp文件代码如下:




5.JSP中实现在某页面停留若干秒后,自动重定向到另一页面
在html文件中,下面的代码:
<meta http-equiv="refresh" content="300; url=target.jsp">
它的含义:在5分钟之后正在浏览的页面将会自动变为target.html这一页。代码中300为刷新的延迟时间,以秒为单位。targer.html为你想转向的目标页,若为本页则为自动刷新本页。
由上可知,可以通过setHeader来实现某页面停留若干秒后,自动重定向到另一页面。
关键代码:
String content=stayTime+";URL="+URL;
response.setHeader("REFRESH",content);

如何选择:

RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的区别是:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用 HttpServletResponse.sendRequest()方法。

原理:
1、 Forward
这种方式是在服务器端作的重定向。服务器往client 发送数据的过程是这样的:服务器在向客户端发送数据之前,是先将数据输出到缓冲区,然后将缓冲区中数据发送给client端。什么时候将缓冲区里的数据发送给client端呢?(1)当对来自client的request处理完,并把所有数据输出到缓冲区,(2)当缓冲区满,(3)在程序中调用缓冲区的输出方法out.flush()或response.flushbuffer(),web container才将缓冲区中的数据发送给client。
这种重定向方式是利用服务器端的缓冲区机制,在把缓冲区的数据发送到客户端之前,原来的数据不发送,将执行转向重定向页面,发送重定向页面的数据,重定向调用页的数据将被清除。特别提示:在<JSP:FORWORD>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么这种重定向方式将不起作用。



2、 sendRedirect
这种方式是在客户端作的重定向处理。该方法通过修改HTTP协议的HEADER部分(设置状态代码302,命令浏览器发重新发送请求),对浏览器下达重定向指令的,让浏览器对在location中指定的URL提出请求,使浏览器显示重定向网页的内容。该方法可以接受绝对的或相对的URLs。如果传递到该方法的参数是一个相对的URL,那么Web container在将它发送到客户端前会把它转换成一个绝对的URL。public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException

区别:

1、forward重定向是在容器内部实现的同一个Web应用程序的重定向,所以forward方法只能重定向到同一个Web应用程序中的一个资源,重定向后浏览器地址栏URL不变,而sendRedirect方法可以重定向到任何URL, 因为这种方法是修改http头来实现的,URL没什么限制,重定向后浏览器地址栏URL改变。
2、forward重定向将原始的HTTP请求对象(request)从一个servlet实例传递到另一个实例,而采用sendRedirect方式两者不是同一个application。
3、基于第二点,参数的传递方式不一样。forward的form参数跟着传递,所以在第二个实例中可以取得HTTP请求的参数。sendRedirect只能通过链接传递参数,response.sendRedirect(“login.jsp?param1=a”)。
4、sendRedirect能够处理相对URL,自动把它们转换成绝对URL,如果地址是相对的,没有一个‘/’,那么Web container就认为它是相对于当前的请求URI的。比如,如果为response.sendRedirect(”login.jsp”),则会从当前servlet 的URL路径下找login.jsp: http://127.0.0.1:8080/test/servlet/Servlet 重定向的URL: http://127.0.0.1:8080/test/servlet/login.jsp,如果为response.sendRedirect(”/login.jsp”)则会从当前应用径下查找url:http://127.0.0.1:8080/login.jsp。而forward不能这样处理相对路径。
java
他们的区别是:
response.sendRedirect是向客户浏览器发送页面重定向指令,浏览器接收后将向web服务器重新发送页面请求,所以执行完后浏览器的url显示的是跳转后的页面。跳转页面可以是一个任意的url(本服务器的和其他服务器的均可)。
RequestDispatcher.forward 则是直接在服务器中进行处理,将处理完后的信息发送给浏览器进行显示,所以完成后在url中显示的是跳转前的页面。在forward的时候将上一页面中传送的request和response信息一同发送给下一页面(而response.sendRedirect不能将上一页面的request和 response信息发送到下一页面)。由于forward是直接在服务器中进行处理,所以forward的页面只能是本服务器的。


分享到:
评论

相关推荐

    小论asp中request与response的用法

    接下来,我们转向`Response`对象。`Response`对象负责向客户端发送数据或控制浏览器的行为。 1. **Response.Write(string)**:此方法用于在HTTP响应中直接写入内容。例如,如果你想在页面上显示一条消息,你可以...

    JSP页面转向和页面转发的区别

    下面将详细介绍页面转向与页面转发的概念及其区别。 #### 一、页面转向 页面转向(Redirect),通常指的是通过`response.sendRedirect("xx.jsp");`这样的方式进行页面跳转。这种方式实际上相当于客户端重新发起了...

    对django views中 request, response的常用操作详解

    本文将深入探讨在Django views中处理`request`和`response`对象的常见操作。 首先,`request`对象包含了客户端发送的所有信息,如HTTP头、POST数据、GET参数等。在Django中,`request`通常是`HttpRequest`类的一个...

    页面转向与重定向

    页面转向与重定向是 Web 开发中两个非常重要的概念,它们都是用于在不同的 Web 资源之间进行跳转的,但是它们之间有着很大的区别。下面我们将详细介绍转发和重定向的概念、调用方式、工作流程和区别。 一、调用方式...

    IP工具类,通过传入的request获取ip地址(JAVA)

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String ipAddress = request.getRemoteAddr(); System.out.println("客户端IP地址为...

    ASP入门—个人整理!

    接下来,我们转向Response对象,它是用于向客户端发送信息的工具: 1. Buffer属性:Response.Buffer=True/False可以开启或关闭缓冲,控制是否立即发送页面内容到浏览器。 2. ContentType属性:通过Response....

    weChatpay完整版java

    request.getRequestDispatcher("/jsp/login.jsp").forward(request,response); }else{ WeixinUtil util = new WeixinUtil(); UserAccessToken token = (UserAccessToken) request.getSession()....

    基于ASP的免费二级域名转向系统.zip

    在处理二级域名转向时,ASP会使用服务器变量(如REQUEST.ServerVariables)来获取HTTP请求的相关信息,比如主机名(HTTP_HOST),这有助于确定请求的二级域名。同时,通过设置HTTP响应头(Response.AddHeader),...

    axios 处理 302 状态码的解决方法

    from flask import Blueprint, request, jsonify, make_response, abort def bp_login_required(): if not current_user.is_authenticated: if request.is_xhr: abort(401) else: return current_app.login_...

    ASP实例开发源码-免费二级域名转向系统asp版.zip

    这个"ASP实例开发源码-免费二级域名转向系统asp版.zip"的压缩包提供了基于ASP技术实现的二级域名转向系统的完整源代码,对于学习ASP编程以及了解域名转向系统的工作原理非常有帮助。 在ASP中,开发者可以使用...

    JavaWeb中URL重写用Forward方式并使其后filter可以拦截内部转发

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String url = ...

    Asp.net 5种页面转向方法

    Server.Transfer()也是一种服务器端重定向方法,与Response.Redirect()不同的是,Server.Transfer()在转移控制权的同时,可以保持Request、Session等信息不变。因此,跳转后的页面可以访问之前页面提交的数据。在...

    JSP跳转方式总结.doc

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=gb2312"); ServletContext sc = ...

    jsp教程 魔乐

    JSP提供了九个内置对象,包括request、response、session、application等,它们各自拥有独特的功能和应用场景,是开发复杂Web应用的关键。比如,request对象用于获取客户端发送的数据;response对象用于向客户端返回...

    SQlServer面试题

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } public void doGet(HttpServletRequest request, HttpServletResponse response) ...

    Web编程(Java )-JSP内置对象的应用.doc

    本实验主要涉及了三个JSP内置对象:`session`、`request`和`response`,以及它们在实现一个简单的注册登录系统中的应用。 1. **Session对象** - Session是HTTP协议中的概念,用于在用户的不同请求之间保持数据。在...

    原生servlet实现增删查改

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 处理GET请求的代码 } protected void doPost(HttpServletRequest request, ...

    MyEclipse6.5制作第一个JSP程序(登录)

    request.getRequestDispatcher("success.jsp").forward(request, response); } else { request.setAttribute("errorMsg", "用户名或密码错误!"); request.getRequestDispatcher("error.jsp").forward(request, ...

    asp.net内置对象

    它包含了当前请求的 `Request` 和 `Response` 对象,以及其他相关信息。 **7. Trace 对象** - **类**: `TraceContext` - **功能**: `Trace` 对象用于输出自定义的跟踪和诊断信息,帮助开发者调试应用程序。 #### ...

    计算机面试jsp

    5. JSP与Servlet的区别与联系: - JSP是视图层技术,侧重于页面展示,而Servlet是控制层技术,主要处理业务逻辑。 - 共同点:都是Java Web开发的一部分,都可以处理HTTP请求。 - 应用范围:JSP更适合视图渲染,...

Global site tag (gtag.js) - Google Analytics