Response对象,用于生成http响应信息. 对于开发人员来讲,就是 向response 对象中添加信息即可.
void setStatus(int sc, String sm) //Deprecated(过时)
void sendError(int sc)
void setHeader(String name, String value) 设置键值对.
void setDateHeader(String name, long date) 设置键值对.
void setIntHeader(String name, int value) 设置键值对.
void addHeader(String name, String value) 添加键值对.
void addDateHeader(String name, long date)添加键值对.
void addIntHeader(String name, int value) 添加键值对.
例3: 手动做重定向效果.
结果展示:
getWriter(); 字符流.
getOutputStream() 字节流
response协议
响应首行
HTTP/1.1 200 OK
void setStatus(int sc) //设置状态码void setStatus(int sc, String sm) //Deprecated(过时)
void sendError(int sc)
void sendError(int sc, String msg)
例1:发送错误信息作为响应
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.sendError(404,"找到也不告诉你!");
}
}
响应头
键:值void setHeader(String name, String value) 设置键值对.
void setDateHeader(String name, long date) 设置键值对.
void setIntHeader(String name, int value) 设置键值对.
void addHeader(String name, String value) 添加键值对.
void addDateHeader(String name, long date)添加键值对.
void addIntHeader(String name, int value) 添加键值对.
例2: 访问BServlet,3秒后浏览器自动跳转到首页.
<meta http-equiv="Refresh" content="3;url=地址" > 用于模拟响应头的
public class BServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//添加响应头=> Refresh
//3s之后跳转到tomCat首页
response.addHeader("Refresh", "3;url=http://localhost:8080");
// 让页面有倒计时的效果
response.getWriter().write("您将在<span id='one'>3</span>秒后跳转!" +
"<script type='text/javaScript' >" +
"var span = document.getElementById('one');" +
"var i =3;" +
"function fun(){" +
"i--;" +
"if(i>=0){" +
"span.innerHTML = i;" +
"}" +
"}" +
"window.setInterval(fun,1000);" +
"</script>");
}
}
例3: 手动做重定向效果.
public class CServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*//1 添加302状态码 => 告诉浏览器需要重定向
response.setStatus(302);
//2 添加Location响应头 => 告诉浏览器重定向到哪里
response.setHeader("Location", "http://localhost:8080");*/
//该方法是对上面两行代码的封装
response.sendRedirect("http://localhost:8080");
}
}
例4: 向浏览器输出文字(字节流,中文)
public class EServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//2 设置解码码表 => 与setContentType效果一样,自动查找设置的码表,将解码码表设置一致
response.setHeader("Content-Type", "text/html;charset=GBK");
//1 设置编码码表
//response.setCharacterEncoding("GBK");
//可以使用19行代替17行的代码.同时setContentType方法如果发现你填写码表,那么会同时自动设置编码码表
//response.setContentType("text/html;charset=GBK");
//3 输出
response.getWriter().write("黑马");
//结论:
//1 输出中文建议使用字符流
//2 解决字符流乱码 使用setContentType放可以同时设置编码解码两端的码表.
//3 注意: 码表的设置一定放到输出之前
//4 注意: 字符流与字节流不能同时使用
}
}
例6: 向浏览器输出图片.(由servlet输出).
public class FServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//判断是否有查看的权限
// 1 获得图片的输入流
InputStream is = getServletContext().getResourceAsStream("/WEB-INF/xxx1.jpg");
// 2 获得输出到浏览器的输出流
OutputStream os = response.getOutputStream();
// 3 两个流对接
byte[] buffer = new byte[1024];
int len = -1;
while((len = is.read(buffer))!=-1){
os.write(buffer,0,len);
os.flush();
}
os.close();
is.close();
}
}
例7: 文件下载(向浏览器输出内容)
public class GServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//0 原则: 凡是响应正文中需要输出内容, 一定要设置content-type头
ServletContext sc = getServletContext();
String type = sc.getMimeType("abc.exe");
response.setContentType(type);
//0 设置响应头=> 提示用户保存名称 => Http协议不支持中文码表=> %E5%C3 => URLEncoder.encode("apache-汤姆-6.0.35.exe","UTF-8");
response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("apache-汤姆-6.0.35.exe","UTF-8"));
// 1 获得文件的输入流
InputStream is = getServletContext().getResourceAsStream("/WEB-INF/apache-tomcat-6.0.35.exe");
// 2 获得输出到浏览器的输出流
OutputStream os = response.getOutputStream();
// 3 两个流对接
byte[] buffer = new byte[1024];
int len = -1;
while((len = is.read(buffer))!=-1){
os.write(buffer,0,len);
os.flush();
}
os.close();
is.close();
}
}
结果展示:
响应空行
响应正文
需要给浏览器的资源getWriter(); 字符流.
getOutputStream() 字节流