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[]类型的

一点一点积累,一点一点蜕变!
原文地址:https://www.cnblogs.com/qq2210446939/p/14813471.html