HttpServletResponse
service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,
HttpServletResponse是ServletResponse的子接口,功能和方法更加强大
response的运行流程
因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响 应头和响应体
常用操作:
通过response设置响应行
设置响应行的状态码
response.setStatus(302);
通过response设置响应头
①addHeader(String name, String value)
②addIntHeader(String name, int value)
③addDateHeader(String name, long date)
④setHeader(String name, String value)
⑤setDateHeader(String name, long date)
⑥setIntHeader(String name, int value)
其中,add表示添加,而set表示设置
重定向需要:
1.状态码:302
2.响应头:location 代表重定向地址
//重定向 //设置状态吗 response.setStatus(302); //设置响应头Location response.setHeader("Location", "Servlet04");
但是实际开发中不会写这么麻烦,有相应的方法
response.sendRedirect("Servlet04");
延伸:
setHeader()的多种用法
①一秒刷新页面一次 response.setHeader("refresh","1");
②二秒跳到其它页面 response.setHeader("refresh","2;URL=otherPagename");(常用)
③没有缓存:
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
④通知浏览器数据採用的压缩格式:response.setHeader("Content-Encoding","压缩后的数据");
⑤快速浏览器压缩数据的长度:response.setHeader("Content-Length",压缩后的数据.length+"");
⑥快速浏览器图片或视频:response.setHeader("Content-type","这个參数在tomcat里conf下的web.xml里面找");
⑦快速浏览器已下载的形式:response.setHeader("Content-disposition","attachment;filename=2.jpg");
举例:
实现页面跳转
方法一:
response.setHeader("refresh", "5;url=https://www.baidu.com/");
5秒钟后跳转到百度
方法二:
js实现页面跳转
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="jquery-3.2.1.min.js"></script> <script type="text/javascript"> var time=5; var second=null; $(function(){ aaa(); }) function aaa(){ var timer=setInterval(function(){ second=$(".second"); time--; second.html(time); if(time==0){ clearInterval(timer); location.href="https://www.baidu.com/"; } },1000); } </script> </head> <body> 恭喜你注册成功! <span style="color:red" class="second">5</span>秒后跳转,如不跳转请点击 <a herf="https://www.baidu.com/">这里</a> </body> </html>
通过response设置响应体
响应体设置文本
PrintWriter getWriter()
获得字符流,通过字符流的write(String s)方法可以将字符串设置到response缓冲区中,
随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
中文乱码的解决:
response.setContentType("text/html;charset=UTF-8");
详情请见:https://www.cnblogs.com/Ace-suiyuan008/p/9603317.html
响应头设置字节
ServletOutputStream getOutputStream()
获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字 节,在由Tomcat服务器将字节内容组成Http响应返回给浏览器。
传输照片实例:
public class PictureServlet extends HttpServlet { //传输照片 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //明确数据源 String path=getServletContext().getRealPath("WallpaperStudio10-42653.jpg"); //获得输入流 FileInputStream fis=new FileInputStream(path); //明确目的地 ServletOutputStream sos=response.getOutputStream(); //开始复制 int len=0; byte[] bytes=new byte[1024]; while((len=fis.read(bytes))!=-1){ sos.write(bytes,0,len); } //释放资源 fis.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
案例:文件下载
文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端。
所以文件下载需 要IO技术将服务器端的文件使用InputStream读取到,在使用 ServletOutputStream写到response缓冲区中
页面:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>使用服务器端的编码方式实现文件下载</h1> <a href="/WEB004/DownLoadServlet?filename=WallpaperStudio10-42653.jpg">图片</a> <a href="/WEB004/DownLoadServlet?filename=FSCapture.rar">压缩包</a> <a href="/WEB004/DownLoadServlet?filename=你好.txt">文档</a> <a href="/WEB004/DownLoadServlet?filename=MPEG0039.AVI">视频</a> </body> </html>
Servlet:
public class DownLoadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取要下载的文件名称 String filename=request.getParameter("filename"); //request解决中文乱码(要先把中文乱码解决在解决不同浏览器的编码问题) filename=new String(filename.getBytes("ISO8859-1"),"UTF-8"); //获取请求头中的浏览器信息 String agent=request.getHeader("User-Agent"); //复制不同浏览器对文件名编码的代码 String filenameEncoder=""; if (agent.contains("MSIE")) { // IE浏览器 filenameEncoder = URLEncoder.encode(filename, "utf-8"); filenameEncoder = filenameEncoder.replace("+", " "); } else if (agent.contains("Firefox")) { // 火狐浏览器 BASE64Encoder base64Encoder = new BASE64Encoder(); filenameEncoder= "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else { // 其它浏览器 filenameEncoder= URLEncoder.encode(filename, "utf-8"); } //要下载的文件类型--客户端会根据文件的MIME类型区分 response.setContentType(getServletContext().getMimeType(filename)); //告知客户端文件的打开方式(下载) response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder); //获取文件绝对路径 String path=getServletContext().getRealPath("DownLoad/"+filename); //获得该文件的输入流 FileInputStream fis=new FileInputStream(path); BufferedInputStream bis=new BufferedInputStream(fis); //获得文件输出流 ServletOutputStream sos=response.getOutputStream(); BufferedOutputStream bos=new BufferedOutputStream(sos); //复制文件 int len=0; byte[] bytes=new byte[1024]; while((len=bis.read(bytes))!=-1){ bos.write(bytes,0,len); } //释放资源 fis.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
注意:
图片从服务器端传输到浏览器,但浏览器直接解析图片显示在页面上, 而不是提供下载,我们需要设置两个响应头,告知浏览器文件的类型和文件的打开方式。
1)告知浏览器文件的类型:
response.setContentType(文件的MIME类型);
2)告示浏览器文件的打开方式是下载:
response.setHeader("Content-Disposition","attachment;filename=文件名称");
response细节点:
①response获得的流不需要手动关闭,web容器(tomcat容器)会帮助我们关闭,
②getWriter和getOutputStream不能同时调用
重定向语句一般作为终结代码