0%

sendredirect与getrequestdispatcher的区别

(1)request.getRequestDispatcher()是请求转发,前后页面共享一个request ; 这个是在服务端运行的,对浏览器来说是透明的。
(2)response.sendRedirect()是重新定向,前后页面不是一个request。而这个是在浏览器端运行的。
redirect()方式:

response.sendRedirect(“/a.jsp”);
   页面的路径是相对路径。sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中,如:
   response.sendRedirect(“URL”);
   跳转后浏览器地址栏变化。
   这种方式要传值出去的话,只能在url中带parameter或者放在session中,无法使用request.setAttribute来 传递。所以该方式只适用于无传值跳转
  
  2) forward方式
   request.getRequestDispatcher(“/路径(可以是jsp路径也可以是servlet)”) .forward(request, response);

如:
“request.getRequestDispatcher(”/2.jsp)”) .forward(request, response);”

“request.getRequestDispatcher(”/servlet/HomeServlet)”) .forward(request, response);”
  Servlet页面跳转的路径是相对路径。forward方式只能跳转到本web应用中的页面上。
  跳转后浏览器地址栏不会变化。
  使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute

实例:

用户登录模块

login.jsp

loginServlet.java

loginOK.jsp

用户访问login.jsp,输入用户名和密码进行登录,请求到达loginServlet,loginServet中,在session中加入user属性,值为输入的用户名。接着loginServlet把请求转发给loginOK.jsp,loginOK.jsp显示用户名。

代码简单描述

login.jsp中:
username=aaa,password=123;

loginServlet.java中:
String username=request.getParameter("username");
session.setAttribute("username",username);

loginOK.jsp中:

显示request中的用户名 ${username},

显示session中的用户名 ${username},

第一种情况:

由loginServlet调用forward方法进行转发,首先观察浏览器的地址栏,发现了地址是形如http://.../login.do?username=..&..的样子的。页面中的request里的用户名和session的用户名都显示了出来。

第二种情况:

由loginServlet调用sendRedirect方法进行转发,还是观察地址栏,发现地址已经变成http://.../loginOK.jsp了,

页面中request里面的用户名没有显示出来,但是session里的用户名却显示了出来。

这是为什么呢?

原来,forward 是服务器端的跳转,也就是客户端根本不知道这个动作,从一个java程序转到了另一个java程序,所以此时request会被作为参数传递过去。
但是,sendRedirect 这个是客户端的跳转,服务器端会发送一个跳转的代码和url给浏览器,浏览器会重新请求指定的URL,所以此时,request已经无效了。当然,此时session还是生效的。

有帮助的话可以来打赏一些或者经常来看看我哦,我在这里等你!