Servelet------08 request请求转发

问题描述:

当我们访问一个项目的某个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执行了:

 我们在通过浏览器拦截开发者工具检测一下请求转发是几次请求:

 一次请求

所以请求转发的特点是:

  • 地址栏不发生变化
  • 只能访问当前服务器内部资源
  • 转发只是一次请求
迎风少年
原文地址:https://www.cnblogs.com/ZYH-coder0927/p/13665622.html