request对象和response对象的原理
通过url访问资源的大概过程,如下
我们需要注意
- request和response对象是由服务器创建的。我们只是来使用它
- request对象是来获取请求消息的,response对象是来设置响应消息的
request对象的继承体系
RequestFacade类实现了ServletRequest接口,而ServletReques接口继承了ServletRequest接口
Request对象的功能
1、获取请求消息中的数据
(1)获取请求行的数据(标黄的重点掌握)
① 获取请求方式的方法
String getMethod( )
② 获取虚拟目录的方法
String getContextPath
③ 获取Servlet路径的方法
String getServletPath( )
④ 获取get方式的请求参数的方法
String getQueryString( )
⑤ 获取请求URI的方法
String getRequestURI( )
得到的是:/虚拟目录/资源目录
⑥ 获取请求URL的方法
StringBuffer getRequestURL( )
得到的是:http://ip地址/虚拟目录/资源目录
⑦ 获取协议及其版本信息的方法
String getProtocol( )
⑧ 获取客户机IP地址的方法
String getRemoteAddr( )
(2)获取请求头的数据
① String getHeader(String name)
通过请求头的名称获取请求头的值注意这里面的请求头名称的参数是不区分大小写的
② Enumeration<String> getHeaderNames( )
这个返回值类型类似于迭代器
获取所有的请求头名称
(3)获取请求体的数据
请求体重只有post请求方式,才有请求体,在请求体中封装了post请求的请求参数
想要获取请求体中的数据,需要完成两个步骤:
首先获取流对象,流对象有两种获取方式:
① BufferedReader getReader()
获取字符输入流,只能操作字符数据
② ServletInputStream getInputStream
获取字节输入流,可以操作所有类型,也可以操作字符,但是没有字符流高效
最后从流对象中拿去数据
2、其他功能
获取请求参数的通用方法
无论是get还是post的方法都能用通用方法获取,注意只有在form的表单中的input里面用name然后将name传入以下的方法的参数当中,才能够获取到值
① String getParameter(String name)
根据参数名称获取参数值
② String[ ] getParameterValues(String name)
根据参数名称获取参数的数组,用于解决参数相同值不相同的情况
③ Enumeration<String> getParameterNames( )
获取所有请求参数的名称
④ Map<String, String[ ] > getParameterMap()
获取所有参数的map集合
注意乱码问题:
在tomcat8中已经解决get方式的乱码问题,但如果是post的方式的话我们需要在设置参数前指定编码
如下
请求转发
我们可以把请求转发理解为一种在服务器内部的资源跳转方式
步骤:
① 通过request对象获取请求转发器对象
RequestDispathcer getRequestDispatcher(String path)
② 使用RequestDispatcher对象来进行转发
forward(ServletRequest request,ServletResponse response)
举例说明
建议使用第二种链式编程的方式
重点 转发的特点:
- 浏览器地址栏不会发生变化
- 只能转发到当前服务器内部的资源中
- 转发是一次请求
共享数据
什么是域对象?
域对象是一个由作用范围的对象,可以在范围内共享数据
request域的范围有多大?
代表一次请求的范围,一般用于请求转发的多个资源中共享数据使用
方法如下:
① void setAttribute(String name,Object obj)
用于存储数据
② Object getAttitude(String name)
通过键获取值
③ void removeAttribut(String name)
通过键移除键值对
获取ServletContext
ServletContext getServletContext()
暂不详细介绍,后面专门介绍