一、重定向
1、引入
客户端请求服务器时,服务器将响应的状态码设置为302,并添加location的响应头,告知客户端将location的值作为新的URL重新确定请求。客户端收到响应后,根据location的值重新发送请求。
2、示例
方式一:设置状态码和location头
package com.jingxin.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置状态码
response.setStatus(302);
//设置location头,建议写绝对路径
response.setHeader("Location", "http://localhost:8080/demo2/index.html");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
方式二:直接设置重定向
package com.jingxin.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/BServlet")
public class BServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("http://localhost:8080/demo2/index.html");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
二、转发
1、引入
当前请求未完成,服务器需要调用自身的其他资源(Servlet、html、jsp)来处理客户端的请求,完成响应。(需要多个资源来合作完成请求的处理)
2、分类
- forward : 会清除之前资源设置的响应缓冲区内容,只保留最后一个资源设置的内容,会保留所有资源设置的响应头
- include:合并所有资源设置的响应内容,只保留第一个资源设置的响应头,忽略其他资源设置的响应头
资源:指Web项目中的Servlet、html、jsp
3、示例
forward转发
package com.jingxin.servlet;
import java.io.IOException;
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;
@WebServlet("/CServlet")
public class CServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("CServlet");//最终的响应中会将其擦除
response.setHeader("CServlet", "CServlet");//最终响应头中存在
//获取请求调度器
RequestDispatcher dispatcher = request.getRequestDispatcher("/DServlet");
//转发请求
dispatcher.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package com.jingxin.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/DServlet")
public class DServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("DServlet");//最终响应体中存在
response.setHeader("DServlet", "DServlet");//最终响应头中存在
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
执行结果
include 包含
package com.jingxin.servlet;
import java.io.IOException;
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;
@WebServlet("/EServlet")
public class EServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("EServlet<br/>");//会将响应内容合并
response.setHeader("EServlet", "EServlet");//保留响应头
//获取请求调度器
RequestDispatcher dispatcher = request.getRequestDispatcher("/FServlet");
//请求包含
dispatcher.include(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package com.jingxin.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/FServlet")
public class FServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("FServlet");//会合并响应内容
response.setHeader("FServlet", "FServlet");//会被忽略
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
执行结果
三、重定向与转发的区别
- 重定向是两次请求,转发是一次请求
- 重定向是浏览器地址栏会发生变化,转发时浏览器地址栏不变
- 重定向可以指定当前Web项目的资源也可以指定其他Web项目的资源,转发只能指定当前Web项目的资源
- 重定向第一次请求设置的值重定向后不能获取,转发时设置的值可以在转发的资源中获取
- 完成页面跳转功能选择重定向,多个资源中需要传递数据选择转发