Http响应Response详解

1. HttpServletResponse概述:
         在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大。

 

2. response的运行流程

3. 通过抓包工具抓取http响应

 

4. http响应头信息详解 
         类似于请求消息中的请求头,其格式和请求头信息格式一样,即响应头:响应头值。

         1). Server :该响应头是服务器告诉浏览器,当前响应的服务类型和版本。

         2). Content-Type响应头:服务器告诉浏览器响应内容是什么类型,以及采用的是什么字符编码。该响应头的值现在为:text/html;charset=utf-8。说明响应信息的类型是文本类型中的html,使用的字符编码是utf-8。

         3). Content-Length响应头:服务器告诉浏览器,Content-Length响应头表明了响应实体的大小,该响应内容的长度现在是312个字节。

         4). Date响应头:表示是服务器是在什么时候响应回浏览器,注意这里的时间是按照美国时间来计算。

         5). Accept-Ranges: bytes - 该响应头表明服务器支持Range请求,以及服务器所支持的单位是字节(这也是唯一可用的单位).我们还能知道:服务器支持断点续传,以及支持同时下载文件的多个部分,也就是说下载工具可以利用范围请求加速下载该文件.Accept-Ranges: none 响应头表示服务器不支持范围请求.

         6). Last-Modified:服务器上文件的最后修改时间

  5 . 设置response内容
         response 代表响应, 可以通过该对象分别设置Http响应: 响应行  响应头  响应体

        1)  通过response设置响应行:
              设置响应的状态码:    setStatus(int sc)

             返回错误码 sendError(404, "你查找的资源未找到!") ;
         2) 通过response设置响应头   
                (其中,add表示添加,而set表示设置)          

        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)

  

3)response实现重定向

方法一:

response.setStatus(302); //设置响应行的状态码为302 重定向
response.setHeader("Location", "/Servlet/servlet2"); //设置响应头的属性 跳转到Servlet2

方法二:

response.sendRedirect("/Servlet/servlet2"); //利用response中的sendRedirect属性完成重定向

4)response实现自动刷新跳转

  

public class RefreshServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setHeader("refresh", "5;url=http://www.baidu.com"); //设置头 参数 数值5为
		//秒 中间用分号间隔 url为要跳转的网址
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

使用JS来完成自动跳转

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	window.onload= function(){
		var time = 3;
		var second = document.getElementById("second");
		timer = setInterval(function(){
			second.innerHTML = time;
			time--;
			if(time==0){
				location.href = "http://www.baidu.com";
				clearInterval(timer);
			}
		},1000);
	}
</script>
</head>
<body>
	恭喜你,登录成功,<span id="second" style="color: red">3</span>秒后将跳转,若不跳转 请点击<a href="http://www.baidu.com">这里</a>
</body>
</html>

5)文件下载

  1. 创建一个页面,展示所有要被下载的文件的链接;
  2. 链接要下载的文件名称,发送给服务器的servlet,让servlet进行处理;
  3. 服务器加载文件资源;
  4. 提示浏览器,以下载的方式,获取服务器资源;
  5. 使用IO的方式,将文件数据输出到浏览器(response.getOutputStream());
//网页文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>
    <a href="/download?filename=1.jpg">1.jpg</a><br>
    <a href="/download?filename=2.txt">2.txt</a><br>
    <a href="/download?filename=3.zip">3.zip</a><br>
    <a href="/download?filename=Sublime.exe">Sublime.exe</a><br>
</body>
</html>

 

//servlet文档
@webServlet(name="DownloadServlet",urlPatterns="download")

public class DownloadServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request,HttpServletRespnse response){
            //获取要下载的文件名
            String filename = request.getParameters("filename");
            //获取Context域下的文件路径
            String path = request.getServletContext().getRealPath("/WEB-INF/"+filename);
            //获取文件扩展名
            String mimeType = request.getServletContext().getmimeType(filename);

            //告诉浏览器以附件的形式来展示文件
            //response.setHeader("content-type",mimeType);
            //简化形式
            response.setHeader(mimeType);

            //告诉浏览器以附件的形式来展示文件
        response.setHeader("Content-Disposition","attachment;filename="+filename);

            //开启IO流下载
            File file = new File(path);
            if(file.exist())
            {
                //输入
                FileInputStream in = new FileInputStream(file);
                //输出
                ServletOutputStream out = response.getOutputStream();

                int len= -1;
                byte[] buf = new byte[1024];
                while((len = in.read(buf))!=-1){
                    out.write(buf,0,len);
                }
                //input是服务器资源必选关闭
                in.close();
                //output是浏览器资源,并且是响应对象的方法 响应一次就自动结束,所以不用关。
            }


    }

    protected void doPost(HttpServletRequest request,HttpServletRespnse response){
        doGet(request,response);
    }
}

6)获取response中的输出流

 PrintWriter getWriter()           // 用于向浏览器输出二进制数据。【字节流–文件下载】

ServletOutputStream getOutputStream()      // 用于向浏览器输出字符数据。【字符流–给浏览器响应数据】

 

Response中应注意的细节

1.response获得的流OutputStream不需要手动关闭,Tomcat容器会帮助我们关闭
但是InputStream需要手动关闭
2.getWriter和getOutputStream不能同时调用

 

Response常用方法

void addCookie(Cookie cookie)给客户端添加一个Cookie对象,以保存客户端的信息

void addDateHeader(String name,long value) 添加一个日期类型的HTTP首部信息,覆盖同名的HTTP首部

void addIntHeader(String name,int value) 添加一个整型的HTTP首部,并覆盖旧的HTTP首部

String encodeRedirectURL(String url)对使用的URL进行编译

String encodeURL(String url)封装URL并返回到客户端,实现URL重写

void flushBuffer() 清空缓冲区

int getCharacterEncoding() 取得字符编码类型

String getContentType() 取得MIME类型

Locale getLocale() 取得本地化信息

ServletOutputStream getOutputStream() 返回一个二进制输出字节流

PrintWriter getWriter() 返回一个输出字符流

void reset() 重设response对象

void resetBuffer()重设缓冲区

void sendError(int sc) 向客户端发送HTTP状态码的出错信息

void sendRedirect() 重定向客户的请求到指定页面

void setBufferSize(int size) 设置缓冲区的大小为size

void setCharacterEncoding(String encoding) 设置字符编码类型为encoding

void setContentLength(int length)设置响应数据的大小为size

void setContentType(String type) 设置MIME类型

void setDateHeader(String s1,long l) 设置日期类型的HTPP首部信息

void setLocale(Locale locale) 设置本地化为locale

void setStatus(int status)  设置状态码为status

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值