文章目录
一、转发
请求转发是一种服务器行为,当客户端的请求到达服务器端时,服务器会将请求对象保存并进行转发,地址栏中的URL不会改变,得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出。
实现方式如下:
request.getRequestDispatcher(url).forword(request, response);
HttpServletRequest
(以下简写request)作用域:
request域对象中的数据在一次请求中有效,转发是一个请求,则可以通过转发来共享数据,示例如下:
@WebServlet("/A")
public class ForwardA extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收客户端请求的参数
String name = req.getParameter("name");
System.out.println("A:" + name);
//请求转发
req.getRequestDispatcher("B").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
@WebServlet("/B")
public class ForwardB extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
System.out.println("B:" + name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
发送请求:
控制台打印信息:
二、重定向
重定向是一种服务器端指导客户端的行为。客户端发出第一个请求,被服务器接收处理后,服务器会进行响应,并给客户端一个新的地址,客户端接收响应后,立刻根据新地址发起第二个请求,服务器接收并作出响应,重定向完成。
实现方式如下:
response.sendRedirect("xxx");
重定向后地址栏会发生改变,并且数据不能像转发一样共享,示例如下:
@WebServlet("/redirect_A")
public class Redirect_A extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收客户端请求的参数
String name = req.getParameter("name");
System.out.println("redirect_A:" + name);
//重定向跳转到B
resp.sendRedirect("redirect_B");
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
@WebServlet("/redirect_B")
public class Redirect_B extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收客户端请求的参数
String name = req.getParameter("name");
System.out.println("redirect_B:" + name);
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
发送请求:
控制台打印信息:
此时地址栏变为:
三、转发和重定向的区别
请求转发 | 重定向 |
---|---|
一次请求,数据在request域中共享 | 两次请求,request域中数据不共享 |
服务器端行为 | 客户端行为 |
地址栏不发生变化 | 地址栏会发生变化 |
转发是web容器应用内 | 重定向可以访问web容器外部的资源 |
注
:自定义一个servlet_A,可以转发到同在一个web容器中的servlet_B,不能转发到“https://baidu.com”,而重定向可以。