HTTP响应由四部分组成:响应行、响应头、一个空行和实体内容。
HTTP响应的组成:
|--响应行
|--响应头
|--(一个空行)
|--实体内容
HTTP响应示例:
HTTP/1.1 200 OK --响应行 Server: Apache-Coyote/1.1 --响应头(key-vaule) Content-Length: 24 Date: Fri, 30 Jan 2015 01:54:57 GMT --(一个空行) this is hello servlet!!! --实体内容
#http协议版本
#状态码: 服务器处理请求的结果(状态)
常见的状态:
200 : 表示请求处理完成并完美返回
302: 表示请求需要进一步细化。
404: 表示客户访问的资源找不到。
500: 表示服务器的资源发生错误。(服务器内部错误)
#状态描述
Location: http://www.rk.com/index.jsp ---表示重定向的地址,该头和302的状态码一起使用。 Server:apache tomcat ---表示服务器的类型 Content-Encoding: gzip ---表示服务器发送给浏览器的数据压缩类型 Content-Length: 80 ---表示服务器发送给浏览器的数据长度 Content-Language: zh-cn ---表示服务器支持的语言 Content-Type: text/html; charset=GB2312 ---表示服务器发送给浏览器的数据类型及内容编码 Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT ---表示服务器资源的最后修改时间 Refresh: 1;url=http://www.rk.com ---表示定时刷新 Content-Disposition: attachment; filename=aaa.zip ---表示告诉浏览器以下载方式打开资源(下载文件时用到) Transfer-Encoding: chunked Set-Cookie:SS=Q0=5Lb_nQ; path=/search --表示服务器发送给浏览器的cookie信息(会话管理用到) Expires: -1 --表示通知浏览器不进行缓存 Cache-Control: no-cache Pragma: no-cache Connection: close/Keep-Alive --表示服务器和浏览器的连接状态。close:关闭连接 keep-alive:保存连接
类别 | API |
---|---|
响应行 | response.setStatus() 设置状态码 |
响应头 | response.setHeader("name","value") 设置响应头 |
实体内容 | response.getWriter().writer(); 发送字符实体内容 response.getOutputStream().writer() 发送字节实体内容 |
package com.rk.http.b_response; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 设置响应信息 */ public class Demo06 extends HttpServlet { /** * 1)tomcat服务器把请求信息封装到HttpServletRequest对象,且把响应信息封装到HttpServletResponse * 2)tomcat服务器调用doGet方法,传入request和response对象 * 3)通过response对象改变响应信息 * 4)tomcat服务器把response对象的内容转换成响应格式内容,再发送给浏览器解析。 */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 响应行 */ // response.setStatus(404);//修改状态码 // response.sendError(404);// 发送404的状态码+404的错误页面 // response.sendError(404,"这是一个404错误");// 发送404的状态码+404的错误页面+错误信息 /** * 响应头 */ response.setHeader("server", "JBoss"); /** * 实体内容(浏览器直接能够看到的内容就是实体内容) */ // response.getWriter().write("01.hello world"); //字符内容。 response.getOutputStream().write("02.hello world".getBytes());//字节内容 } }
package com.rk.http.b_response; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 案例- 请求重定向 *(相当于超链接跳转页面) */ public class Demo07 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 需求: 跳转到ad.html * 使用请求重定向: 发送一个302状态码+location的响应头 */ response.setStatus(302); response.setHeader("location", "/RK007HTTP/ad.html"); //请求重定向简化写法 response.sendRedirect("/RK007HTTP/ad.html"); } }
package com.rk.http.b_response; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 案例- 定时刷新 * */ public class Demo08 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 定时刷新 * 原理:浏览器认识refresh头,得到refresh头之后重新请求当前资源 */ // response.setHeader("refresh", "3"); /** * 隔n秒之后跳转另外的资源 */ // response.setHeader("refresh", "3;url=/RK007HTTP/ad.html");//跳转到项目内的页面 response.setHeader("refresh", "3;url=http://www.baidu.com");//跳转到项目外的网页 } }
package com.rk.http.b_response; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** *案例- ContentType的作用 * */ public class Demo09 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 设置响应实体内容编码 */ response.setCharacterEncoding("UTF-8"); //服务器发送给浏览器的数据类型和内容编码 response.setContentType("text/html;charset=utf-8");//推荐使用此方法。效果等同于response.setHeader("content-type", "text/html;charset=utf-8"); // response.setContentType("application/xml;charset=utf-8");//用这种方式,内容将以xml的格式进行显示 response.getWriter().write("<html><head><title>这里是标题</title></head><body>这里是body的内容</body></html>"); /** * 通过response.getOutputStream().write()方法输出的内容不受setCharacterEncoding和setContentType中设置的编码的影响。 * 默认情况下是GBK编码,浏览器需要以GBK编码才能正确显示页面内容。 */ // response.getOutputStream().write("<html><head><title>this is tilte</title></head><body>中国</body></html>".getBytes());//GBK编码 // response.getOutputStream().write("<html><head><title>this is tilte</title></head><body>中国</body></html>".getBytes("utf-8")); } }
package com.rk.http.b_response; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 以下载方式打开图片 * */ public class Demo10 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("image/jpeg"); File file = new File("E:\\IMAGE\\人体常用穴位背面.jpg"); /** * 设置以下载方式打开文件 */ String fileName = file.getName(); String encodeFileName = java.net.URLEncoder.encode(fileName,"utf-8"); response.setHeader("Content-Disposition", "attachment; filename="+encodeFileName); InputStream inStream = new FileInputStream(file); byte[] buf = new byte[1024]; int len = 0; while((len=inStream.read(buf, 0, buf.length)) != -1) { response.getOutputStream().write(buf, 0, len); } } }
原文:http://lsieun.blog.51cto.com/9210464/1775557