1. response
- 作用:往浏览器写东西
- 组成部分:响应行 响应头 响应体
1.1 操作响应行
格式:协议/版本 状态码 状态码说明
状态码:
1xx:已发送请求
2xx:已完成响应
200:正常响应
3xx:还需浏览器进一步操作
302:重定向 配合响应头:location
304:读缓存
4xx:用户操作错误
404:用户操作错误.
405:访问的方法不存在
5xx:服务器错误
500:内部异常
常用方法:
setStatus(int 状态码):针对于 1 2 3
sendError(int 状态码):针对于 4xx和5xx
1.2 操作响应头
格式:key/value(value可以是多个值)
1.2.1 常用的方法:
setHeader(String key,String value):设置字符串形式的响应头
了解:setIntHeader(String key,int value):设值整形的响应头
了解:setDateHeader(String key,long value):设值时间的响应头
addHeader(String key,String value):添加置字符串形式的响应头 之前设置过则追加,若没有设置过则设置
了解:addIntHeader(String key,int value):添加整形的响应头
了解:addDateHeader(String key,long value):添加时间的响应头
1.2.2 常用的响应头:
- location:重定向
- refresh:定时刷新
- content-type:设置文件的mime类型,设置响应流的编码及告诉浏览器用什么编码打开
- content-disposition:文件下载
重定向:
方式1:
★response.sendRedirect("/day10/loc2");
方式2:
response.setStatus(302);
respooen.setHeader("location","/day10/loc2");
定时刷新:
方案1:设置头 refresh
respooen.setHeader("refresh","秒数;url=跳转的路径");
方案2:http的meta标签
<meta http-equiv="refresh" content="3;url=/day10/refresh2.html">
1.3 操作响应体:页面上要展示的内容
1.3.1 常用方法:
Writer getWriter():字符流
ServletOutputStream getOutputStream() :字节流
自己写的东西用字符流,其他一概用字节流.
1.3.2 处理响应中文乱码:
方式1:★
response.setContentType("text/html;charset=utf-8");
方式2:理解
response.setHeader("content-type", "text/html;charset=utf-8");
注意:
两个流互斥
当响应完成之后,服务器会判断一下流是否已经关闭,若没有关闭,服务器会帮我们关闭.(底层使用的缓冲流)
文件下载
设置文件的mime类型
String mimeType=context.getMimeType(文件名) response.setContentType(mimeType);
设置下载头信息 content-disposition
response.setHeader("content-disposition", "attachment;filename="+文件名);
提供流
response.getOutputStream();
文件名乱码
String filename = request.getParameter("name"); filename = new String(filename.getBytes("iso8859-1"), "utf-8");
扩展:使用commons-io工具类
//方式3 使用工具类编码
String _filename = DownLoadUtils.getName(request.getHeader("user-agent"), filename);
response.setHeader("content-disposition","attachment;filename="+_filename );
对拷流:IOUtils.copy(is,os);
实例代码
String filename = request.getParameter("name");
//注意中文乱码
filename = new String(filename.getBytes("iso8859-1"), "utf-8");
ServletContext context = this.getServletContext();
context.getMimeType(filename);
InputStream is = context.getResourceAsStream("/download/"+filename);
//获取输出流
ServletOutputStream os = response.getOutputStream();
IOUtils.copy(is,os);
os.close();
is.close();
2. request(请求)
- 作用:获取浏览器发送过来的数据
- 组成部分:请求行 请求头 请求体
2.1 操作请求行
- 格式:请求方式 请求资源 协议/版本
2.1.1 常用方法:HttpServletRequest
掌握
String getMethod():获取请求方式
String getRemoteAddr():获取ip地址
String getContextPath() :在java中获取项目名称 (/day10)
了解:
getRequestURI():获取的是 从项目名到参数之前的内容 /day10/regist
getRequestURL():获取的带协议的完整路径 http://localhost/day10/regist
String getQueryString():get请求的所有参数 username=tom&password=123
String getProtocol():获取协议和版本
例如:请求行
GET /day10/row?username=tom&password=123 HTTP/1.1
2.2 操作请求头
- 格式:key/value(value可以是多个值)
2.2.1 常用方法:
String getHeader(String key):通过key获取指定的value (一个)
了解:
Enumeration getHeaders(String name) :通过key获取指定的value(多个)
Enumeration getHeaderNames() :获取所有的请求头的名称
int getIntHeader(String key):获取整型的请求头
long getDateHeader(String key):获取时间的请求头
2.2.2 重要的请求头:
user-agent:浏览器内核 msie firefox chrome
referer:页面从那里来 防盗链
2.3 操作请求参数
username=tom&password=123&hobby=drink&hobby=sleep
2.4 常用方法:
String getParameter(String key):获取一个值
String[] getParameterValues(String key):通过一个key获取多个值
Map<String,String[]> getParameterMap():获取所有的参数名称和值
2.3 请求的中文乱码:
- 对于get请求:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码
- 对于post请求,参数是放在请求体中,服务器获取请求体的时候使用iso-8859-1解码,也会出现乱码
2.3.1 通用的方法:
new String(参数.getBytes("iso-8859-1"),"utf-8");
针对于post请求来说:只需要将请求流的编码设置成utf-8即可
request.setCharacterEncoding("utf-8");
处理中文响应乱码
response.setContentType("text/html;charset=utf-8");
3. 域对象:
3.1 request:
- 创建:一次请求来的时候
- 销毁:响应生成的时候
- 作用:一次请求里面的数据
请求转发(请求链,请求串)
request.getRequestDispatcher("内部路径").forward(request,response);
4. 封装对象:apache提供的一个工具类,BeanUtils
- 封装数据
使用步骤:
- 导入jar包(commons-beanutils-1.8.3.jar)
调用 BeanUtils.populate(Object bean,Map<> 参数);
BeanUtils.populate(user, request.getParameterMap());
请求转发和重定向区别:
重定向发送两次请求,请求转发一次请求
重定向地址栏发生改变,请求转发不变
重定向是从浏览器发送,请求转发是服务器内部
重定向不存在request域对象,请求转发可以使用request域对象
重定向是response的方法,请求转发是request的方法
重定向可以请求站外资源,请求转发不可以,如跳转到银行页面
request.getRequestDispatcher("/内部路径").forward(request,response);