request对象包含所有客户的信息,在HTTP协议中,这些信息 是通过header和body传递到服务端
3.1、HTTP 协议参数
-
请求参数是通过字符串传送服务器的
-
请求参数是key-value的模式
-
下列方法可获取参数
- getParameter 获取第一个参数
- getParameterNames 获取所有参数的名称
- getParameterValues 获取所有参数的值
- getParameterMap 获取key-value的map
-
例子
-
比如一个查询条件是 a=hello , 一个post的body入参 a=goodbye&a=world 那么结果参数: a=(hello, goodbye, world)
-
-
path参数只是GET请求独有特性(在HTTP1.1), 他必须通过getRequestURI方法或getPathInfo方法
3.1.1、当参数是可获取的时候
- post 表单提交必须满足如下要求
- 请求是一个HTTP或HTTPS请求
- HTTP的方式是POST
- 内容格式 application/x-www-form-urlencoded
- servlet 对应任何getParameter做参数初始化处理
- 如果不满足上面的要求,那么获取参数只能通过inputStream获取,满足就不能通过inputStream获取
3.2、文件上传
-
servlet容器允许文件上传的,内容格式是multipart/form-data
-
以下任意一个条件被满足,servlet容器按照multipart/form-data格式处理
- 请求被标记@MultipartConfig
- 部署描述符包含multipart-config元素去处理这个请求
-
servlet容器提供multipart/form-data处理功能,那么数据可以通过哪些HttpServletRequest方法获得
-
public Collection getParts()
-
public Part getPart(String name )
-
每个Part都可以获取头部信息、内容信息,以及文件本身的信息,通过方法Part.getInputStream方法
-
-
如果servlet容器并不提供multi-part/form-data处理,那么文件数据可以通过HttpServletRequest.getInputStream
3.3、属性
- 属性对参数一种补充
- 属性servlet之间传递信息(通过RequestDispatcher)
- 获取和设置属性的接口和方法如下ServletRequest
- getAttribute
- getAttributeNames
- setAttribute
- 还一点与参数不同地方,属性值只能与一个属性名关联。
- 在属性key命名时候,推荐遵循java包命名方法,不用使用java或oracle,sun开头保留
3.4、请求头
- 获取请求头方法(HttpServletRequest)
- getHeader
- getHeaders
- getHeaderNames
- 一个header的name 可以对应多个值, 如果获取第一个header值可通过getHeader方法获取,如果获得所有的值可以通过getHeaders,
- header还提供一些格式转换的方法
- getIntHeader 将获取字符串转换成int类型 (转换不成功将会抛出 NumberFormatException)
- getDateHeader 将获取字符串转换成date类型(转换不成功,将会抛出IllegalArgumentException)
3.5、请求路径参数
-
Request URI路径
- Context Path (上下文路径) 以/开头
- Servlet Path (Servlet路径) mapping确定的部分
- PathInfo 信息 不能确定的uri部分 ,可以是null
-
获取这些信息可以通过如下方法获取
- getContextPath
- getServletPath
- getPathInfo
-
总体来说 requestURI = contextPath + servletPath + pathInfo
-
配置
-
Context Path /catalog Servlet Mapping Pattern: /lawn/* 处理uri通配符 Servlet: LawnServlet 处理Servlet Servlet Mapping Pattern: /garden/* Servlet: GardenServlet Servlet Mapping Pattern: *.jsp Servlet: JSPServlet 例子
-
Request Path(请求路径) Path Elements(路径元素) /catalog/lawn/index.html ContextPath: /catalog ServletPath: /lawn PathInfo: /index.html /catalog/garden/implements ContextPath: /catalog ServletPath: /garden PathInfo: /implements /catalog/help/feedback.jsp ContextPath: /catalog ServletPath: /help/feedback.jsp PathInfo: null
3.6、路径转换方法
- 获取特定位置路径位置
- ServletContext.getRealPath 真实文件路径(本地文件系统)也有可能返回null
- HttpServletRequest.getPathTranslated 获取真实文件路径的pathInfo信息
3.7、非阻塞IO
- 异步请求提高服务扩展能力,那么什么时候可以获取到结果,所有需要注册回调或监听器
- ReadListener ( 读取监听器)
- onDataAvailable() 数据读取准备好(ServletInputStream), 容器会调用这个方法
- onAllDataRead() 数据读取完毕, (ServletRequest)
- onError(Throwable t) 处理过程发生异常,都会调用这个方法
- 除了ReadListener, 还有一些相关的方法添加到ServletInputStream
- boolean isFinished() ServletInputStream 的请求数据被读取完成
- boolean isReady() 数据是否准备好
- void setReadListener(ReadListener listener) 只能异步使用,其它同步使用抛出IllegalStateException
3.8、Cookies
- 客户端缓存数据,key-value
- HttpOnly 标识cookies 暗示不希望暴露到客户端脚本使用,减少跨域攻击
3.9、SSL属性
-
支持安全属性传输,必须暴露如下参数给servlet
-
属性 属性名称 java类型 cipher suite javax.servlet.request.cipher_suite String bit size of the algorithm javax.servlet.request.key_size Integer SSL session id javax.servlet.request.ssl_session_id String 如果是证书验证的,需要属性 java.security.cert.X509Certificate
3.10、国际化
- 使用 Accept-Language 客户接受语言
- ServletRequest接口
- getLocale
- getLocales
##3.11、请求数据编码
- 默认数据编码 是 ISO-8859-1
- 如果没有设置数据编码,那么调用getCharacterEncoding方法返回null
- 当然在解析数据之前需要调用setCharacterEncoding(String enc)
3.12、Request的生命周期
- 请求对象在servlet服务期间不会被回收,比如service和doFilter(过滤)方法,如果异步的话会调用startAsync 到 complete 完成整个过程,除此之外不要在非request的scope(域)内调用startAsync,可以引起不确定结果