Request,Response和ServletContext
request和response对象是由服务器创建的,我们只是使用,request对象是来获取请求消息,response对象是来设置响应消息
request继承原理
- ServletRequest –接口(继承HttpServletRequest)
- HttpServletRequest –接口(实现org.apache.catalina.connector.RequestFacade)
- org.apache.catalina.connector.RequestFacade –类(tomcat)
获取请求消息数据功能
获取请求行数据
- 格式:GET /day01/test1?name=lisi HTTP/1.1
- 方法:
- 获取请求方式:GET
- String getMethod()
- 获取虚拟目录:**/day01**
- String getContextPath()
- 获取Servlet路径:**/test1**
- String getServletPath()
- 获取get方式请求参数:name=lisi
- String getQueryString()
- 获取请求URI(统一资源标识符):/day01/test1
- String getRequestURI()
- 获取请求URL(统一资源定位符):http://localhost/day01/test1
- StringBuffer getRequestURL()
- 获取协议及版本:HTTP/1.1
- String getProtocol()
- 获取客户机IP地址:
- String getRemoteAddr()
- 获取请求方式:GET
获取请求头数据
- 方法:
- 通过请求头的名称获取请求头:
- String getHeader(String name)
- 获取所有的请求头名称:
- Enumeration
getHeaderNames() 1
2
3
4
5
6
7
8// 获取所有请求头名称
Enumeration<String> headerNames = request.getHeaderNames();
// 遍历
while(headerNames.hasMoreElements()){
String name = headerNames.nextElement();
//根据名称获取请求头
String value = request.getHeader(name);
}
- Enumeration
- 通过请求头的名称获取请求头:
获取请求体数据
- 只有POST请求方式才有请求体
- 步骤:
- 获取流对象
- 获取字符输入流:BufferedReader getReader(),只能获取字符数据
- 获取字节输入流:ServletInputStream getInputStream(),可以操作所有类型数据
- 从流对象中拿数据
- 获取流对象
其他功能
获取请求参数(GET和POST通用)
- 根据参数名称获取参数值:
- String getParamenter(String name)
- 根据参数名称获取参数值的数组
- String[] getParamenterValues(String name)
- 获取所有请求的参数名称
- Enumeration
getParamenterNames()
- Enumeration
- 获取所有参数的Map集合
- Map<String,String[]> getParamenterMap()
- 中文乱码问题
- get方式:tomcat8解决了中文乱码方式
- post方式:会有乱码
- 需要设置字符集为:request.setCharacterEncoding(“utf-8”)
请求转发
- 一种在服务器内部的资源跳转方式
- 步骤:
- 通过request对象获取请求转发器对象
- RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象进行转发
- forword(ServletRequest request,ServletResponse response)
- 通过request对象获取请求转发器对象
共享数据
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
- 存储数据
- void setAttribute(String name,Object obj)
- 通过键获取值
- object getAttribute(String name)
- 通过键移除键值对
- void removeAttribute(String name)
- 存储数据
获取ServletContext
- 获取
- ServletContext getServletContext()
BeanUtils技术
导入jar包:
注意:出现java.lang.ClassNotFoundException时
- 需要把beanutils.jar包和logging.jar包放到Tomcat的\WEB-INF\lib目录下面
1 |
|
- 用于封装JavaBean的
- JavaBean:标准的Java类
- 要求:
- 类必须被public修饰
- 必须提供空参的构造器
- 成员变量必须使用private修饰
- 提供公共的setter和getter方法
- 功能:封装数据
- 要求:
- 概念:
- 成员变量:定义在类下面被修饰符修饰的变量
- 属性:setter和getter方法截取后的产物
- JavaBean:标准的Java类
- 方法:
- 设置属性值
- void setProperty(Object obj,String name,String value)
- 获取属性值
- String getProperty(String name)
- 将map集合的键值对信息,封装到相应的JavaBean对象中
- void popular(Object obj,Map<String, String[]> map)
- 设置属性值
Response对象
- 功能:设置响应消息
设置响应行
- 格式:HTTP/1.1 200 OK
- 设置状态码:setStatus(int sc)
设置响应头
- response.setHeader(String name,String value)
设置响应体
- 使用步骤:
- 获取输出流
- 首先设置字符编码:response.setContentType(“text/html;charset=utf-8”)
- 字符输出流:PrintWriter getWriter(),只能获取字符数据
- 字节输出流:ServletOutputStream getOutputStream(),可以操作所有类型数据
- 使用输出流,将数据输出到客户端浏览器
- 获取输出流
重定向和转发
转发特点:forward
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中
- 转发是一次请求
重定向特点:redirect
- 浏览器地址栏路径发生变化
- 可以访问其他站点(服务器)资源
- 重定向是两次请求,不能使用request对象来共享数据
1
2
3
4
5
6
7// 设置状态码为302
resp.setStatus(302);
// 设置响应头location
resp.setHeader("location","req.getContextPath()+/demo2");
// 简单使用的重定向方法
resp.sendRedirect("/00_Test/demo2");
路径写法
- 相对路径:通过相对路径不可以确定唯一资源
- ./index.html
- 不以 / 开头,以 . 开头
- 规则:找到当前资源和目标资源之间的相对位置关系
- 绝对路径:通过绝对路径可以确定唯一资源
- /day01/demo1
- 以 / 开头
- 规则:
- 给客户端浏览器使用:需要加虚拟目录(项目路径)
- 虚拟目录使用:request.getContextPath()动态获取
- 给服务器使用:不需要加虚拟目录
- 给客户端浏览器使用:需要加虚拟目录(项目路径)
ServletContext对象
概念:代表整个web应用,可以和程序的容器(服务器)来通信
获取
- 通过request对象获取
- request.getServletContext()
- 通过HTTPServlet获取
- this.getServletContext()
功能
获取MIME类型
- MIME类型:在互联网通信过程中定义的一种文件数据类型
- 格式:大类型/小类型
- text/html image/jpeg
- 获取:String getMimeType(String file)
域对象:共享数据
- setAttribute(String name,Object value)
- getAttribute(String name)
- removeAttribute(String name)
- ServletContext对象范围:所有用户所有请求的数据
获取文件的真实(服务器)路径
- 方法:String getRealPath(String path)