- request请求对象
本文记录我在java的学习之路。一、Request请求对象介绍
- 介绍
1.请求:获取资源。
在BS架构中,就是客户端浏览器向服务器发出的一次请求。
2. 请求对象:
ServletRequest
httpServletRequest
二、Servlet继承结构
三、底层执行流程
- 服务器创建Servlet对象后、创建request请求和response响应对象;
- request对象用于封装HTTP在当次请求中的数据;
response对象用于封装响应给客户端浏览器的数据; - 服务器会调用Servlet对象的service()方法。将request对象和response对象作为参数传递给service()方法;
- 我们再使用请求和响应对象对数据进行操作;
- 服务器在进行响应之前会将response对象中的数据编译成HTTP响应的格式,响应给浏览器。
四、请求对象中常用方法
- 获取路径
URI:统一资源标识符;由项目虚拟目录/Servlet映射路径组成,访问内部资源居多;
URL:统一资源定位符;浏览器访问路径;访问项目外部的资源就使用URL;
图示:
//获取统一资源标识符:虚拟路径/Servlet映射路径
- 获取请求头
- 获取请求参数信息
注意:
1. getParameterNames():
注意看返回值,返回的是枚举;
2. getParameterMap():
返回的是一个map集合,通过map集合,获取到键值对,有keyset()和entrySet()两个方法;
通过键找值,返回的是一个字符串数组,可使用Arrays的alist方法去方便打印。
- 流对象获取请求信息
注意:用于获取请求体,主要用于post请求方式。
五、获取请求参数并封装成对象
1. 手动封装方式
(1) 先获取数据,getParameter
(2) 拿到数据封装到学生对象
(3) 打印学生对象2. 反射封装方式
基于反射的技术–内省(专门用于操作对象的get和set方法的)
①先拿到所有的请求参数:getparameterMap();
②遍历集合,KeySet拿到所有的key,通过key拿到value数组;
③获取学生对象的属性描述器: PropertyDescriptor( 通过key,拿到的是当前key所对应的get和set方法);
④获取对应的set方法:getWriteMethod();
⑤执行方法:invoke();
注意:属性描述器要传入两个参数,对应的key和学生对象的class对象;3. 工具类封装方式
①第三方的beanutils工具封装参数;
②
前提: 学生类的属性名必须和标签的name一一对应;
六、请求行和请求头的说明
- 请求行:请求方式 请求路径(包含请求参数)协议/版本;
- 请求头:浏览器告知服务器的一些额外信息,格式是键值对;
- 通常是一个key对应一个value,也有一个key对应多个value的情况。
- 常见的请求头:
User-Agent:客户端浏览器的相关信息(浏览器类型,版本等);
referer:网页来源(从哪跳转过来的)
cookie:客户端会话技术所需要的请求头。
七、中文乱码问题
请求参数的中文乱码
- GET方式:没有乱码问题。在Tomcat 8.5版本后已经解决。
- POST方式:有乱码问题,可以通过setCharacterEncoding()方法解决。
八、请求域
概述: 可以在一次请求范围内进行共享数据(即发起请求到响应结束)。作用: 一般用于请求转发的多个资源中共享数据。常用方法:
九、请求转发(重点)
- 请求转发: 客户端的一次请求到达后,发现需要借助其他Servlet来实现功能;整个操作都在一次请求内。
- 打个比方:你的老板让你改一下ppt,你把ppt发给你的下一级去修改,最后由你的下一级将ppt返回给你的老板。
- 特点:
浏览器地址栏不变;
由于是在一次请求内,所以域对象中的数据不会丢失;
负责转发的Servlet转发前后的响应正文会丢失;
由转发的目的地来响应客户端; - 方法:
注意:getRequestDispatcher()方法里面传的是你要转发的页面的路径。
图示:
十、请求包含
- 请求包含: 可以合并其他Servlet中的功能一起响应给客户端。
- 特点:
浏览器地址栏不变;
域对象中的数据不丢失;
被包含的Servlet响应头会丢失;
注意:请求包含跟请求转发用法一样。
- 响应对象
一、Response响应对象介绍响应: 回馈结果。
在BS架构中,就是服务器给客户端浏览器反馈结果。响应对象: 就是在项目中用于发送响应的对象。
二、 常见的状态码
三、字节流响应消息
代码演示:
四、字符流响应消息
注意:缓冲字符输出流内部有一个缓冲区,这个缓冲区的默认字符集是ISO-8859-1;
一般把设置编码的代码放在过滤器中
五、设置缓存
- 缓存: 对于不经常变化的数据,我们可以设置合理缓存时间,以避免浏览器频紧请求服务器。以此来提高效率。
六、定时刷新(重点)
- 定时刷新: 过了指定时间后,页面自动进行跳转。
图示:
注意:
定时刷新是通过设置响应头的方式来完成的;
同时定时刷新也是请求重定向;
七、请求重定向(重点)
- 概念: 重定向。我们可以选择让别人来为我们处理响应,把请求重定向到一个完全不同的URL,或者可以把请求分派给Web应用的另一个组件(通常是一个JSP)。
重定向需要用到 :request.sendRedirect(重定向路径) ,注意要使用相对URL。 - 实现重定向的方式:
1. 标准方式:(设置请求头和状态码)
2. 简写形式:
八、转发和重定向的区别
最终实现的功能是相同的。不同之处如下。
- 地址栏变化转发: 不改变地址栏中的URL;重定向: 改变地址栏;
- 跳转范围
转发: 只能访问到当前web应用中的内容;重定向: 则可以访问到任意web应用中的内容;
- request对象作用范围
转发: 在转发后的页面中仍然可以使用原来的request对象;重定向: 原来的request对象则失去作用;所以,如果想要在多个页面使用相同的request对象,那么只能使用转发,而不能使用重定向。
注意:
这一句话意思是,重定向其实是发生了两次请求,而request的请求域作用范围是一次请求内,所以不能实现数据共享。
要想实现数据共享,要么提升作用域,要么只能在当前作用域范围能实现对应的操作。
九、文件下载概述: 即浏览器上显示的文件,你不希望用户直接可以查看到,而已以附件的方式展示给用户,让用户下载;
- 文件下载的操作步骤:
- 创建字节输入流,关联读取的文件。
- 设置响应消息头支持的类型。
- 设置响应消息头以下载方式打开资源。
- 通过响应对象获取字节输出流对象。
- 循环读写。
- 释放资源。
- 文件下载记忆方式:
两头流:两个响应头
- Content-Type: 告知响应体的数据类型(mime类型)
- Content-Disposition: 告知浏览器不要渲染响应体,以附件形式处理。
输入流和输出流的对接:
- 输入流: 关联文件的输入流
- 输出流: 通过响应对象获取的输出流