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

解决:使用请求转发。

特点:一次请求地址栏信息不改变。

请求转发

  • 作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。
  • 使用
    • req.getRequestDispatcher(“要转发的地址”).forward(req, resp);
      • 地址:相对路径,直接书写servlet的别名即可。
  • 特点:一次请求,浏览器地址栏信息不改变。
  • 注意:请求转发后直接return结束即可。

Request对象作用域

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

解决:使用request对象的作用域

使用:request.setAttribute(objectname,Objectvalue);request.getAttribute(Objectobj)

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

作用域:基于请求转发,一次请求中的所有 Servlet 共享。

注意:使用 Request 对象进行数据流转,数据只在一次请求内有效。

  • 特点:
    • 服务器创建
    • 每次请求都会创建
    • 生命周期一次请求

问题:如果当前的请求,Servlet 无法进行处理怎么办?如果使用请求转发,造成表单数据重复提交怎么办?

解决:使用重定向

使用:response.sendRedirect(“路径”).本地路径为:uri 网络路径为:定向资源的 URL 信息

特点:两次请求,浏览器地址栏信息改变,避免表单重复提交

重定向

解决了表单重复提交的问题,以及当前servlet无法处理的请求的问题。

  • 使用:resp.sendRedirect(String uri);
  • 示例:resp.sendRedirect(“/login/main”);
  • 特点:
    • 两次请求,两个request对象。
    • 浏览器地址栏信息改变
  • 时机:
    • 如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。
    • 如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源。
  • 注意:两次请求,第一个请求里面的数据则不能被第二次请求获取,则需要使用到session,学习session,则又要先学cookie