三、Response、ServletContext
1、Response对象的功能
-
设置响应消息
-
设置响应行 HTTP/1.1 200 ok
设置状态码 : setStatus(int sc)
-
设置响应头:setHeader(String name,String value)
-
设置响应体:
- 获取输出流:
- 字符输出流:PrinterWriter getWriter()
- 字节输出流:ServletOutputStream getOutputStream()
- 使用输出流将数据输出到客户端浏览器
- 获取输出流:
-
2、重定向
-
重定向功能是根据设置状态码和设置响应头组合完成
-
重定向和请求转发一样都是资源跳转的一种方式
-
重定向的特点:
- 浏览器地址栏发生改变
- 重定向可以访问其他站点的资源,不局限服务器内部资源
- 重定向是两次请求
-
步骤:
-
通过response对象设置相应状态码 setStatus(302)
-
再通过response对象设置响应头指明要重定向的地址 setHeader(“location”,String path)
//方式一:使用两个方法 //1.设置相应状态码为302 resp.setStatus(302); //2.设置响应头location的值为要跳转的资源目录 resp.setHeader("location","/web/responseRedirect");
-
使用sendRedirect(String path)方法对上述代码进行简化
//方式二:使用 sendRedirect(String path) 该方法内部实现依然是方式一 resp.sendRedirect("/web/responseRedirect"); //对方式二的改进 //上述两种方式都将要跳转的虚拟目录(/web)写死了,不便于后期的维护,我们可以动态获取 String path = req.getContextPath(); resp.sendRedirect(path + "/responseRedirect");
-
3、设置相应体数据
-
输出字符数据到浏览器 PrintWriter getWriter() :获取字符输出流,只能输出字符数据
/** * 向浏览器输出数据 */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("responseInit........"); //0.在获取输出流之前要设置编码(根据响应头content-type设置) // resp.setHeader("content-type","text/html;charset=UTF-8"); //简化方式,response提供了简单的方式 resp.setContentType("text/html;charset=UTF-8"); //1.获取输出流 getWriter(); 默认获取的输出流编码为iso的 PrintWriter respWriter = resp.getWriter(); //2.向页面写出数据 write(String data) respWriter.write("你好,response"); }
-
输出字节数据到浏览器 ServletOutputStream getOutputStream() : 获取字节输出流
//1.获取字节输出流 ServletOutputStream getOutputStream() ServletOutputStream respOutputStream = resp.getOutputStream(); //2.向页面返回数据 respOutputStream.write("你好中国".getBytes());
-
注意:一个response对象只能获取一种输出流,不能既获取字符输出流,又获取字节输出流
4、ServletContext对象
-
概念:代表真个web应用,可以和程序的容器(服务器)通信,(又称Application对象)
-
获取:
-
通过request对象获取
//方式一:request.getServletContext(); ServletContext reqContext = req.getServletContext();
-
通过HttpServlet对象获取
//方式二:通过HttpServlet获取 getServletContext(); ServletContext servletContext = this.getServletContext();
-
-
ServletContext对象的功能:
-
获取MIME类型:
-
MIME类型:在互联网通信过程中定义的一种文件数据类型
- 格式: 大类型/小类型 text/html image/jpg
-
获取MIME类型:String getMimeType(String fileName)
String filename = "图片.jpg"; String type = servletContext.getMimeType(filename);
-
-
ServletContext域对象:共享数据
- void setAttribute(String key,Object value) : 向域中存放数据
- Object getAttribute(String key) : 根据key获取域中数据
- void removeAttribute(String key) : 根据key删除指定的key-value
- ServletContext对象的范围:所有用户所请求的数据
-
获取文件的真实(服务器)路径 String getRealPath(String path)
//获取resources目录下的资源路径 String resPath = servletContext.getRealPath("res.txt"); System.out.println(resPath); //获取WEB-INF下的资源路径 String webPath = servletContext.getRealPath("/WEB-INF/webInf.txt"); System.out.println(webPath);
-
5、文件下载
-
超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框
-
要求:无论是哪种资源,都必须弹出现在提示框
-
示例:
<a href="/web/img/Servlet.png">该图片能够被浏览器解析,直接在页面上展示</a> <hr> <a href="/web/download?filename=Servlet.png">弹出下载提示框的图片</a>
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.获取文件名称 String filename = req.getParameter("filename"); System.out.println(filename); //2.根据文件名称找到该文件在服务器的真实路径 ServletContext context = this.getServletContext(); String realPath = context.getRealPath("/img/" + filename); System.out.println(realPath); //3.根据获取的真实路径,将资源加载进内存 FileInputStream inputStream = new FileInputStream(realPath); BufferedInputStream bis = new BufferedInputStream(inputStream); //4.获取response字节输出流,将内存中的文件通过response的输出流输出到页面上 //设置response的响应头 content-type 和 content-disposition //获取filename的MIME类型 String mimeType = context.getMimeType(filename); resp.setHeader("content-type",mimeType); //设置相应头的打开方式 resp.setHeader("content-disposition","attachment;filename=" + filename); ServletOutputStream ros = resp.getOutputStream(); byte[] buff = new byte[1024]; int len; while ((len = bis.read(buff)) != -1){ ros.write(buff,0,len); } bis.close(); }
-
中文文件名乱码问题:
-
每个浏览器的设置文件名时都不一样,我们要根据浏览器,设置不同文件名编码,所以我们要使用到user-agent这个请求头
//解决中文文件名问题 //1.获取user-agent请求头 String agent = request.getHeader("user-agent"); //2.使用工具类方法编码文件名即可 filename = DownLoadUtils.getFileName(agent, filename);
-
util工具类示例:
public class DownLoadUtils { public static String getFileName(String agent, String filename) throws UnsupportedEncodingException { if (agent.contains("MSIE")) { // IE浏览器 filename = URLEncoder.encode(filename, "utf-8"); filename = filename.replace("+", " "); } else if (agent.contains("Firefox")) { // 火狐浏览器 BASE64Encoder base64Encoder = new BASE64Encoder(); filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else { // 其它浏览器 filename = URLEncoder.encode(filename, "utf-8"); } return filename; } }
-