getRequestDispatcher()与sendRedirect()的区别

getRequestDispatcher()与sendRedirect()的区别

  1. request.getRequestDispatcher()是请求转发,前后页面共享一个request ;
    response.sendRedirect()是重新定向,前后页面不是一个request

  2. RequestDispatcher.forward()是在服务器端运行;
    HttpServletResponse.sendRedirect()是通过向客户浏览器发送命令来完成.

  3. ServletContext.getRequestDispatcher(String url)中的url只能使用绝对路径;

    ServletRequest.getRequestDispatcher(String url)中的url可以使用相对路径。因为

    ServletRequest具有相对路径的概念;而ServletContext对象无此概念

  4. response.sendRedirect(url)跳转到指定的URL地址,产生一个新的request,所以要传递参数只有在url后加参,如www.baidu.com?id=1
    request.getRequestDispatcher(url).forward(request,response)是直接将请求转发到指定URL,所以该请求能够直接获得上一个请求的数据,也就是说采用请求转发,request对象始终存在,不会重新创建。而sendRedirect()会新建request对象,所以上一个request中的数据会丢失。
    注意

    • sendRedirect(url):会首先发一个response给浏览器, 然后浏览器收到这个response后再发一个requeset给服务器, 然后服务器发新的response给浏览器. 这时页面收到的request是一个新从浏览器发来的.

    • forward 发生在服务器内部, 在浏览器完全不知情的情况下发给了浏览器另外一个页面的response. 这时页面收到的request不是从浏览器直接发来了,可能己经request.setAttribute在request里放了数据.在转到的页面可直接用request.getAttribute获得数据。

  5. 运用forward方法只能重定向到同一个Web应用程序中的一个资源。而sendRedirect方法可以让你重定向到任何

    如:sendRedirect("/t1") 表示相对于服务器根路径

    网址http://localhost:8080/Test 则提交到 http://localhost:8080/t1

    Forward代码中的"/uu"则代表相对与WEB应用的路径

    如http://localhost:8080/Test 则提交至http://localhost:8080/Test/t1

  6. forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,
    forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过
    response.setAttribute("name",name)来传至下一个页面.
    重定向后浏览器地址栏URL不变.

上一篇:02-语法、规范、错误、运算符、判断分支、注释


下一篇:Servlet跳转页面