请求重定向:客户端的一次请求到达后,发现需要借助其他Servlet来实现功能
特点:浏览器地址栏发生改变,两次请求,请求域对象中不能共享数据,可以重定向到其他服务器
重定向的实现原理
设置响应状态码为302.resp.setStatus(302);
设置响应的资源路径(响应到哪里去,通过响应消息头location来指定)
resp.setHeader("location","/response/responseDemo07");
但是我们可以选择直接使用响应对象重定向方法
返回值 | 方法名 | 说明 |
void | sendRedirect(String name) | 设置重定向 |
接下来我们来实践一下这个方法,代码如下:
* 请求重定向 */
@WebServlet("/servletDemo6")
public class ServletDemo6 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo6执行了");
//设置请求域共享数据
req.setAttribute("username", "zhang");
//请求重定向
//前面获取虚拟路径名称,后面跟着想要跳转到的地方
resp.sendRedirect(req.getContextPath() + "/servletDemo7");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
将会重定向到/servletDemo7
* 请求重定向 */
@WebServlet("/servletDemo7")
public class ServletDemo7 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo7执行了");
//获取共享数据
Object username = req.getAttribute("username");
System.out.println(username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
然而我们可以看到控制台中的输出结果中,getAttribute并不能取到对应的值,只会显示null
这是因为重定向的原因,经过二次请求,请求域对象中的数据在第二次请求时就已经丢失