request

本文详细介绍了HTTP请求的组成部分,包括请求行、头和实体内容,以及如何处理请求参数的乱码问题。还探讨了请求转发和包含的功能,请求转发在服务器内部进行资源跳转,而请求包含则能合并多个servlet的输出结果。最后,讨论了request对象作为域对象的角色,用于在整个请求链中共享数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.request概念
代表HTTP请求。
a.HTTP请求由四部分组成:
在这里插入图片描述
b.请求的继承结构
在这里插入图片描述
2.请求的功能
a.获取请求资源
getRequestURL方法 – 返回客户端发出请求完整URL
getRequestURI方法 – 返回请求行中的资源名部分
getQueryString方法 – 返回请求行中的参数部分
getRemoteAddr方法 – 返回发出请求的客户机的IP地址
getMethod – 得到客户机请求方式
!!getContextPath – 获得当前web应用虚拟目录名称 – 在写路径时要将web应用的虚拟路径的名称写死, 应该在需要写web应用的名称的地方通过getContextPath方法动态获取
b.获取请求头
getHeader(name)方法 — String
getHeaders(String name)方法 — Enumeration
getHeaderNames方法 — Enumeration
getIntHeader(name)方法 — int
getDateHeader(name)方法 — long(日期对应毫秒)
c.获取请求实体内容
getParameter(String name) — String 通过name获得值;
getParameterValues(String name) — String[ ] 通过name获得多值 checkbox;
getParameterMap() — Map<String,String[ ]> key :name value: 多值 将查询的参数保存在一个Map中;
getParameterNames() — Enumeration 获得所有name;
1)在获取请求参数时,如果获取中文数据,则会出现乱码。
原因:(1)编码和解码字符集不统一。
(2)浏览器负责发送数据,在发送数据时会对数据编码,发送数据时所使用的字符集是页面加载时的字符集,为utf-8。
(3)接收数据的是服务器,服务器在接收数据时会采用默认字符集iso8859-1解码数据。
(4)发送与接收字符集不同意,所以出现了乱码。由于iso8859-1中没有中文,所以应该将两者统一为utf-8。修改服务器的字符集。
(5)如果是post提交,可以进行如下修改:
在所有获取请求参数的代码之前,书写:
request.setCharacterEncoding(“utf-8”);
这句话仅能处理请求实体内容中的请求参数乱码,所以只对post请求有效,get请求无效。
(6)如果是get请求,则需要在获取参数之后,先使用iso8859-1编码,在使用utf-8解码。
代码如下:
new String(username.getBytes(“iso8859-1”),“utf-8”);
这种形式,既可以解决get提交的乱码,也可以解决post提交的乱码。

3.request功能–请求转发
请求转发是一种资源跳转方式,发生的服务器内部。
在这里插入图片描述
a.代码实现

package cn.tedu.request;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDemo4 extends HttpServlet {
   public void doGet(HttpServletRequest request, HttpServletResponse response)
   		throws ServletException, IOException {
   	//只能在web应用内部跳转
   	//创建一个调度器   
   	RequestDispatcher rd = request.getRequestDispatcher("/servlet/RequestDemo5");
   	//利用调度器实现请求转发
   	System.out.println("RequestDemo4 start...");
   	rd.forward(request, response);
   	System.out.println("RequestDemo4 end...");
   }
   public void doPost(HttpServletRequest request, HttpServletResponse response)
   		throws ServletException, IOException {
   	doGet(request, response);
   }
}

b.请求转发细节:
1)请求转发之前如果向response缓冲区中写入数据,这些数据在请求转发是会被清空。
2)如果冲刷缓冲区,会造成一次响应,导致请求转发失败.所以不能冲刷缓冲区.
3)请求转发可以多重转发,但是不能在同一个servlet内多次请求转发.
4)在请求转发前后的代码也会正常执行.
5)多个请求转发会组成一个请求链,请求链的执行顺序是先执行所有请求转发之前的代码,在反向指向全部请求转发之后的代码.

4.request功能–请求包含
可以将两个servlet结果合并为一个结果输出.
在这里插入图片描述
5.request功能–作为域对象使用
a.域对象概念
如果一个对象身上有一个可以被看见的范围,在这个范围内利用对象身上的map,实现数据的共享,这个对象就可以叫做域对象。
b.在域对象身上可以设有域属性,操作域属性的api如下:
设置域属性:setAttribute(String name,Object obj);
获取域属性:getAttribute(String name);
删除域属性:removeAttribute(String name);
获取全部域属性的名称:getAttributeNames();
注意:
请求参数是Parameter,会随着form表单发送到服务器,通过
getparameter()及其相关api获取.
域属性是request对象作为域对象使用时,特有的属性。通过setAttribute设置,getAttribute获取。
域属性和请求参数是两个不同的数据,API不能混用。
c.生命周期:
当请求链开始的时候,request对象创建,
当请求链结束的时候request对象销毁。
d.作用范围:整个请求链。
e.主要功能:在整个请求链中共享数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值