Servlet(五):请求转发和重定向

请求转发:

  问题:
    服务器在接收到浏览器的请求后,仅仅使用一个 Servlet进行请求处理,会造成不同的Servlet逻辑代码 冗余,Servlet的职责不明确。

  解决:
    使用请求转发。
  特点:
    一次请求
    地址栏信息不改变。

Request 对象作用域
  问题:

    使用请求转发后,不同的 Servlet 之间怎么进行数据的共享呢?或者说数据怎么从一个 servlet 流转给另外一个 Servlet 呢?
  解决:

    使用 request 对象的作用域
  使用:
    request.setAttribute(objectname,Objectvalue);
    request.getAttribute(Objectobj)
  作用:

    解决了一次请求内的不同 Servlet 的数据(请求数据+其他数据)共享问题。

  作用域:基于请求转发,一次请求中的所有 Servlet 共享。
  注意:
    使用 Request 对象进行数据流转,数据只在一次请求内有效。
  特点:
    服务器创建
    每次请求都会创建
    生命周期一次请求

重定向
  问题:
    如果当前的请求,Servlet 无法进行处理怎么办?
    如果使用请求转发,造成表单数据重复提交怎么办?
  解决:
    使用重定向
  使用:
    response.sendRedirect(“路径”).
    本地路径为:uri
    网络路径为:定向资源的 URL 信息
  特点:
    两次请求
    浏览器地址栏信息改变
    避免表单重复提交

Servlet流程总结:
 *         浏览器发起请求到服务器(请求)
 *      服务器接受浏览器的请求,进行解析,创建request对象存储请求数据
 *      服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
 *      servlet的方法执行进行请求处理
 *              //设置请求编码格式
 *              //设置响应编码格式
 *              //获取请求信息
 *              //处理请求信息
 *                  //创建业务层对象
 *                  //调用业务层对象的方法
 *              //响应处理结果
 *请求转发学习:
 *        作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。
 *        使用:
 *                req.getRequestDispatcher("要转发的地址").forward(req, resp);
 *                地址:相对路径,直接书写servlet的别名即可。
 *        特点:
 *            一次请求,浏览器地址栏信息不改变。
 *        注意:
 *            请求转发后直接return结束即可。
 *reuqet作用域:
 *        解决了一次请求内的servlet的数据共享问题
 *重定向:
 *        解决了表单重复提交的问题,以及当前servlet无法处理的请求的问题。
 *        使用:
 *            resp.sendRedirect(String uri);
 *        示例:
 *            resp.sendRedirect("/login/main");
 *        特点:
 *            两次请求,两个request对象。
 *            浏览器地址栏信息改变
 *        时机:
 *            如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。
 *            如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源。    
 *
原文地址:https://www.cnblogs.com/jiulonghudefeizhai/p/10105799.html