servlet03 request对象

1 Request
代表HTTP请求的对象
1.1 Request继承关系
ServletRequest接口 – 通用request接口, 提供了一个request对象应该具有的功能.
|
|-- HttpServletRequest接口 – 继承了ServletRequest接口, 并在父接口的基础上提供了很多和HTTP协议相关的方法.

1.2 Request对象提供的功能
1.2.1 获取客户机的基本信息和获取请求头信息
getRequestURL – 获取发送请求的完整url
getRequestURI – 获取请求行中的请求资源路径
getRemoteAddr – 获取客户机的IP地址
getMethod – 获取请求方式
getHeader(String name) – 根据请求头的名称获取对应的值

(1) getRequestURL

(2) getRequestURI

(3) getRemoteAddr

(4) getMethod

(5) getHeader

1.2.2 获取请求参数!!!
getParameter(String name) – 根据请求参数的名称获取参数值
getParameterValues(String name) – 根据请求参数的名称获取所有参数值组成的数组
getParameterMap() – 获取所有请求参数组成的map集合

(1) getParameter

(2) getParameterValues

(3) getParameterMap

 请求参数乱码问题: 在向服务器提交请求参数时, 如果参数中包含中文参数, 就会出现乱码问题. 其原因是:
(1)浏览器在发送数据时使用utf-8码表: 如果浏览器在打开网页时使用的是utf-8, 浏览器就会使用相同的编码来发送请求参数.
(2)服务器在接收数据时使用iso8859-1码表: 如果没有明确的通知服务器使用哪一个编码, 服务器会使用默认的编码, 即iso8859-1来接收请求参数.
两端使用的编码不一致所以就出现了乱码
 解决方式一: 通过手动编解码来解决乱码问题.

在Servlet中具体代码实现如下:

测试结果:

 解决方式二:
(1) 如果是POST提交:
request.setCharacterEncoding(“utf-8”); //这行代码可以通知服务器使用utf-8码表来接收请求实体内容中的数据. 因为POST提交的请求参数就在请求实体内容中, 所以这行代码对POST提交的参数乱码会起作用.

(2)如果是GET提交, 这行代码将不会起作用, GET提交的请求参数是在请求资源路径后面通过问号进行拼接, 不在请求实体内容中, 因此不会起作用!
所以针对GET提交的参数乱码, 可以采用上面的手动编解码来解决, 或者是修改服务器的核心配置文件(server.xml文件),修改如下:

1.2.3 实现请求转发

请求重定向(302+localhost): 实现资源的跳转
请求转发: 是服务器内部(同一个web应用内)的资源跳转.
请求转发的实现:
request.getRequestDispatcher(“/所转发到资源的地址”).forward(request, response);

请求转发的特点:
(1) 转发是一次请求对应一次响应
(2) 地址栏地址不会发生变化
(3) 转发过程中request(和response)对象都是同一个

请求转发的细节问题:
(1)在转发的过程中, 如果向response缓冲区写入了数据, 在转发之前response中的数据会被清空.

(2)在转发的过程中, 如果向response缓冲区写入了数据并且强制发送给了浏览器, 转发将会失败

(3)在同一个Servlet中不能转发多次(A不能同时转发给B和C), 但是可以多重转发(比如A转发给B, B转发给C)
1.2.4 作为做域对象使用!!!
什么是域对象: 如果一个对象具有一个可以被看见的范围, 利用该对象上的map在整个范围内可以实现资源的共享.
request.setAttribute(String name, Object value);
– 往request域中(map)添加一个域属性
request.getAttribute(String name);
– 根据属性名获取request域中的属性值
request.removeAttribute(String name);
– 根据属性名删除request域中的属性
request.getAttributeNames();
– 获取request域中所有的属性名称组成的枚举.

生命周期: 一次请求开始创建request对象, 一次请求结束销毁request对象

作用范围: 整个请求链

主要功能: 在整个请求链中实现数据的共享

 案例(实现请求转发+作为域对象使用): 查询个人资料功能
(1) 创建一个index.jsp页面, 提供查询个人资料的入口.

(2) 创建一个show.jsp页面, 负责显示个人资料.

(3) 创建一个Servlet, 负责根据用户的请求查询当前用户的个人资料

(4)将用户的个人资料带到show.jsp进行展示.

1.2.5 实现请求包含
所谓的请求包含是服务器内部资源合并的现象.
如果浏览器访问服务器中的某一个ServletA, ServletA在处理请求时不能够独立的处理这次请求, 需要ServletB帮忙一同处理这次请求, 这是可以在ServletA将ServletB包含进来, 结果是由ServletA和ServletBy共同来处理该请求, 处理的结果也会合并在一起, 响应给浏览器. 例如: 在RequestDemo7中包含RequestDemo8
在RequestDemo7中的代码:

在RequestDemo8中的代码:

猜你喜欢

转载自blog.csdn.net/TomHaveNoCat/article/details/82911386
今日推荐