转发forward:
转发只是一次请求并且是Web服务器内部进行资源跳转,而且浏览器地址栏上的路径也不会改变
@WebServlet(urlPatterns = "/aaa")
public class Demo extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从当前的请求路径跳转到处理bbb请求的servlet下
request.getRequestDispatcher("/bbb").forward(request,response);
}
}
也就是说当前的servlet收到请求自己并不做出响应而是转发给了处理请求bbb的servlet来对请求做出响应
重定向redirect:
重定向就是当客户端发送一个请求之后,服务器给浏览器一个响应告诉客户端请求路径改变需要再发一个请求,重定向会发送一个请求
//发送重定向响应 默认为临时重定向
response.sendRedirect(request.getContextPath()+"/bbb");
客户端浏览器会收到如下响应
HTTP/1.1 302 Found
Location: /bbb
浏览器会重新发送一个请求路径是request.getContextPath()+"/bbb"的请求
重定向分两种临时重定向响应状态码是302和永久重定向响应状态码是301
//发送重定向响应 默认发送的是临时重定向 响应状态码为302
response.sendRedirect(request.getContextPath()+"/bbb");
// 设置响应状态码为301 永久重定向
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
response.setHeader("Location","/bbb");
浏览器客户端收到的响应内容变成下面这样了:
HTTP/1.1 301 Found
Location: /bbb
转发和重定向的相同点和不同点:
相同点:都可以完成资源的跳转 该资源值得是所有的web资源包括静态资源
不同点:转发是请求对象触发的而重定向是响应对象触发的,转发是一次请求在 浏览器地址栏上不会变化,重定向是两次请求浏览器地址栏上的地址会改变,重定向可以跨服务器跳转资源而转发只能在服务器内部跳转