zoukankan      html  css  js  c++  java
  • HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向

    上篇文章我们讲了servlet的基本原理,这章将讲一下剩余的部分。

    HttpServletRequest 接口

      该接口是 ServletRequest 接口的子接口,封装了 HTTP 请求的相关信息,由 Servlet 容器创建其实现类对象并传入 service(ServletRequest req, ServletResponse res)方法中。我们请求的详细信息都可以通过 HttpServletRequest 接口的实现类对象获取。这个实现类对象一般都是容器创建的,我们不需要管理。

    HttpServletRequest 主要功能

    获取请求参数

    1)什么是请求参数?

    请求参数就是浏览器向服务器提交的数据

    2)浏览器向服务器如何发送数据

      a)附在 url 后面,如:http://localhost:8989/MyServlet/MyHttpServlet?userId=20

      b)通过表单提交

    <form action="MyHttpServlet" method="post">
        你喜欢的足球队<br /><br />
        巴西<input type="checkbox" name="soccerTeam" value="Brazil" /> 
        德国<input type="checkbox" name="soccerTeam" value="German" />
        荷兰<input type="checkbox" name="soccerTeam" value="Holland" />
        <input type="submit" value="提交" />
    </form>

    3)使用HttpServletRequest对象获取请求参数

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      //一个name对应一个值
      String userId = request.getParameter("userId"); 
      System.out.println("userId="+userId); }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //一个name对应一组值
        String[] soccerTeams = request.getParameterValues("soccerTeam");
        for(int i = 0; i < soccerTeams.length; i++){
            System.out.println("team "+i+"="+soccerTeams[i]);
        }
    }

    在请求域中保存数据

    数据保存在请求域中,可以转发到其他Servlet或者jsp页面,这些Servlet或者jsp页面就会 从请求中再取出数据

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //将数据保存到request对象的属性域中request.setAttribute("attrName", "attrValueInRequest");
        //两个Servlet要想共享request对象中的数据,必须是转发的关系
        request.getRequestDispatcher("/ReceiveServlet").forward(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //从request属性域中获取数据
        Object attribute = request.getAttribute("attrName"); 
        System.out.println("attrValue="+attribute);
    }

    HttpServletResponse 接口

    HttpServletResponse ServletResponse 接口的子接口,封装了 HTTP 响应的相关信息,由

    Servlet 容器创建其实现类对象并传入 service(ServletRequest req, ServletResponse res)方法中。主要功能:

    1)使用 PrintWriter 对象向浏览器输出数据

    //通过PrintWriter对象向浏览器端发送响应信息
    PrintWriter writer = res.getWriter();
    writer.write("Servlet response"); writer.close();

    2)实现请求重定向

    请求转发与重定向

    请求转发和重定向是 web 应用页面跳转的主要手段,应用十分广泛,所以我们一定要搞清楚他们的区别。

    请求转发:

      1)第一个 Servlet 接收到了浏览器端的请求,进行了一定的处理,然后没有立即对请求进行响应,而是将请求“交给下一个 Servlet”继续处理,下一个 Servlet 处理完成之后对浏览器进行了响应。在服务器内部将请求“交给”其它组件继续处理就是请求的转发。对浏览器来说,一共只发了一次请求,服务器内部进行的“转发”浏览器感觉不到,同时浏览器地址栏中的地址不会变成“下一个 Servlet”的虚拟路径。

      2)在转发的情况下,两个 Servlet 可以共享 Request 对象中保存的数据

      3)转发的情况下,可以访问 WEB-INF 下的资源

      4)当需要将后台获取的数据传送到 JSP 上显示的时候,就可以先将数据存放到 Request 对象中,再转发到 JSP 从属性域中获取。此时由于是“转发”,所以它们二者共享 Request 对象中的数据。

    public class ForwardServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("forwardServlet  doGet");
    
            //请求的转发
            //1.调用HTTPServletRequest 的getRequestDispatcher()方法获取RequestDispatcher对象
            //调用getRequestDispatcher()方法时需要传入转发的地址
            String path = "testServlet";
    
            RequestDispatcher requestDispatcher = request.getRequestDispatcher("/"+path);
            //2.调用调用HTTPServletRequest 的forward(request,response)进行请求的转发
            requestDispatcher.forward(request,response);
        }
    }

    请求重定向:

      1)第一个 Servlet 接收到了浏览器端的请求,进行了一定的处理,然后给浏览器一个特殊的响应消息,这个特殊的响应消息会通知浏览器去访问另外一个资源,这个动作是服务器和浏览器自动完成的,但是在浏览器地址栏里面能够看到地址的改变,会变成下一个资源的地址。

      2)对浏览器来说,一共发送两个请求,所以用户是能够感知到变化的。

      3)在重定向的情况下,不能共享 Request 对象中保存的数据。

    public class RedirectServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("RedirectServlet doGet");
    
            //执行请求的重定向,直接调用reponse.sendRedirect(path)方法
            //path为重定向的地址
            String path = "testServlet";
            response.sendRedirect(path);
        }
    }

    转发与重定向的区别:

     

    转发

    重定向

    浏览器地址栏

    不会变化

    会变化

    Request

    同一个请求

    两次请求

    API

    Request 对象

    Response 对象

    位置

    服务器内部完成

    浏览器完成

    WEB-INF

    可以访问

    不能访问

    共享请求域数据

    可以共享

    不可以共享

    目标资源

    必须是当前 Web 应用中的资源

    不局限于当前 Web 应用


    图解转发和重定向

  • 相关阅读:
    从壹开始前后端分离[.NetCore ] 38 ║自动初始化数据库(不定期更新)
    从壹开始前后端分离[.NetCore] 37 ║JWT实现权限与接口的动态分配——复杂策略授权
    从壹开始微服务 [ DDD ] 之十二 ║ 核心篇【下】:事件驱动EDA 详解
    从壹开始微服务 [ DDD ] 之八 ║剪不断理还乱的 值对象和Dto
    从壹开始微服务 [ DDD ] 之七 ║项目第一次实现 & CQRS初探
    CentOS7下的CDH 6.2.0 安装过程
    php获取客户端IP地址的方法
    IntelliJIdea 2016.2 使用 tomcat 8.5 调试spring的web项目时,bean被实例化两次导致timer和thread被启动了两遍的问题的解决
    Linux 系统 TCP优化
    Fedora 25-64位操作系统中安装配置Hyperledger Fabric过程
  • 原文地址:https://www.cnblogs.com/java-chen-hao/p/10729903.html
Copyright © 2011-2022 走看看