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