http工作流程,以及包含的内容
- 建立连接
- 发送请求 request
- 响应 response
- 关闭连接
对容器的支持
- 通信
- 生命周期
- 多线程
- 安全性
- JSP支持
servlet的生命周期
- 加载到容器,进行实例化
- 初始化init方法
- servlet每次请求到达
- destroy( )
设置MIME类型,告诉浏览器我们要响应的类型
默认为ISO-885-1
设置charset=utf-8,表示浏览器解析内容采用utf-8格式
response.setContentType("类型")
类似于,封装起来了
response.setHeader("Content-Type","text/html;charset=utf-8")
设置传输时的编码集
response.setCharacterEncoding("utf-8")
常见的MIME类型
超文本标记语言文本 | .htm,.html | text/html |
---|---|---|
普通文本 | .txt | text/plain |
RTF文本 | .rtf | application/rtf |
GIF图形 | .gif | image/gif |
JPEG图形 | .ipeg,.jpg | image/jpeg |
au声音文件 | .au | audio/basic |
MIDI音乐文件 | mid,.midi | audio/midi,audio/x-midi |
RealAudio音乐文件 | .ra, .ram | audio/x-pn-realaudio |
MPEG文件 | .mpg,.mpeg | video/mpeg |
AVI文件 | .avi | video/x-msvideo |
GZIP文件 | .gz | application/x-gzip |
TAR文件 | .tar | application/x-tar |
自动刷新功能
response.setHeader("refresh", "5;地址")
控制数据无法缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","No-cache");
设置缓存过期
respons.setHeader("Expires", System.currentTimeMillis()+24*3600*1000)
设置响应头控制浏览器打开下载框
response.setHeader("Content-disponsition","attchment;filename="+"1.jpg")
共同点:两者都不会刷新页面,只在原来的页面上写数据。两个方法都是重写了writer类里面的write方法
write | |
---|---|
可以输出不同数据类型 | 只能操作字符,字符数组,字符串 |
//获取到输出流对象
OutputStream out = response.getOutputStream();
//将字符串变成字节数组
out.write((4+"").getBytes());
图片文件下载案例
//设置响应编码集
resp.setCharacterEncoding("utf-8");
resp.setContentType("image/jpeg");
String imgName = "高圆圆.jpg";
//获取文件要下载的路径,通过上下文对象获取到文件的物理路径
String path = this.getServletContext().getRealPath("/img/高圆圆.jpg");
//设置响应头控制浏览器打开下载框,操作图片中文名字中文显示也要转成字节数组,保持服务器编码一致
resp.setHeader("Content-disposition", "attchment;filename="+new
String(imgName.getBytes("utf-8"),"ISO8859-1"));
//获取到图片的二进制流
//FileReader fr = new FileReader(path);
InputStream in = new FileInputStream(path);
//创建一个二进制流
OutputStream out = resp.getOutputStream();
//创建一个缓冲区
int len = 0;
byte[] by = new byte[1024];
while((len=in.read(by))>0){
out.write(by,0,len);
}
通过字符流操作二进制的文件,有可能出现内容丢失
重定向
- 重定向的状态码是302,表示资源被移走,重新请求新的资源
- 重定向是客户端发起的两次请求。
- 调用sendRedirect方法可以不用设置状态码
//重定向
response.6sendRedirect(“地址”)
//设置代码重定向,前提状态码为302
response.setHeader(“Location”,"地址");
get方法提交
- 地址栏直接输入服务器资源
- 通过js直接访问
- 超链接访问
- request.getParameter(“name属性值”)
post方法提交
1. 主要用于传输数据,客户端向服务器发送数据(文本,二进制)
特征 | GET方法 | POST方法 |
---|---|---|
提交数据类型 | 文本 | 文本、二进制 |
提交数据长度 | 不超过255个字符 | 没有限制 |
提交数据可见性 | 作为url显示 | 作为请求的消息体 |
提交数据缓存 | 缓存历史状态中 | 不会被缓存 |
请求一个静态页面或图形文件时使用get提交
大数据时使用post方法
上传文件时,post方法
> 发送用户名,密码或保密信息时使用post方法
http传送的请求行的内容全部封装到request对象
//得到url地址
request.getRequestURL().toString
//得到urI地址
request.getRequestURI()
//获取到请求附带的参数
request.gerQueryString()
//获取到客户端的ip
request.getRemoteAddr();
//收获到服务器的内容
request.getLocalPort
getRequestDispatcher当前请求派发之后,这个资源将控制权移交给下一个资源
include包含:将其他资源内容包含到本资源中,最终控制权回到servlet
请求派发 | 重定向 |
---|---|
307 | 302 |
服务器端完成的,url不变 | 客户端完成 url要变 |
只能在本服务器 | 可以跨服务器 |
请求只要是页面发送过来的就必须加上工程名字
js提交、超链接、重定向、都要加上项目名字
在请求派发里面/表示当前工程,请求派发默认调用dopost()