Request 和 Response 对象的作用
Request 对象:客户端和服务器通信时获取请求消息
Response 对象:客户端和服务器通信时设置相应消息
Request 和 Response 对象的体系结构
Request 对象体系结构:
ServletRequest – 接口
| 继承
HttpServletRequest – 接口
| 实现
org.apache.catalina.connector.RequestFacade – 类(tomcat)
Response 对象体系结构:
ServletResponse – 接口
| 继承
HttpServletResponse – 接口
| 实现
org.apache.catalina.connector.ResponseFacade – 类(tomcat)
Request 对象的功能
获取请求消息数据
GET /day14/demo1?name=zhangsan HTTP/1.1
(1)获取请求行数据
-
获取请求方式 :GET
String getMethod()
-
(*)获取虚拟目录:/day14
String getContextPath()
-
获取Servlet路径:/demo1
String getServletPath()
-
获取get方式请求参数:name=zhangsan
String getQueryString()
-
(*)获取请求URI(统一资源标识符): /day14/demo1
String getRequestURI()
-
(*)获取请求 URL(统一资源定位符): http://localhost/day14/demo1
StringBuffer getRequestURL()
-
获取协议及版本:HTTP/1.1
String getProtocol()
-
获取客户机的IP地址:
String getRemoteAddr()
(2)获取请求头数据
- (*)String getHeader(String name): 通过请求头的名称获取请求头的值
- Enumeration getHeaderNames(): 获取所有的请求头名称
(3)获取请求体数据步骤
-
获取流对象
-
获取字符输入流,只能操作字符数据
BufferedReader getReader()
-
获取字节输入流,可以操作所有类型数据
ServletInputStream getInputStream()
-
-
再从流对象中拿数据
其他功能
(1)获取请求参数通用方式
-
根据参数名称获取参数值
String getParameter(String name)
-
根据参数名称获取参数值的数组
String[] getParameterValues(String name)
-
获取所有请求的参数名称
Enumeration<String> getParameterNames()
-
获取所有参数的map集合
Map<String,String[]> getParameterMap()
中文乱码问题:
(1) get方式:tomcat 8 已经将get方式乱码问题解决了
(2) post方式:会乱码,在获取参数前,设置request的编码
request.setCharacterEncoding("utf-8")
;
同样的,当服务器向浏览器输出数据时,也出现乱码现象,可以在获取流之前设置编码response.setContentType("text/html;charset=utf-8");
(2)请求转发
转发的步骤:
-
通过request对象获取请求转发器对象:
RequestDispatcher getRequestDispatcher(String path)
-
使用RequestDispatcher对象来进行转发:
forward(ServletRequest request, ServletResponse response)
转发的特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中。
- 转发是一次请求,可以使用request对象来共享数据
(3)共享数据
几个重要的概念:
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request 域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
相关方法:
- 存储数据:
void setAttribute(String name,Object obj)
- 通过键获取值:
Object getAttitude(String name)
- 通过键移除键值对:
void removeAttribute(String name)
(4)获取 ServletContext 对象(下文具体介绍 ServletContext 对象)
ServletContext getServletContext()
Response 对象的功能
设置相应消息
(1)设置响应行
HTTP/1.1 200 ok
设置状态码:setStatus(int sc)
(2)设置响应头
setHeader(String name, String value)
(3)设置响应体步骤
-
获取输出流
字符输出流:PrintWriter getWriter()
字节输出流:
ServletOutputStream getOutputStream()
-
使用输出流,将数据输出到客户端浏览器
重定向
重定向实现步骤:
//1. 设置状态码为302
response.setStatus(302);
//2.设置响应头location
response.setHeader("location","/day15/responseDemo2");
//简单的重定向方法
response.sendRedirect("/day15/responseDemo2");
重定向特点:
- 地址栏发生变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是两次请求。不能使用request对象来共享数据
ServletContext 对象
ServletContext 对象代表整个 web 应用,可以和程序的容器(服务器)来通信
1.获取方式
- 方式一:通过 request 对象获取
request.getServletContext();
- 方式二:通过HttpServlet获取
this.getServletContext();
2.功能
-
获取MIME类型
String getMimeType(String file)
MIME类型:在互联网通信过程中定义的一种文件数据类型
格式: 大类型/小类型 例 :text/html,image/jpeg
-
域对象:共享数据
setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)
-
获取文件的真实(服务器)路径
String getRealPath(String path)
//web目录下资源访问
String b = context.getRealPath("/b.txt");
//WEB-INF目录下的资源访问
String c = context.getRealPath("/WEB-INF/c.txt");
//src目录下的资源访问
String a =context.getRealPath("/WEBINF/classes/a.txt");
路径写法规则
判断定义的路径是给谁用的,给客户端浏览器使用需要加虚拟目录,给服务器使用不需要加虚拟目录,虚拟目录建议动态获取:request.getContextPath()