getRequestDispatcher与sendRedirect区别

一、getRequestDispatcher与sendRedirect简单比较

getRequestDispatcher服务器内部资源跳转,不能跨资源,地址栏url不变(当前web)
sendRedirect页面重定向,地址栏url会变动,可以跨资源跳转(任意有效地址)

二、getRequestDispatcher的两种调用方式

1.request.getRequestDispatcher(url)
url相对路径和绝对路径方式均可以访问

path以/开头,那么path相对于当前context的根目录
比如:当前context path是/test,那么/login.html相当于/test/login.html
path不以/开头,那么属于相对目录,path相对于当前的url目录
比如:当前url为/test/action/a/b,那么login.html相当于/test/action/a/login.html

2.getServletContext().getRequestDispatcher(url)
url只能按绝对路径方式访问

path必须以/开头,并且path是相对于当前context的根目录
比如:当前context path是/test,那么/login.html相当于/test/login.html 

// 举个例子
SecondServlet
request.setAttribute("name", "andy");
request.getSession().setAttribute("address", "byx");
request.getRequestDispatcher("/third?name=jack").forward(request, response);
或 request.getRequestDispatcher("third?name=jack").forward(request, response);
或 getServletContext().getRequestDispatcher("/third?name=jack").forward(request, response);

ThirdServlet
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
out.println(request.getContextPath()+"<hr/>");
out.println("name="+name+"<hr/>");
out.println("name="+request.getAttribute("name")+"<hr/>");
out.println("address="+request.getSession().getAttribute("address")+"<hr/>");

结果显示:地址栏url没有变动http://localhost:8080/Test/second,三种方式都可以传值到ThirdServlet

三、sendRedirect通过response调用

重定向是临时返回当前请求,当浏览器收到响应后,自动再向redirect指定的url发起一个新的request,这时在浏览器的地址栏中可以看到一个新的url地址。
response.sendRedirect(String location)
1.location前有/,这时location是相对于当前host root
比如:response.sendRedirect("/test/login.html"),得到的绝对url是http://localhost:8080/test/login.html
2.location前没有/,这时是相对于当前url目录,属于相对目录
比如:response.sendRedirect("login.html"),如果当前url是:/test/action/a/b,那么得到的url是:/test/action/a/login.html

// 举个例子
SecondServlet
request.setAttribute("name", "andy");
request.getSession().setAttribute("address", "byx");
response.sendRedirect("third?name=jack"); 
或 response.sendRedirect(request.getContextPath()+"/third?name=jack"); // 绝对方式前面拼接上根目录

ThirdServlet
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
out.println(request.getContextPath()+"<hr/>");
out.println("name="+name+"<hr/>");
out.println("name="+request.getAttribute("name")+"<hr/>");
out.println("address="+request.getSession().getAttribute("address")+"<hr/>");

结果显示:地址栏url变为http://localhost:8080/Test/third?name=jack,只有request.getAttribute("name")获取不到,session范围及url路径后的传值在ThirdServlet都可以获取到。

重定向临时返回和正常返回的response区别?
redirect:HTTP/1.1 302 Moved Temporarily
Location: http://localhost:8080/test/action/a/login.html

正常情况redirect需要两次请求,一次返回302,接着再向Location发起一次新的request
正常返回的response(没有Location):HTTP/1.1 200 OK
正常返回的response,只需要一次请求

猜你喜欢

转载自blog.csdn.net/jiangtianjiao/article/details/87882364