Request_KATER_SG的博客-程序员秘密

1 Request

1.1 什么是Request
代表HTTP请求的对象.
在浏览器向服务器发送请求之后, 服务器接受到请求, 在调用service方法处理请求之前, 会创建Request对象, 并把所有的请求信息( 请求行、请求头、请求实体 ) 全部封装到Request对象中.
1.2 Request继承关系

 ServletRequest(接口)  通用的Request接口, 提供了一个Request对象应该具有的功能.
    |
    |-- HttpServletRequest(接口) 继承了ServletRequest接口, 并且添加了很多和Http协议相关的方法
           |
           |- xxRequest --> Request对象

2 Request的功能

2.1 获取客户机的基本信息、获取请求头信息
getRequestURL() – 获取浏览器发送请求的完整URL地址
getRemoteAddr() – 获取浏览器所在主机的IP地址
getMethod() – 获取请求方式
getContextPath() – 获取当前Web应用的虚拟路径
getHeader(String name) – 根据请求头的名字获取请求头信息

代码示例:

//1.getRequestURL() -- 获取浏览器发送请求的完整URL地址
String url = request.getRequestURL().toString();
System.out.println("url: "+url);
//2.getRemoteAddr() -- 获取浏览器所在主机的IP地址
String ip = request.getRemoteAddr();
System.out.println("ip: "+ip);
//3.getContextPath() -- 动态获取当前Web应用的虚拟路径
String path = request.getContextPath();
System.out.println("path: "+path);// /day14
String method = request.getMethod();
System.out.println("method: "+method);// GET 
//4.getHeader() -- 获取请求头信息
String host = request.getHeader("host");
String referer = request.getHeader("Referer");
System.out.println("host: "+host);
System.out.println("referer: "+referer);
response.getWriter().write("RequestDemo1...");

2.2 获取请求参数
getParameter(String name) – 通过请求参数的名称获取对应的参数值
getParameterValues(String name) – 通过请求参数的名称获取对应的多个参数值所组成的数组.
getParameterMap() – 返回所有请求参数组成的map集合.
代码示例:

//1.获取用户名
String username = request.getParameter("username");
System.out.println("username="+username);
//2.获取爱好
String[] likes = request.getParameterValues("like");
System.out.println( Arrays.toString(likes) );
//3.获取所有参数组成的map集合
Map<String, String[]> map = request.getParameterMap();
for(Map.Entry<String, String[]> entry:map.entrySet() ){
    System.out.print(entry.getKey()+"=");
    System.out.println(Arrays.toString(entry.getValue()));
}

请求参数乱码问题:
1、乱码产生的原因:编码时和解码时使用的码表不一致造成的!
(1) 编码: 浏览器发送数据给服务器需要将数据转成字节, 默认使用的编码为 UTF-8
(2) 解码: 服务器接收浏览器发送过来的数据, 将字节转回字符, 默认使用的iso885-1
由于两端使用的编码不一致因此会产生乱码!
2、解决乱码方式:
(1)根据乱码产生的原理, 手动编解码来解决乱码
这里写图片描述
代码实现:

String username = request.getParameter("username");
System.out.println("解决前:username="+username);//乱码
byte[] bytes = username.getBytes("iso8859-1");
username = new String(bytes, "utf-8");
System.out.println("解决后:username="+username);//正确

(2)如果请求方式为POST提交, 可以通过一行代码搞定:

request.setCharacterEncoding("utf-8");
/*
 * 如果提交方式为POST提交, 可以通过下面这一行代码解决
 * 乱码: 这行代码会通知服务器使用utf-8来接收请求实体
 * 内容中的数据.
 */
String username = request.getParameter("username");
System.out.println("username="+username);

由于request.setCharacterEncoding(“utf-8”);会通知服务器使用utf-8来接收请求实体内容中的数据, 而POST方式提交的参数刚好在请求实体内容中, 所以这行代码对POST提交的参数乱码会起作用, 而GET提交的参数不在请求实体内容中, 所以这行代码对GET提交的参数乱码不会起作用!!

总结: 在解决请求参数时, 先判断请求方式, 如果是POST提交, 可以通过下面这行来搞定:

request.setCharacterEncoding("utf-8");
//注意! 这行代码必须要放在任何获取参数的代码之前执行, 否则将不会起作用!

如果是GET提交, 就需要通过手动编解码来解决乱码, 类似于下面的代码:

byte[] bytes = username.getBytes("iso8859-1");//username是乱码
username = new String(bytes, "utf-8");
System.out.println("解决后:username="+username);//正确

2.3 实现请求转发
可以实现资源的跳转,并且是服务器内部同一个Web应用的资源跳转。
(1)实现请求转发:

request.getRequestDispatcher("所转发到资源的路径").forward(request, response);

注意: 转发时的路径是从Web应用的虚拟路径后面开始写!, 比如我们要转发到:
http://localhost/day14/RequestDemo4, 其中传入的路径为: /RequestDemo4
(2)请求转发的特点:
a.一次请求,一次响应
b. 地址栏地址不会发生变化(改变)
c. 转发属于服务器内部的资源跳转, 只能在同一个Web应用内部的资源之间进行跳转. 不可以在不同的Web应用或者不同的虚拟主机之间进行跳转.
(3)请求转发的细节问题:
a. 在转发之前, 如果往response缓冲区写入了数据, 但是还没有打给浏览器, 在转发时就会被清空!
b .在转发之前, 如果往response缓冲区写入了数据, 并且强制打给了浏览器, 转发将会失败!
c. 在一个资源中, 不能进行多次转发, 但是可以进行多重转发.
2.4 作为域对象使用
域对象: 如果一个对象具有一个可以被看见的(或访问的)范围, 利用该对象上提供的map集合就可以在整个范围内实现资源的共享!
域对象提供的操作数据的方法:

setAttribute(String name, Object value) -- 添加一个域属性
getAttribute(String name) -- 获取一个域属性
removeAttribute(String name) -- 删除一个域属性

域对象的三大特征:
(1)生命周期: 一次请求开始时创建request对象. 一次请求结束时销毁Request对象
(2)作用范围: 整个请求链
(3)主要功能: 在整个作用范围内实现数据的共享!

域对象一般都会和请求转发配合着使用, 用于将数据从某一个资源(比如Servlet)转发带到另外一个资源处(Servlet/JSP)
2.5 实现请求包含
请求包含是服务器内部的资源合并现象

如果浏览器发送请求访问服务器中的A, A在处理时, 发现不能独立的处理这次请求, 需要另外一个B共同来处理请求, 此时可以在A中将B包含进来, 包含后的结果就是A+B一起来处理请求, 处理的结果也会合并在一起, 一起发送给浏览器.
实现代码:

response.getWriter().write("<p>Demo8...before...</p>");
//将Demo9包含进来和当前Servlet一起来处理请求
request.getRequestDispatcher("/RequestDemo9").include(request,response);
response.getWriter().write("<p>Demo8...after...</p>");

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42741731/article/details/81741721

智能推荐

jfinal(6)—Aop_程序源木南的博客-程序员秘密

Aop1.Aop概述2.Interceptor拦截器定义和配置拦截器拦截器的拦截级别拦截器分类拦截器执行顺序清除拦截器3.Validator概述定义和配置4.依赖注入启用依赖注入配置1.Aop概述JFinal采用极速化的AOP设计,专注AOP最核心的目标,将概念减少到极致,仅有三个概念:Interceptor、Before、Clear,并且无需引入IOC也无需使用啰嗦的XML。2.Interceptor拦截器定义和配置拦截器定义拦截器类:创建一个类实现Interceptor接口配置一个拦截器:

kafka丢数据和数据重复_xinlangtianxia的博客-程序员秘密

首先这个是我的原创文章,也参考了网络上的各位大神的文章加上自己的总结,欢迎各位大神指出错误!我们共同进步!1.kafka的数据交换是在哪里完成?kafka设计的初衷是尽一切努力在内存中完成数据交换,无论是对外的系统,或是内部存底层的操作系统的交互.如果Producer和Consumer之间生产和消费进度上配合得当,完全可以实现数据交换零I/O,但是这个几乎不可能2.kafka缓

android开源项目!京东面试真题解析,挥泪整理面经_程序员大婕的博客-程序员秘密

开头学习能力,尤其是自学能力,你啥时看到那些有名的程序高手在论坛上问“学习XX该看什么书,如何快速学习XXX,学习XXX有什么代码推荐”之类的问题,他们想学什么很快就能自己找到相关资料。这个行业发展太快,技术淘汰的速度也很快,3年不学新东西就可能落伍了。动手能力,都是看书看资料,当别人还在纠结看什么书,还在纠结书里的字句是什么意思的时候,有些人的几百上千行代码都已经能运行了。耐心和毅力,做程序员兴趣固然重要,写自己喜欢的代码那是相当愉快的事情,但是程序开发中无论如何还有大量乏味无趣的事情,要能坚持,咬

Webpack:搭建本地服务器_Continue丶的博客-程序员秘密_webpack搭建本地服务器

1. 概述webpack提供了一个可选的基于node.js的本地开发服务器,内部使用了express框架,可以实现我们想要让浏览器自动刷新显示我们修改后的结果。2. 安装因为它是一个单独的模块,需要安装npm install webpack-dev-server --save-dev3. 配置 devServer: { contentBase: './dist', inline: true }contentBase:为哪一个文件夹提供本地服务器,默认根文件夹inli

第一个作业_aong63116的博客-程序员秘密

转载于:https://www.cnblogs.com/XiaoPoHai-11/p/11448573.html

16、购物车结构说明、购物车模块搭建、购物陈商品列表空时添加新购物车、uuid作为未登录下的key、未登录购物车验证功能后端代码、购物车前端显示、数量增减、登录后购物车列表、合并登录和没登录的购物车_李享 的博客-程序员秘密

购物车结构说明购物车java结构是List的集合形式。Cart中包含sellerId和sellerName以及List三个属性。购物车模块搭建一、搭建cart-interface模块,不使用骨架二、搭建cart-service模块,使用骨架1、在web-inf中添加web.xml文件&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;w...

随便推点

java中字符类型输入法,Java表达式的陷阱——输入法、注释字符和转义字符的陷阱..._芯手的博客-程序员秘密

Java表达式的陷阱——输入法、注释字符和转义字符的陷阱3、输入法、注释字符和转义字符的陷阱3、1 输入法导致的陷阱对于Java语言而言,它使用空格、Tab制表符(半角状态)作为分隔符,因此一个Java程序中通常需要包含大量空格。但如果不小心把输入法切换到全角状态,那么输入的空格都会变成全角状态,编译该程序时将会提示"非法字符:\12288"的错误。注意:Java程序中通常不能包含全角字符,但Ja...

基于mybatis拦截器的行级数据权限管理方案_a1398265263的博客-程序员秘密_行级数据权限

​最近在做一个资源管理项目,其中有一个需求,需要对数据进行地域纬度管理。不同登录用户查询对应部分数据,但涉及业务表数据较多,单个sql重写,极其浪费效率,故考虑把关联权限的sql抽取出来,进行sql拦截重写实现权限自动关联。第一步:数据准备,每个业务数据新增行政区域纬度字段:area_gov_code[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JBi6ms0J-1650437006348)(c3acd10ebb594ed71819b775c0d6d900.png)]

MySQL binlog group commit--sync stage_yzs87的博客-程序员秘密

说明:1、如果sync_binlog等于1,那么need_LOCK_log为TRUE,然后将thd放到队列后,就不会释放该锁,等待sync_binlog_file调用结束后即文件sync后才解锁。这样在flush阶段sigal_update唤醒binlog dump线程后,dump线程会在此时才能获取到LOCK_log锁,即binlog 持久化到磁盘后,才会将binlog发送到slave。

NDK开发——Linux命令、Shell命令、MakeFile命令、gba命令_许英俊的博客-程序员秘密

Linux命令一、清空命令行reset二、文件操作ls -l 显示文件列表 ls -la 显示所有文件列表ls -l ja* 显示经过通配符查找的结果touch today.c 创建文件cp src.txt dest.txt 复制文件cp -i src.txt dest.txt 复制文件并询问cp src.txt . 复制文件到当前目录cp

WaitForMultipleObject_weixin_34259232的博客-程序员秘密

DWORD WaitForMultipleObject(DWORD dwCount , CONST HANDLE* phObject, BOOL fWaitAll, DWORD dwMillisecinds);dwCount参数用于指明想要让函数查看的内核对象的数量。这个值必须在1与MAXIMUM_WAIT_OBJECTS(在Windows头文件中定义为64之间....

<转载>C# -- 系统托盘NotifyIcon控件_anyangqu5692的博客-程序员秘密

通知区域中的图标是一些进程的快捷方式,这些进程在计算机后台运行,如防病毒程序或音量控制。这些进程不会具有自己的用户界面。NotifyIcon 类提供了编写此功能的方法。Icon属性定义显示在通知区域中的图标。图标的弹出菜单由 ContextMenu属性确定。Text属性分配工具提示文本。要在通知区域中显示图标,必须将 Visible属性设置为 true。具体使用方法:(1...

推荐文章

热门文章

相关标签