request
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>");
相关阅读
@RequestBody,415Unsupported Media Type错误,真正有用
用了一上午查找问题解决方案,网上的试验了一遍都没用,最后终于解决~我的答案在最后 问题:前端传json,后端也返回json,出现格式不匹配报
1.前言 本实例需要用到的python包有requests、PrettyTable(用于打印展示成表格形式) pip install requests pip install pretty
produces在@requestMapping中的使用方式和作用
produces可能不算一个注解,因为什么呢,它是注解@requestMapping注解里面的属性项, 它的作用是指定返回值类型,不但可以设置返回值类型
携程eleven_requests声明:本文仅作技术交流,严禁用于任何非法用途(如有冒犯,请联系我删除此文)1.写在前面:2.eleven步骤分析1)寻找思路2)
HttpServletRequest参数获取,HttpServletRequest详解
--------------------------HttpServletRequest参数获取,HttpServletRequest详解--------------------------------- HttpServletR