一、Request 对象和 Response 对象原理

  request和response对象是由服务器创建的,供我们使用的。

  request对象是来获取请求消息,response对象是来设置响应消息。

  原理示意图

二、Request 对象继承体系结构

  

三、HttpServletRequest 接口

  每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好到 Request 对象中,每次请求都创建一个 Request 对象,请求完成后该对象就销毁了。

  然后传递到 service 方法(doGet 和 doPost)中供我们使用,通过 HttpServletRequest 对象,课获取到所有请求信息。

三、HttpServletRequest 功能

  1、获取请求消息数据

    (1)获取请求行数据

       常用方法:

(1)String getMethod() :         获取请求方式
(2)String getContextPath(): 获取虚拟目录[重要]
(3)String getServletPath(): 获取 servlet 路径
(4)String getQueryString(): 获取get方式请求参数
(5)String getRequestURI(): 获取请求URI[重要]
(6)StringBuffer getRequestURL():获取请求的URL
(7)String getProtocol(): 获取协议及版本
(8)String getRemoteAddr(): 获取客户端的IP地址
(9)String getRemoteHost(): 获取客户端的主机名

      注意

      URI:统一资源标识符;URL:统一资源定位符;两者区别:URI 与 URL

      Demo:

 请求行数据 GET /servletDemo/demo1?name=zhangsan HTTP/1.1
String getMethod(): 获取到 GET
String getContextPath(): 获取到 /servletDemo
String getServletPath(): 获取到 /demo1
String getQueryString(): 获取到 name=zhangsan
String getRequestURI(): 获取到 /servletDemo/demo1
StringBuffer getRequestURL():获取到 http://localhost/servletDemo/demo1
String getProtocol(): 获取到 HTTP/1.1
String getRemoteAddr(): 获取到 请求机器的IP地址

    (2)获取请求头数据

      常用方法:

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

    (3)获取请求体数据

        请求体:只有POST请求方式,才有请求体,在请求体重封装了POST请求的请求参数

        步骤:

        ① 获取流对象

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

        ② 从流对象中拿数据

        Demo:

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取字符流
BufferedReader br = request.getReader(); //2.读取数据
String line = null;
while((line = br.readLine()) != null) {
System.out.println(line); // 请求参数username=zs&password=abc
}
}

  2、获取请求参数

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

    常用方法

(1)String getParameter(String name):           根据参数名称获取参数值    username=zs&password=abc
(2)String[] getParameterValues(String name): 根据参数名称获取参数值的数组 hobby=java&hobby=python
(3)Enumeration<String> getParameterNames(): 获取所有请求的参数名称(相当于Iterator)
(4)Map<String,String[]> getParameterMap(): 获取所有参数的map集合,可以根据键(参数名)获取值(参数值)

           注意:

       ① get方式:Tomcat 8 已经将 get 方式乱码问题解决了

       ② post 方式:获取中文会产生乱码

         解决方式:在获取参数前,设置 request 的编码与页面编码一致即可

request.setCharacterEncoding("utf-8");

  3、作为域对象存取数据

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

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

     常用方法

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

  4、获取请求转发对象

    请求的转发:指的是服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。

          注意:这是一种在服务器内部的资源跳转方式,无法跳转到外部的资源。

    实现步骤:

      ① 通过 request 对象获取请求转发器对象;

RequestDispatcher getRequestDispatcher(String path): 获取请求转发器对象,path为转发到的路径

       ② 使用 RequestDispatcher 对象来进行转发

forward(ServletRequest request, ServletResponse response):转发方法

     特点:

      ① 浏览器地址栏路径不会发生变化;

      ② 只能转发到自己工程的内部资源;

      ③ 转发是一次请求,可以共享 Request 域中的数据;

      ④ 可以转发到 WEB-INF 目录下

    注意

      ① 从外部(浏览器)无法直接访问 WEB-INF 目录下的资源,但是可以通过请求转发访问到;

      ② 执行完跳转的 servlet 的业务后,然后再回来继续执行原来的 servlet 的业务。

    原理图:

      

  5、获取 ServletContext 对象  

      通过 getServletContext() 方法获取 ServletContext 对象:

ServletContext servletContext = request.getServletContext();通过request 对象获取 servletcontext 对象

  

  

Java 之 Request 对象的更多相关文章

  1. [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  2. java webservice服务器端获取request对象的三种方式

    有的时候在webservice里我们需要获取request对象和response对象,比如想要获得客户端的访问ip的时候就需要这么做,下面说三种方式,当然三种方式可能是针对不同方式部署webservi ...

  3. Java面试题之Request对象的主要方法

    setAttribute(String name,Object):设置名字为name的request的参数值 getAttribute(String name):返回由name指定的属性值 getAt ...

  4. request 对象和 response 对象

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象 HttpServletResponse HttpServletR ...

  5. JSP内置对象之request对象【学习笔记】

    request对象是JSP中重要的对象,每个request对象封装着一次用户的请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径. 一.获取请求头与 ...

  6. 通过Request对象对cookie的设置、获取

    <html> <head></head> <body> <% request.setCharacterEncoding("UTF-8&q ...

  7. Volley(二)—— 基本Request对象 & RequestQueue&请求取消

    详细解读Volley(一)—— 基本Request对象 & RequestQueue&请求取消 Volley它非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作, ...

  8. jsp request 对象详解

    转自:http://www.cnblogs.com/qqnnhhbb/archive/2007/10/16/926234.html 1.request对象 客户端的请求信息被封装在request对象中 ...

  9. JSP内置对象--request对象

    本文主要介绍JSP中的request对象 request对象的主要方法: setAttribute(String name,Object):设置名字为name的request的参数值 getAttri ...

随机推荐

  1. Windows Server 2012 R2 卸载IE浏览器

    If you run any Windows Servers, you may run into a scenario where you want to remove access to Inter ...

  2. C#中得到每周,每月,每季,每年的年初末日期

    DateTime表示时间上的一刻,通常以日期和当天的时间表示.借用这个结构,我们可以实现较丰富的功能,本文给出得到每周每天的方法,及得到本月第一天,本月最后一天,本季第一天,本季最后一天,本年第一天及 ...

  3. zz 勵志貼,成功是努力加对的方向

    5-6年工作经验程序员初进大厂,如何适应工作? 李苦李 李苦李 ​ 华为 架构师 318 人赞同了该回答 泻药! 与题主背景非常相似. 本人毕业8年+,普通二本,学历不突出,非计算机专业. 唯一不同的 ...

  4. apache Request-URI Too Large 处理办法

    在Apache的httpd.conf配置文件中(直接加就可以) LimitRequestLine 40940 LimitRequestFieldSize 40940

  5. CMake版本低,需要更高版本.

    https://blog.csdn.net/qq_34935373/article/details/90266958 使用cmake命令安装Opencv软件时,报如下错误: CMake Error a ...

  6. Ubuntu下卸载anaconda

    转载:https://blog.csdn.net/m0_37407756/article/details/77968724(一)删除整个anaconda目录: 由于Anaconda的安装文件都包含在一 ...

  7. package.json详解以及package-lock.json的作用

    一.创建 package.json输入如下命令之后,会要求填写基本的配置信息,这里,我们选择一路回车即可,待生成 package.json 文件之后,再来配置. npm init 二.配置 packa ...

  8. PMP ITTO工具

    整合管理 范围管理 进度管理 成本管理 质量 资源管理 沟通管理 风险管理 采购管理 相关方管理

  9. java自定义jar包让jemeter使用

    背景:可能在做定义化的要求上,jmeter原有的jar包,已经不能满足我们,就需要自己写一个方法,以下就是写入的一个模拟post的请求,在jmeter中使用的案例 一:写代码 1.代码中的有两个包,原 ...

  10. 工控随笔_24_西门子TIA 博图硬件目录的更新

    西门子博图软件,不但体积庞大,功能也很复杂,与经典的Step7相比,如果不是经常使用,一般都会有一种很难使用的感觉. 而且相比原来的Step7操作有点不太一样.这里简单的说一下硬件目录的更新. 有两种 ...