重定向和请求转发
知识点
重定向:
1.重定向是指页面重新定位到某个新地址
- 之前的请求Request失效 ,进入一个新的请求;
- 跳转后浏览器地址栏内容将变成心得指定地址;
2.重定向是通过HttpServletResponse对象的sendRedirect()来实现
- 该方法用于生成302响应码和Location响应头,从而通知客户端去重新访问Location响应头中指定的URL;
- 相当于浏览器重新发送一个请求;
public void sendRedirect(java.lang.String location);
请求转发
- 请求转发是指将请求再转发到另一资源(一般为JSP或Servlet);
- 此过程依然在一个请求范围内,转发后浏览器地址栏内容不变;
- 请求转发使用RequestDispatcher接口中的**forward()**方法来实现;
- 该方法可以把请求转发到另外一个资源,并让该资源对浏览器的请求进行响应;
RequestDispatcher rd=request.getRequestDispatcher(path);
rd.forward(request,response);
重定向与请求转发的区别
- forward()只能将请求转发给同一个Web应用中的组件,sendRedirect()不仅可以重定向到当前应用程序中的其它资源,还可以重定向到其它站点的资源;
- sendRedirect()方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而调用forward()方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变;
- forward()方法的调用者与被调用者之间共享相同的request对象和response对象;而sendRedirect()方法调用者和被调用者使用各自的request对象和response对象,它们属于两个独立的请求和响应过程。
实践
重定向
1.MyServlet类
package myPackage;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class MyServlet
*/
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public MyServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("跳转结果");
String test=(String) request.getAttribute("test");
out.println(test);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
2.RedirectServlet类
package myPackage;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class RedirectServlet
*/
@WebServlet("/RedirectServlet")
public class RedirectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public RedirectServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("重定向前");
//向请求中存值(键值对)
request.setAttribute("test", "Hello World!");
//重定向
response.sendRedirect(request.getContextPath()+"/MyServlet");
out.println("重定向后");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
RedirectServlet类运行结果:
可见运行后的url地址为MyServlet
以及request和response的值未共享
请求转发
1.MyServlet类同上
2.ForwardServlet类
package myPackage;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ForwardServlet
*/
@WebServlet("/ForwardServlet")
public class ForwardServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ForwardServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("请求转发前");
request.setAttribute("test", "Hello World!");
RequestDispatcher rd=request.getRequestDispatcher("/MyServlet");
rd.forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
运行结果:
url地址为ForwardServlet,即地址不变
且共享request和response