Request

 

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 map = request.getParameterMap(); for(Map.Entry 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("

Demo8...before...

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

Demo8...after...

");

相关阅读

@RequestBody,415Unsupported Media Type错误,真正有用

用了一上午查找问题解决方案,网上的试验了一遍都没用,最后终于解决~我的答案在最后 问题:前端传json,后端也返回json,出现格式不匹配报

使用requests爬取携程网飞机票价格实例

1.前言 本实例需要用到的python包有requests、PrettyTable(用于打印展示成表格形式) pip install requests pip install pretty

produces在@requestMapping中的使用方式和作用

produces可能不算一个注解,因为什么呢,它是注解@requestMapping注解里面的属性项, 它的作用是指定返回值类型,不但可以设置返回值类型

携程酒店eleven_requests

携程eleven_requests声明:本文仅作技术交流,严禁用于任何非法用途(如有冒犯,请联系我删除此文)1.写在前面:2.eleven步骤分析1)寻找思路2)

HttpServletRequest参数获取,HttpServletRequest详解

————————–HttpServletRequest参数获取,HttpServletRequest详解——————————— HttpServletR

发表评论