Java学习之Response篇
Java学习之Response篇
0x00 前言
续上篇文章内容,这篇本章来更新Response。
0x01 Response
常用方法:
setStatus(int sc) : 设置响应状态码
setHeader(String name, String value) 设置响应头
resp.sendRedirect(String Redirect); 302跳转
这里的转发和重定向不一样,来看看两者的区别。
重定向:
1. 地址栏发生变化
2. 重定向可以访问其他站点(服务器)的资源
3. 重定向是两次请求。不能使用request对象来共享数据
转发:
1. 转发地址栏路径不变
2. 转发只能访问当前服务器下的资源
3. 转发是一次请求,可以使用request对象来共享数据
重定向代码:
Response类:
@WebServlet("/response")
public class Response extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setStatus(302);
resp.setHeader("location","/demo1");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
ServletDemo类:
@WebServlet("/demo1")
public class ServeletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("已跳转");
resp.sendRedirect("http://www.baidu.com");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
writer方法使用:
@WebServlet("/response")
public class Response extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("gbk"); //设置编码
PrintWriter writer = resp.getWriter(); //获取输出对象
writer.write("response");//输出内容
writer.println("1235");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
输出字节流
ServletOutputStream outputStream = resp.getOutputStream();
outputStream.write("abc".getBytes());
0x02 ServletContext
ServletContext: 代表整个web应用,可以和程序的容器(服务器)来通信
常用方法:
request.getServletContext(); : 通过request对象获取
this.getServletContext(); : 通过HttpServlet获取
String getMimeType(String file) : 获取MIME对象
域对象:共享数据
1. setAttribute(String name,Object value)
2. getAttribute(String name)
3. removeAttribute(String name)
获取文件的真实(服务器)路径:
String getRealPath(String path)
文件下载小案例:
编写一个html页面,里面写一个超链接对图片进行下载。
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>downlaod</title>
</head>
<body>
<a href="/demo/img/1.jpg">图片查看</a>
<a href="downloadServlet?filename=1.jpg">图片下载</a>
</body>
</html>
downloadSerlet类:
@WebServlet("/downloadServlet")
public class downloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename = request.getParameter("filename"); //接收filename传参的值
ServletContext servletContext = this.getServletContext(); //创建servletContext 对象
String Path = servletContext.getRealPath("/img/" + filename); //获取文件真实路径
String mimeType = servletContext.getMimeType(filename);//获取mimel类型
FileInputStream fis = new FileInputStream(Path); //路径参数文件输入流对象中
response.setHeader("content-type",mimeType); //响应头设置mime类型
response.setHeader("content-disposition","attachment;filename="+filename); //设置为附件类型
ServletOutputStream outputStream = response.getOutputStream(); //获取文件输出流
byte[] buff = new byte[1024]; //设置每次读取的字节大小
int len =0;
while ((len = fis.read(buff))!=-1){
outputStream.write(buff,0,len);
}
}
}
这里简单的一个案例就完成了。
0x03 结尾
这里的几个内容无非就是几个方法的一个使用,这就体现了Java面向对象语言的强大。