0309 HttpServletResponse01
首先回顾一下Servlet运行流程

服务器将响应封装到了response对象中返回给客户端
那么response对象中就封装了 响应行,响应头和响应体
1、通过response设置响应行
响应hang中包括协议版本号,状态码和状态信息
setStatus(int sc)方法可以设置状态码
代码展示 让当访问servlet的时候报404状态
public class LineServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置状态码
response.setStatus(404);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
2、通过response设置响应头
常用头
Location:指定响应路径,与状态码302配合使用完成跳转
Refresh:定时刷新,格式:秒数;url=路径。url可省略,默认值为当前页 例:3;url=www.baidu.com 三秒后跳转到百度网
Content-Type:响应正文的类型 值:text/html;charset=UTF-8
设置响应头方法
主要:setHeader(String name, String value) name是头的名字,value 是值
代码展示:servlet01设置跳转到servlet02
(1)使用location 搭配302状态码跳转
public class Servlet01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//完成重定向
/*response.setStatus(302);
response.setHeader("Location", "/WEB03/Servlet02");*/
//方法调用
response.sendRedirect("/WEB03/Servlet02");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
注:上述代码中sendRedirect()方法中封装了上两行代码,直接调用可以使用
(2)使用Refresh定时刷新 五秒跳转
public class HeadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("hello dandan...");
//定时刷新
response.setHeader("Refresh", "5;url=https://www.baidu.com");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
(3)用前端js写 jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
恭喜您注册成功!
<span id="second">5</span>
秒后跳转,如不跳转,
请<a href="https://www.baidu.com">点击这里</a>
</body>
<script type="text/javascript" >
//获取元素
var second=document.getElementById("second");
var timer=5;
//设置定时器
var time=setInterval(function(){
second.innerHTML=timer;
timer--;
if(timer<0){
//取消定时器
clearInterval(time);
//跳转
location.href="https://www.baidu.com";
}
}, 1000);
</script>
</html>
(4)用前端jquery写 html文件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
恭喜您注册成功 <span id="s">5</span> 秒后跳转 ,如不跳转,
<a href="https://www.baidu.com">请点击这里</a>
</body>
<script type="text/javascript" src="/WEB03/js/jquery-3.4.0.min.js"></script>
<script type="text/javascript">
var time=5;
var timer=setInterval(function(){
$("#s").html(time);
time--;
if(time<0){
clearInterval(timer);
location.href="https://www.baidu.com";
}
}, 1000);
</script>
</html>
3、response设置响应体
(1)响应体设置文本
PrintWriter getWriter() 方法获取字符流 通过write方法将数据写入到response缓冲区中,tomcat检测到write方法结束以后就会到response缓冲区中去读取内容 并封装成响应行响应头和响应体返回给客户端浏览器
乱码问题:
response缓冲区码表是iOS8859-1码表 客户端浏览器是jbk码表,所以我们要用setCharacterEncoding(String charset)方法去设置response缓冲区的码表,用setContentType(String type)方法指定客户端浏览器码表(其中setContentType(String type)方法封装了setCharacterEncoding)(String charset)方法 所以直接用setContentType(String type)方法就可以实现
代码展示
public class bodyServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置码表 缓冲区中的码表
response.setCharacterEncoding("UTF-8");
//设置浏览器码表
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("中国");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

(2)字节
ServletOutputStream getOutputStream()获取字节输出流
我们可以通过字节输入流读取一个图片 通过字节输出流响应给客户端浏览器
代码展示
public class picServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String path=getServletContext().getRealPath("download/3.jpg");
//明确数据源
FileInputStream fis=new FileInputStream(path);
//明确目的地
ServletOutputStream out=response.getOutputStream();
byte[] bytes=new byte[1024];
int len=0;
while((len=fis.read(bytes))!=-1){
out.write(bytes,0,len);
}
fis.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

那我们输出的字节 能解析的就给解析了,直接显示一张图片 那我们如果指定一个压缩包,他就会解析不了就会提供下载功能
如果把上述代码改成3.rar

就会提示下载文件

浙公网安备 33010602011771号