写在前面:
状态码
200成功 | 302重定向 | 304读缓存 | 404路径错误 | 405没有doxxx方法 | 500服务器错误 |
响应头
content-type 文件格式和编码 | content-disposition 响应体的打开方式 in-line 直接打开 attachment 附件形式打开 |
设置响应行、头、体
setStatic | setHeader | getWriter / getOutputStream / .write |
设置编码:response.setContentType("text/html;charset=utf-8")
重定向:response.sendRedirect(uri)
ServletContext
getServletContext() | getMimeType(文件名) getRealPath(/文件路径) |
1. 响应消息数据格式
数据格式:
响应行:协议 版本 状态码 状态码描述
响应头:头名称:头值
响应空行
响应体:页面内容
状态码:
1xx :没有接收完成
2xx :成功 -----代表:200
3xx :重定向 -----302重定向;304访问缓存(服务器让浏览器访问本地缓存)
4xx :客户端错误 -----404路径错误;405请求方式没有对应的doxxx方法
5xx :服务端错误 -----500服务器内部异常
常见响应头:
content-type:响应体的数据格式和编码格式
content-disposition:以什么格式打开响应体的数据(默认in-line在当前页面打开,attachment以附件形式打开)
设置响应消息:
响应行:setStatic(int) 状态码
响应头:setHeader(name,value)
响应体:获取输出流,用输出流将数据输出到浏览器 getWriter / getOutputStream / xxx.write("xxxxx")
流不用手动关闭和刷新,request和response关闭时会自动执行
编码:
tomcat默认编码:ISO-8859-1
获取流之前设置编码:response.setCharacterEncoding()
并告诉浏览器,服务器使用的编码,并建议浏览器使用该编码方式解码:(就不用设置编码格式了)
response.setHeader("content-type", "text/html;charset=utf-8");
简单写法:response.setContentType("text/html;charset=utf-8");
2. 重定向
资源跳转的一种方式
浏览器请求Servlet1,Servlet1返回响应302和Servlet2的资源路径,浏览器去请求Servlet2,Servlet2给出响应
特点:地址栏改变;可访问外部服务器;两次请求(不能使用request域共享对象)
代码:response.sendRedirect(uri)
3. ServletContext
代表整个web应用,可以和服务器通信
获取对象:
request.getServletContext();
this.getServletContext();
功能:
获取文件的MIME类型:getMimeType(文件名称带后缀)
作为域对象,共享数据:域范围是所有用户请求的数据
获取文件的真实路径(tomcat下的路径):getRealPath(文件路径)
文件路径写法:
web目录下:/xx
web-inf下:/WEB-INF/xx
src下:/WEB-INF/classes/xx
补充:ClassLodar只能加载src下的文件
MIME类型:
在互联网通信中定义的一种文本数据类型,格式:大类型/小类型
例如:text/html 、application/json JSON格式
4. 路径写法
相对路径:
首先要确定当前资源和目标资源的相对位置
以 . 开头
./ 当前目录
../ 上级目录
绝对路径:
以 / 开头
判断这个资源是给谁用的:给浏览器用--加虚拟目录;给服务端用--不加虚拟目录
虚拟目录用request动态获取
5. 案例:文件下载
@WebServlet("/myservlet03")
public class MyServlet03 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//获取要下载的文件名
String name = request.getParameter("name");
//获取真实路径和mime类型
ServletContext servletContext = request.getServletContext();
String path="/"+name;
if(name.contains(".jpg")){//jpg文件在web的img文件夹下
path="/img/"+name;
}
String relPath = servletContext.getRealPath(path);
String mimeType=servletContext.getMimeType(name);
//解决中文文件名问题
String header = request.getHeader("user-agent");
name=DownLoadUtils.getFileName(header,name);
//设置文件类型、文件打开方式
response.setHeader("content-type",mimeType);
response.setHeader("content-disposition","attachment;filename="+name);
//读取文件到输出流
ServletOutputStream os = response.getOutputStream();
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(relPath));
byte[] bytes=new byte[1024];
int len;
while ((len=bis.read(bytes)) != -1){
os.write(bytes,0,len);
}
bis.close();
}
}
//html
<a href="http://localhost:8080/test04_war_exploded/myservlet03?name=1.jpg" target="_blank" name="file">超链接:文件下载</a>