zoukankan      html  css  js  c++  java
  • JSP的getRequestDispatcher()与sendRedirect()的区别

    getRequestDispatcher()与sendRedirect()的区别

     

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

    request.getRequestDispather();返回的是一个RequestDispatcher对象。

    2.RequestDispatcher.forward()是在服务器端运行; 
    HttpServletResponse.sendRedirect()是通过向客户浏览器发送命令来完成. 
    所以RequestDispatcher.forward()对于浏览器来说是“透明的”; 
    而HttpServletResponse.sendRedirect()则不是。

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

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

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

    RequestDispatcher对象从客户端获取请求request,并把它们传递给服务器上的servlet,html或

    jsp。它有两个方法:


    1.void forward(ServletRequest request,ServletResponse response) 
    用来传递request的,可以一个Servlet接收request请求,另一个Servlet用这个request请求来产生response。request传递的请求,response是客户端返回的信息。forward要在response到达客户端之前调用,也就是 before response body output has been flushed。如果不是的话,它会报出异常。


    2.void include(ServletRequest request,ServletResponse response) 
    用来记录保留request和response,以后不能再修改response里表示状态的信息。

    如果需要把请求转移到另外一个Web App中的某个地址,可以按下面的做法: 
    1. 获得另外一个Web App的ServletConext对象(currentServletContext.getContext(uripath)). 

    2. 调用ServletContext.getRequestDispatcher(String url)方法。 

    eg:ServletContext.getRequestDispatcher("smserror.jsp").forward(request,response);

    http://lanew.blog.ccidnet.com/blog-htm-do-showone-type-blog-itemid-3690834-uid-327434.html

    二者区别: 
    response.sendRedirect(url)跳转到指定的URL地址,产生一个新的request,所以要传递参数只有在url后加参 
    数,如: 
    url?id=1. 
    request.getRequestDispatcher(url).forward(request,response)是直接将请求转发到指定URL,所以该请求
     
    能够直接获得上一个请求的数据,也就是说采用请求转发,request对象始终存在,不会重新创建。而 
    sendRedirect()会新建request对象,所以上一个request中的数据会丢失。 
    更具体来说就是这样的: 
    redirect 会首先发一个response给浏览器, 然后浏览器收到这个response后再发一个requeset给服务器, 然后 
    服务器发新的response给浏览器. 这时页面收到的request是一个新从浏览器发来的. 
    forward 发生在服务器内部, 在浏览器完全不知情的情况下发给了浏览器另外一个页面的response. 这时页面 
    收到的request不是从浏览器直接发来了,可能己经用request.setAttribute在request里放了数据.在转到的页 
    面可直接用request.getAttribute获得数据。 
    最基本的用法就如上了,其他的一些应注意的地方如下: 
    跳转方式 
    http://localhost:8080/Test应用 
    运用forward方法只能重定向到同一个Web应用程序中的一个资源。而sendRedirect方法可以让你重定向到任何 
    URL。 
    表单form的action="/uu";sendRedirect("/uu");表示相对于服务器根路径。如http://localhost:8080/Test 
    用(则提交至http://localhost:8080/uu); 
    Forward代码中的"/uu"则代表相对与WEB应用的路径。如http://localhost:8080/Test应用(则提交至 
    http://localhost:8080/Test/uu); 
    (运用RequestDispatcher接口的Forward)方法 
    forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件, 
    同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过 
    response.setAttribute("name",name)来传至下一个页面. 
    重定向后浏览器地址栏URL不变. 
    只有在客户端没有输出时才可以调用forward方法。如果当前页面的缓冲区(buffer)不是空的,那么你在调用 
    forward方法前必须先清空缓冲区。 
    "/"代表相对与web应用路径 
    RequestDispatcher rd = request.getRequestDispatcher("/ooo"); 
    rd.forward(request, response);提交至http://localhost:8080/Test/ooo 
    RequestDispatcher rd = getServletContext().getRequestDispatcher("/ooo"); 
    rd.forward(request, response);提交至http://localhost:8080/Test/ooo 
    RequestDispatcher rd =getServletContext().getNamedDispatcher("TestServlet");(TestServlet为一个 
    <servlet-name>) 
    rd.forward(request, response);提交至名为TestServlet的servlet 
    如果在<jsp:forward>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用, 
    这一点应该特别注意。 
    另外要注意:它不能改变浏览器地址,刷新的话会导致重复提交 
    http://localhost:8080/Test/gw/page.jsp中转发 
    <jsp:forward page="OtherPage.jsp"/>在JSP页面被解析后转换成pageContext.forward("OtherPage.jsp"); 
    "/OtherPage.jsp"提交到http://localhost:8080/Test/OtherPage.jsp 
    "OtherPage.jsp"提交到http://localhost:8080/Test/gw/OtherPage.jsp 
    (运用HttpServletResponse接口的sendRedirect)方法302 
    是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面, 
    同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame.的jsp文件. 
    假设转发代码包含于注册的servlet-url为/ggg/tt;jsp为/ggg/tt.jsp: 
    绝对路径:response.sendRedirect("http://www.brainysoftware.com 
    根路径:response.sendRedirect("/ooo")发送至http://localhost:8080/ooo 
    相对路径:response.sendRedirect("ooo")发送至http://localhost:8080/Test/ggg/ooo, 
    sendRedirect等同于此方式 
    response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); 
    String newLocn = "/newpath/jsa.jsp"; 
    response.setHeader("Location",newLocn); 
    (Meta Refresh)方法200 
    这种方法是由HTML提供的,Meta本身就是HTML标签。使用方法是:<meta http-equiv="refresh" content="5; 
    url=http://www.dreamdu.com/" /> 
    相应的java代码 
    String content=stayTime+";URL="+URL; 
    response.setHeader("REFRESH",content); 
    ------------------------------------------------------------------------------------------------ 
    -------------------------- 
    使用response.sendRedirect()地址栏将改变 
    使用request.getRequestDispatcher().forward(request,response)地址栏中的信息保持不变. 
    ------------------------------------------------------------------------------------------------ 
    -------------------------- 
    request.setAttribute存的东西 
    只用通过方法2跳转 才能在新页取出来 
  • 相关阅读:
    JZOJ 3034. 【NOIP2012模拟10.17】独立集
    JZOJ 3035. 【NOIP2012模拟10.17】铁轨
    JZOJ 1259. 牛棚安排
    数位DP JZOJ 3316. 非回文数字
    JZOJ 3046. 游戏
    JZOJ 3013. 填充棋盘
    debian 安装oracle提供的java8
    java 汉字转拼音 PinYin4j
    debian ssh设置root权限登陆 Permission denied, please try again
    java并发下订单生成策略
  • 原文地址:https://www.cnblogs.com/stm32stm32/p/6188365.html
Copyright © 2011-2022 走看看