1. request 对象和 response 对象均由服务器创建.

2. 服务器处理请求的流程:

  • 服务器每次收到请求时, 都会为这个请求开辟一个新的线程;
  • 服务器会把客户端的请求数据封装到 request 对象中, request 对象就是请求数据的载体!
  • 服务器还会创建 response 对象, 这个对象与客户端连接在一起, 它可以用来向客户端发送响应.

3. response 对象

3.1 response 对象向浏览器发送的内容包括:

  • 响应行
  • 响应头
  • 空行
  • 响应体

3.2 根据发送的内容, 查找 JavaEE API 文档的 javax.servlet.http 中的 HttpServletResponse 接口

3.2.1 响应行中的状态码
  1. 状态码: 200 表示成功, 302 表示重定向, 404 表示客户端错误, 500 表示服务器错误.
  2. 常用方法:
    • sendError(int sc); : 发送错误状态码, 例如 404, 500
    • sendError(int sc, String msg); : 发送错误状态码和错误描述信息
    • setStatus(int sc); : 发送成功的状态码, 如 200, 302
3.2.3 响应头相关的方法
  1. 响应头是由键值对组成, 可能会存在一个键,一个值, 也可能会存在一个键对应多个值的情况.
  2. 响应头的键不区分大小写, 一般都是大小首字母.
  3. 常用方法:
    • setHeader(String name, String value); : 适用于单值的响应头; (该方法较常用)
    • addHeadet(String name, String value); : 适用于一个名称多个值的响应头;
    • setIntHeadet(String name, int value); : 适用于单值的, 且值为 Int 类型的响应头;
    • addIntHeader(String name, int value); : 适用于多值的, 且值为 Int 类型的响应头;
    • setDateHeader(String name, long value); : 适用于单值的毫秒类型的响应头;
    • addDateHeader(String name, long value); : 适用于多值的毫秒类型的响应头;
// 示例:
// 发送 404 错误信息
response.sendError(404, "您要找的信息不存在!");// 发送 302, 设置 Location 头, 通过访问 AServlet 完成重定向到 BServlet
response.setStatus(302);
response.setHeader("Location","/day10_1/BServlet");  // 请求URI: /项目名/Servlet 路径// 第二种方式: 重定向
response.sendRedirect("/day10_1/BServlet");// 设置文件大小
response.setIntHeader("Content-Length", 346);// 设置定时刷新的响应头
response.setHeader("Refresh", "5;URL="/day10_1/CServlet");// 浏览器缓存过期时间为 24 小时
response.setDateHeader("expires", 1000*60*60*24);// 禁用浏览器缓存的设置方法 (下面的三个响应头需要一起使用, 以便覆盖所有的浏览器)
response.setHeader("Cache-Control", "no-cache");
response.setHeader("pragma", "no-cache");
response.setDateHeader("expires", -1);  // -1 表示马上过期// html 页面中在 <head> 标签内部中子标签 <meta> 可以替代响应头
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
3.2.4 响应体相关的方法
  1. 响应体通常是 html, 也可以是图片.
  2. response 的两个流, 用于向客户端响应内容:
    • ServletOutputStream : 用来向客户端发送字节数据; API 位于 J2EE 文档中 javax.servlet
    • PrintWriter : 用来向客户端发送字符数据! 需要设置编码类型; API 位于 J2SE 文档中 java.io
    • 两个输出流不能同时使用!! 若同时使用,会抛出 IllegalStateException.
// 示例
// 使用 PrintWriter 发送字符数据// 发送字符 "Hello World!"response.getWriter().print("Hello World!");// 使用 ServletOutputStream 发送字节数据(图片)// 发送字符 "Hello World!"String s = "Hello World!";// 把字符转换成字节byte[] bytes = s.getBytes();  response.getOutputStream().write(bytes);// 发送 F 盘下 a.jpg// 需要先用 IO 流将图片变成字节数组, 然后发送// 需要使用 commons-io-1.4 jar 包String path = "F:/a.jpg";FileInputStream in = new FileInputStream(path);byte[] bytes = IOUtils.toByteArray(in);   // 将输入流中的字节读取到字节数组中.response.getOutputStream().write(bytes);

request 对象

  1. 服务器将客户端所有的请求数据都封装到 request 对象中.包括:

    • 请求行
    • 请求头
    • 空行
    • 请求体(GET 没有请求体)

2. 常用方法 (JavaEE API 文档的 javax.servlet.http 中的 HttpServletRequest 接口)

2.1 获取常用信息
  1. 获取客户端IP: request.getRemoteAddr();
  2. 获取客户端请求方式: request.getMethod(); 结果为 POST 或 GET
2.2 获取 HTTP 请求头
  1. String getHeader(String name); : 适用于单值请求头. (较常用)
  2. int getIntHeader(String name); : 适用于单值 int 类型的请求头
  3. long getDateHeader(String name); : 适用于单值毫秒类型的请求头
  4. Enumeration<String> getHeaders(String name); : 适用于多值请求头
// 示例
// 获取客户端 IP
request.getRemoteAddr();// 通过 User-Agent 识别用户浏览器类型
request.getHeader("User-Agent");// 使用 Referer 请求头, 来防盗链
// Referer 用来告诉服务器,浏览器从哪个页面链接过来的
request.getHeader("Referer");

2.3 获取请求 URL

http://localhost:8080/day10_1/AServlet?username=zhangsan&password=aaa

  1. 获取协议: String getScheme();, 返回值为 http
  2. 获取服务器名: String getServerName();, 返回值为 localhost
  3. 获取服务器端口: String getServerPort();, 返回值为 8080
  4. 获取项目名: String getContextPath();, 返回值为 /day10_1
  5. 获取 Servlet 路径: String getServletPath();, 返回值为 /AServlet
  6. 获取参数部分, 即问号后面的部分: String getQueryString();, 返回值为 username=zhangsan&password=aaa
  7. 获取请求 URI, 等同于项目名+Servlet 路径: String getRequestURI();, 返回值为 /day10_1/AServlet
  8. 获取请求 URL, 等于不包含参数的整个请求路径: String getRequestURL();, 返回值为 http://localhost:8080/day10_1/AServlet

2.4 获取请求参数

  • 请求参数是由客户端发送给服务器的!!
  • 请求参数有可能在请求体中(POST 请求), 也可能是在 URL 之后(GET 请求);
  • 一个请求参数可以对应一个值或多个值.
  1. 获取指定名称的请求参数值, 适用于单值请求参数: String getParameter(String name); (较常用)
  2. 获取指定名称的请求参数值, 适用于多值请求参数: String[] getParameterValues(String name);
  3. 获取所有请求参数名称: Enumeration<String> getParameterNames();
  4. 获取所有请求参数, 其中 key 为参数名, value 为参数值: Map<String, String[]> getParameterMap(); (较常用)

2.5 请求转发和请求包含

  1. 有时一个请求需要多个 Servlet 协作才能完成, 所以需要在一个 Servlet 跳转到另一个 Servlet!

    • 一个请求跨多个 Servlet, 需要使用转发和包含;
    • 请求转发: 由下一个 Servlet 完成响应体! 当前 Servlet 只可以设置响应头! (即第一个 Servlet 留头不留体);
    • 请求包含: 由两个 Servlet 共同完成响应体! (第一个 Servlet 请求头和请求体都留);
    • 无论是请求转发还是请求包含, 都发生在一个请求范围内! 使用的是同一个 request 和 response!!!
// 首先使用 request 对象获取转发器(RequestDispatcher 对象)
// 该方法的参数是被转发或包含的 Servlet 路径, 该路径也就是在 web.xml 中 <url-pattern>/AServlet</url-pattern> 配置的
RequestDispatcher rd = request.getRequestDispatcher(String path);// 请求转发 (使用较多)
rd.forward(request, response);// 请求包含
rd.include(request, response);

2.6 request 域

  • Servlet 中三大域对象: request, session, application(ServletContext), 它们都具有如下三个方法:

    • void setAttribute(String name, Object value); 设置(添加)域属性
    • void getAttribute(String name); 获取域属性
    • void removeAttribute(String name); 删除域属性
  1. request 域必须是在同一个请求范围内;
  2. 同一个请求范围内, 前一个 Servlet 使用 request.setAttribute() 保存值, 后一个 Servlet 调用 request.getAttribute() 来获取值.
  3. 请求参数是客户端向服务器发送请求时,自己带过来的内容, 只能使用 get 方法, 从 request 对象中获取.
    而 request 域中,存放的是属性,不是请求参数. 属性也就是 Servlet 和 Servlet 在转发或包含时, 传递值使用的.

3. 请求转发和重定向的区别:

  1. 请求转发是一个请求一次响应, 而重定向是两次请求两次响应;
  2. 请求转发地址栏不发生变化, 而重定向会显示后一个请求的地址;
  3. 请求转发只能转发到本项目其他 Servlet, 而重定向不只能重定向到本项目的其他 Servlet, 还能定向到其他项目;
  4. 请求转发是服务器行为, 只需给转发的 Servlet 路径, 而重定向需要给出 requestURI, 即包含项目名;
  5. 请求转发比重定向效率高, 因为是一个请求;

参考资料:

  • JavaWeb 视频教程
  • JavaEE 6.0 文档
  • commons-io-2.5 jar 包

转载于:https://www.cnblogs.com/linkworld/p/7587662.html

Response 和 Request相关推荐

  1. java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别

    java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别 参考文章: (1)java ...

  2. JavaWeb——response与request

    一.引言 了解了servlet基本原理,其中内置对象response与request了解是必须的,终点学习下== 主要包括get和post方法中的使用 先直观的看一下response和request: ...

  3. 浏览器返回数据量过大报‘failed to load response data: Request content was evicted from inspector cache’

    主要参考:failed to load response data request content was evicted from inspector cache 现象: 解决方法: copy as ...

  4. Response和Request常用方法以及mmgrid插件的学习

    Response和Request Response和Request容器是一一对应的,他是web容器在用户每次请求服务端的时候,创建的一对容器对象,Response容器是服务端返还给客户机的一个响应内容 ...

  5. eclipseweb开发response和request接收发送数据乱码问题

    第一种:request接收到的数据出现乱码: 在request接收数据前面设置如下代码 requset.setCharacterEncoding("UTF-8); reponse往页面写中文 ...

  6. Flask cookie API(response.set_cookie,request.cookies)

    1.设置cookie cookie通过Response类来创建response对象,然后通过这个对象设置cookie class flask.Response(response=None, statu ...

  7. response和request

    Request和Response的格式 转载 2017年08月08日 14:23:34 94 (Request和Response的格式) 一个HTTP Request(HTTP请求)的格式通常如下: ...

  8. java request 原理_JavaWeb response和request对象原理及实例解析

    HttpServletResponse: HttpServletResponse对象服务器的响应.这个对象中封装了向客户端发送数据.发送响应头,发送响应状态码的方法. 字符编码格式: 方法一: // ...

  9. chrome捕获大响应失败:Failed to load response data: request content was evicted from inspector cache

    问题描述 需求是: 通过调整请求参数(rows),来一次性查询所有数据,最后将数据保存下来. 出现问题: 问题是响应的数据过大,chrome浏览器报错: 解决方案 使用cURL来发送该请求. 推荐使用 ...

最新文章

  1. 【操作系统】考研の处理机调度算法(看不懂你来打我~!)
  2. 第三章 python webdriver API(一)——浏览器操作
  3. Google App Engine技术架构之Google App Engine的简介
  4. java邮箱找回密码_Spring实现简单的邮箱找回密码功能
  5. 已成功拿下字节、腾讯、脉脉offer,吐血整理
  6. java tls 证书_在使用Java 8重新协商TLS_1.2期间,服务器证书更改受到限制
  7. postgreSQL源码分析——索引的建立与使用——各种索引类型的管理和操作(2)
  8. Windows:打开MSDTC,恢复Windows任务栏,查看windows日志,打开远程桌面,打开Services,资源监控...
  9. SnippetsLab:让代码信手拈来
  10. 【记录】搭建本地wordpress全过程
  11. 【免积分下载】吴恩达 机器学习笔记PDF版v5.5.pdf
  12. Linux源码安装pgadmin4,CentOS7中安装pgAdmin 4
  13. NetSetMan Pro v5.1.1 网络参数配置工具便携版
  14. 精品软件 推荐 Bootice(引导扇区维护工具)
  15. python实现斗地主发牌洗牌
  16. 扩展欧几里得求乘法逆元 - 手算(结尾附视频)
  17. PAT备考经验相关信息
  18. LeetCode: 183. Customers Who Never Order
  19. nodejs+express解决微信公众号token验证失败
  20. mysql 进阶(二)

热门文章

  1. proBuilder编辑的模型变黑
  2. Mac OSX 10.9下apache+php+mysql的配置
  3. php include效率分析
  4. 顺利通过scjp认证考试
  5. Catalyst 4000 6000配置经验谈(一)
  6. 安装WebDriverAgent时,执行bootstrap.sh脚本报错提示:ERROR in ./js/app.js的解决方法
  7. sumif三个条件怎么填_Excel条件求和函数sumif详解及应用
  8. vba抓取网页数据到excel_R语言网页数据抓取XML数据包
  9. 四轴飞行器实践教程(内部资料)
  10. php mysql table_关于php:MySQL Table不存在错误,但确实存在