• Resquest对象详解


    简述

      Request对象就是请求消息对应的java类,request和response对象是由tomcat服务器创建的,我们来使用他们。

      在创建servlet的时候,tomcat会将客户端的请求消息封装到request消息封装到request类中,然后将request和respone传入servlet的service方法中。

      程序员就可以在service方法中通过request对象获取请求信息,通过response对象设置相应信息数据。tomcat会在给浏览器相应前,从response拿程序员设置的相应消息数据。

    resquest对象体系结构

      ServletRequest -- 接口
        | 继承
      HttpServletRequest -- 接口
        | 实现
      org.apache.catalina.connector.RequestFacade类(tomcat)

    resquest获取请求消息数据

    获取请求行数据

      请求行格式:请求方式 请求url 请求协议/版本

      例如有如下请求行:GET /day14/demo1?name=zhangsan HTTP/1.1

    String getMethod() 获取请求方式 :GET
    String getContextPath() 获取虚拟目录:/day14
    String getServletPath() 获取Servlet路径: /demo1
    String getQueryString() 获取get方式请求参数:name=zhangsan

    String getRequestURI(): /day14/demo1
    StringBuffer getRequestURL() :http://localhost/day14/demo1

    获取请求URI:/day14/demo1
    String getProtocol() 获取协议及版本:HTTP/1.1
    String getRemoteAddr() 获取客户机的IP地址

    获取请求头数据

    String getHeader(String name) 通过请求头的名称获取请求头的值
    Enumeration<String> getHeaderNames() 获取所有的请求头名称

      Enumeration可以理解为一个迭代器,可以通过方法二配合方法一获取请求头所有的数据,但日常中我们常用的是方法一,因为我们已经知道很多请求头的名称了

    获取请求体数据

      对于请求体数据可以是字节数据或字符数据,我们可以先获取流对象,然后通过流对象获取数据

    BufferedReader getReader() 获取字符输入流,只能操作字符数据
    ServletInputStream getInputStream() 获取字节输入流,可以操作所有类型数据

    其他功能

    获取请求参数通用方式

      无论get还是post请求方式都可以使用下列方法来获取请求参数

    String getParameter(String name) 根据参数名称获取参数值
    String[] getParameterValues(String name) 根据参数名称获取参数值的数组 hobby=xx&hobby=game
    Enumeration<String> getParameterNames() 获取所有请求的参数名称
    Map<String,String[]> getParameterMap() 获取所有参数的map集合

    解决中文乱码

      乱码的原因:浏览器向服务器发送utf-8编码的数据,

      若是get请求,tomcat8之前要在server.xml里进行配置解决乱码,tomcat8之后tomcat帮我们解决了

      若是post请求,我们则需调用request.setCharacterEncoding("utf-8");指定服务器的编码集解决乱码

    请求转发

      请求转发是一种在服务器内部的资源跳转方式,比如我们有两个servlet完成两部分工作,则就需要请求转发的方式了

    RequestDispatcher getRequestDispatcher(String path) 通过request对象获取请求转发器对象,参数是要转发资源的路径
    forward(ServletRequest request, ServletResponse response)  使用RequestDispatcher对象来进行转发

      RequestDispatcher详解(转):https://blog.csdn.net/gaoshan12345678910/article/details/82183820

      转发最大的特点就是,过程中只有一次请求,浏览器的URL没有变化,真正产生相应数据的是被转发的servlet,且只能转发当前服务器的内部资源。

    共享数据

      有了请求转发,就牵扯到数据共享问题了

      域对象:一个有作用范围的对象,可以在范围内共享数据

      request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

    void setAttribute(String name,Object obj) 存储数据
    Object getAttitude(String name) 通过键获取值
    void removeAttribute(String name) 通过键移除键值对

    获取ServletContext

     ServletContext getServletContext() 获取ServletContext对象

    获取数据

      这里的获取数据是对post请求和get请求数据的统称,他们两种请求数据都可以用

    String request.getParameter("name")
    获取key值为name的请求数据

      对于我们要封装一个bean类,例如在登录页面我们填写了个人信息,现在需要把他们封装为一个User类

      我们可以通过Map<String,String[]> map = request.getParameterMap();获取数据的map集合,然后通过BeanUtils工具类的populate方法来进行封装

            Map<String,String[]> map = request.getParameterMap();
            User user = new User();
            try {
                BeanUtils.populate(user,map);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }    

      因为表单数据如一个checkbox可能有两个value值,所以map的泛型是String,String[]类型的

    一点一点积累,一点一点蜕变!
  • 相关阅读:
    EduCF-69 Array Splitting (连续子序列,规律)
    Subsequence 单调队列
    HDU
    HDU
    Numpy 切片和索引
    Numpy 从数值范围创建数组
    Numpy 的常用属性 和创建数组
    Numpy 线性代数
    Numpy 矩阵库(Matrix)
    Numpy 创建数组
  • 原文地址:https://www.cnblogs.com/qq2210446939/p/14813471.html
Copyright © 2020-2023  润新知