Request概述
代表HTTP请求的对象。
Request继承结构
ServletRequest |-HttpServletRequest |
- ServletRequest
request的根接口,定义了请求相关的方法
- HttpServletRquest
ServletRequest接口的实现类,在ServletRequest接口的基础上增加了很多和HTTP协议相关的方法
Request功能详解
- 获取客户机相关信息
getRequestURL() Reconstructs the URL the client used to make the request. 获取客户端访问的完整URL | |
getRequestURI() Returns the part of this request's URL from the protocol name up to the query string in the first line of the HTTP request. 获取客户端访问的资源路径 | |
getQueryString() Returns the query string that is contained in the request URL after the path. 获取请求地址中的参数部分作为字符串返回 | |
getRemoteAddr() Returns the Internet Protocol (IP) address of the client or last proxy that sent the request. 获取客户机ip地址信息 | |
getMethod() Returns the name of the HTTP method with which this request was made, for example, GET, POST, or PUT. 获取请求方式 | |
getContextPath() Returns the portion of the request URI that indicates the context of the request. 获取当前访问的应用名称 |
- 获取请求头信息
getHeader(String name) Returns the value of the specified request header as a String. 获取指定请求头的值 | |
getHeaders(String name) Returns all the values of the specified request header as an Enumeration of String objects. 获取指定请求头的值们 | |
getHeaderNames() Returns an enumeration of all the header names this request contains. 获取所有请求头的名字们 | |
int | getIntHeader(String name) Returns the value of the specified request header as an int. 以int类型获取指定请求头的值 |
long | getDateHeader(String name) Returns the value of the specified request header as a long value that represents a Date object. 以时间毫秒值获取请求头的值 |
- 获取请求参数
getParameter(String name) Returns the value of a request parameter as a String, or null if the parameter does not exist. 获取指定名称的请求参数的值 | |
String[] | getParameterValues(String name) Returns an array of String objects containing all of the values the given request parameter has, or null if the parameter does not exist. 获取指定名称请求参数的值的集合 请求中可能包含多个同名请求参数,可以通过这个方法来获取 |
getParameterNames() Returns an Enumeration of String objects containing the names of the parameters contained in this request. 获取所有请求参数名们 | |
getParameterMap() Returns a java.util.Map of the parameters of this request. 获取所有请求参数组成的Map<String,String[]>,其中键为请求参数名,值为请求参数值的数组 |
- 请求参数乱码原理
浏览器发送请求参数时采用的编码取决于表单页面的编码。
如果没有表单页面,直接在地址栏上敲地址,则采用系统码。
服务器在解析请求参数时,解析用的编码如下:
GET提交 | 请求参数在地址之后 | 看server.xml中连接器的配置 Tomcat8默认为utf-8 Tomcat7及以前的版本为iso8859-1 | |
POST提交 | 请求参数在实体内容 | 看request.setCharacterEncoding() 默认为iso8859-1 必须在任何获取请求参数操作之前设置 |
在产生请求参数乱码时,可以以上原理通过改变表单页面编码、tomcat连接器配置(GET乱码)、设置request.setCharacterEncoding(POST乱码)来解决。
如果因为各种原因,乱码已经产生,此时可以通过手动编解码解决乱码。
注意仅限ios8859-1产生的乱码可以通过这种方式来解决。
String str = new String(??????.getBytes("iso8859-1"),"utf-8") |
EasyMall注册功能 - 获取表单数据实现
举例:
- 实现请求转发
请求转发时javaweb开发中的三种资源跳转方式之一
- 实现请求转发
服务器内部的资源跳转机制 |
一次请求一次响应 |
可以利用request域传递数据 |
浏览器地址栏不会发生变化 |
- 转发的实现
注意,请求转发是服务器内部的资源跳转,目标地址不需要写应用名称
RequestDispatcher dispatcher=request.getRequestDispatcher("/MyServlet05"); dispatcher.forward(request,response); |
简写
request.getRequestDispatcher("/MyServlet05").forward(request,response); |
- 转发注意事项
- 无论转发多少次,只有最后一个资源可以对外输出数据,其他资源的输出在转发时会被清空
- 可以多次转发,但不能循环转发
举例
EasyMall注册功能 - 数据校验功能实现
- 作为域对象使用
request是一个域对象
request域是javaweb开发中四大作用域之一
利用request域可以在转发的过程中传递数据
操作API:
setAttribute(String name,Object obj) | 向域中存入数据 |
getAttribute(String name) | 从域中获取数据 |
removeAttribute(String name) | 删除域中指定数据 |
getAttributeNames() | 获取域中所有属性名组成的枚举 |
特点:
在一次请求范围内有效
请求开始 request对象创建 作用域创建
请求结束 request对象销毁 作用域销毁
在一个请求范围内(转发、包含)共享数据
举例:
EasyMall注册功能 - 数据校验功能实现 - 传递错误消息
请求包含可以将其他资源的输出包含到当前资源中。
包含的实现:
request.getRequestDispacher(path).include(request,response); |
举例:
EasyMall主页通过包含引入头和尾。