Servlet请求转发

请求转发

一次请求Servlet对应的request对象,在此request中存储数据,可以在此request对象中取出;但是在另一次请求Servlet对应的request对象,是没有第一次请求时在request对象中添加的数据的

要解决这个不同请求对应的不同request对象之间传递,需要使用请求转发技术

步骤

  1. 获取请求转发器对象
  2. 调用请求转发器的forward()方法即可完成转发
/*
    /a路径对应AServlet,/b路径对应BServlet,

    通过request对象的getRequestDispatcher方法获取请求转发器对象,
    然后调用请求转发器对象的forward方法进行转发
    
    以下代码是从AServlet转发到BServlet
*/

//获取请求转发器,以下转发器指向了BServlet
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/b");
//调用请求转发器的forward()
requestDispatcher.forward(request,response);

实例

第一次请求AServlet,在AServlet中的request对象中存储数据后,通过请求转发,转发到BServlet,BServlet对应的request对象中包含了AServlet对应的request对象的数据,数据被传递了,实现了跨请求(跨Servlet)传递数据

/*AServlet*/
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
        
        User admin = new User(111, "admin");
        request.setAttribute("user",admin);         //向request范围中存数据
        //转发
        request.getRequestDispatcher("/b").forward(request,response);
    }
}


/*BServlet*/
public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        Object user = request.getAttribute("user"); //从request范围中取数据
        writer.print(user);
    }
}

转发过程

以上述实例为例

  1. 浏览器向AServlet发出访问请求;
  2. AServlet调用forward()方法,在服务器端将请求转发给BServlet;
  3. 最终由BServlet做出响应

特点

在浏览器端进行一次请求,服务器端将请求从一个Servlet转发给另一个Servlet…,浏览器端的地址不变,但是实际上可能后台是好几个Servlet依次处理浏览器的请求,并相应给浏览器

在这里插入图片描述

关于范围对象的选择

ServletContext 应用范围极大,可以跨用户传递数据,整个webapp只有一个ServletContext对象

ServletRequest请求范围小,只能在同一个请求中传递数据【跨Servlet传递数据,需要使用请求转发技术】

优先选择使用ServletRequest传递数据

总结

请求转发可以跨Servlet(跨请求)传递数据,一次请求对应的Servlet中的request对象的数据,可以传递给请求转发的另一个Servlet的request对象

请求转发,是一次请求

相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页