上一节:https://blog.csdn.net/Carl_changxin/article/details/86612004
本节参考:https://blog.csdn.net/liubin5620/article/details/79922692
1、概念
(1)背景:当前客户端访问的Servlet1不能处理客户端的问题,此时就有两种方式解决这种情况。
方式1:服务器通过把请求转发给Servlet2去处理然后响应客户端,此时客户端是不知道问题是由Servlet2处理的。
方式2:服务器告知客户端Servlet2能处理其问题,客户端再去访问Servlet2,即客户端把请求重定向给Servlet2。
(2)区别:上述的方式1和2分别是请求转发和请求重定向的思路,两种方式的区别大致分成4点。
区别1:请求转发是服务器完成的;请求重定向是客户端完成的。
区别2:请求转发客户端是不知道的,故浏览器的请求网址在请求转发的时候是不会改变的;因为请求重定向是由客户端完成的,所以请求网址会在请求重定向的时候作出相应改变。
区别3:客户端发出请求,再经过请求转发,最终也只算是一次请求;请求重定向算两次请求
区别4:请求转发只能访问同一个WEB应用中的组件;而请求重定向可以访问外部应用
2、实现
(1)梳理
自定义的Servlet继承HttpServlet类时,doGet和doPost方法是针对不同的请求方式可以选择实现doGet或doPost方法,与转发和重定向无关;
在do方法中有两个参数HttpServletRequest和HttpServletResponse,分别是接收请求消息的信息和设置响应消息的信息,具体的操作可参考:(https://blog.csdn.net/Carl_changxin/article/details/86607047);
(2)实现
HttpServletRequest对象中有请求转发相关的方法,请求转发的实现如下:
request.getRequestDispatcher("/servlet/demo6").forward(request, response);
HttpServletResponse对象中有请求重定向的方法,实现如下:
/*//告诉客户端要重新定向新的资源 response.setStatus(302); //告诉浏览器要去访问哪个URL response.setHeader("location", "/day09_00_HttpServletResponse/servlet/demo8");*/ //上面两句合成一句,如下;request.getContextPath()的作用是获取/day09_00_HttpServletResponse response.sendRedirect(request.getContextPath()+"/servlet/demo6");
(3)注意路径的填写
请求转发发生在服务器,第一个/代表当前项目根目录后的/
请求重定向发生在客户端,第一个/代表localhost:8080后的/ ,需要注意重定向的路径要写全了,一般可用getContextPath获取当前项目的根目录