问题描述:
当我们访问一个项目的某个Servelet资源,如果这个Servelet资源的功能并不能完全处理我们的访问需求,但是服务器中的其他Servelet资源类可以处理我们的需求,那么就可以通过请求转发的方式,将我们的请求转发给可以处理我们需要的业务逻辑的Servelet资源类。
讲解:
其实关于请求转发这个知识并没有那么复杂,我们知道,当我们一次访问的时候,服务器(Tomcat)会创建一个Servelet资源类的对象,并且将我们的请求信息封装到request对象中,传递给创建好的Servelet资源类对象,那么这个request对象在我们的这一次访问中是唯一的,Servelet资源类如果想要处理业务逻辑,就需要用到request对象,从request对象中获取请求信息进行业务逻辑的处理,那么请求转发中的多个Servelet资源类就需要使用同一个request对象。
以上可以将请求转发简述为以下几步:
- 访问资源类创建,封装传递request对象
- 在首次访问的Servelet资源类中通过request对象处理部分业务逻辑
- 获取请求转发器,并制定相应的Servelet资源类地址
- 通过转发器的forword(request,response);方法将request对象传递给第二个Servelet资源类
- 资源类在进行业务处理
请求转发图解:
代码演示:
@WebServlet("/servlet01") public class Servlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("资源类1执行了...."); request.getRequestDispatcher("/servlet02").forward(request, response);//转发 } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
资源类2
@WebServlet("/servlet02") public class Servlet02 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("资源类2执行了..."); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
现在我们访问资源类1
结果:
但是访问的地址栏并没有发生变化:
那么请求转发可以访问服务器外部的资源吗?
我们讲转发路径改成百度:
不能访问到:
但是资源类1执行了:
我们在通过浏览器拦截开发者工具检测一下请求转发是几次请求:
一次请求
所以请求转发的特点是:
- 地址栏不发生变化
- 只能访问当前服务器内部资源
- 转发只是一次请求