博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HttpServletResponse
阅读量:4982 次
发布时间:2019-06-12

本文共 5153 字,大约阅读时间需要 17 分钟。

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);//设置响应头Locationresponse.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实现页面跳转

Insert title here 恭喜你注册成功! 5秒后跳转,如不跳转请点击 这里

通过response设置响应体

响应体设置文本

PrintWriter getWriter()

获得字符流,通过字符流的write(String s)方法可以将字符串设置到response缓冲区中,

随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。

中文乱码的解决:

response.setContentType("text/html;charset=UTF-8");

详情请见:

 

响应头设置字节

 

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缓冲区中

页面:

Insert title here

使用服务器端的编码方式实现文件下载

图片 压缩包 文档 视频

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不能同时调用

 

重定向语句一般作为终结代码

 

 

转载于:https://www.cnblogs.com/Ace-suiyuan008/p/9617618.html

你可能感兴趣的文章
/etc/init.d目录和/etc/rc.local脚本
查看>>
Kubernetes StatefulSets
查看>>
用Python对html进行编码
查看>>
[转载]Java文件路径详解
查看>>
18.3.2从Class上获取信息(构造器)
查看>>
【TortoiseGit】TortoiseGit将本地库push到远端
查看>>
怎么样学习算法导论理论知识-算法何用
查看>>
Jenkins使用手册及总结
查看>>
Latest Common Ancestor
查看>>
getByClass--获取指定标签且class为指定的所有元素
查看>>
三点顺序
查看>>
拟物化设计与扁平化设计
查看>>
PS小实验-去除水印
查看>>
IS-IS完整笔记
查看>>
★如何解释特修斯之船问题?
查看>>
玩转PS路径,轻松画logo!
查看>>
Python简介及学习
查看>>
!!!后续博客写到简书 + 博客园留博客目录
查看>>
小白学数据分析-----> 利用SPSS对DAU/MAU进行比率分析
查看>>
js中this与srcElement的区别
查看>>