1. 响应对象概述
响应,它表示了服务器端收到请求,同时也已经处理完成,把处理的结果告知用户。简单来说,指的就是服务器把请求的处理结果告知客户端。在B/S架构中,响应就是把结果带回浏览器。响应对象就是用来实现上述功能的对象。
响应结果要么成功要么失败,分类如下:
常用状态码:
状态码 | 说明 |
200 | 执行成功 |
302 | 它和307一样,都是用于重定向的状态码。3开头:重定向 |
304 | 请求资源未改变,使用缓存。 |
400 | 请求错误。最常见的就是请求参数有问题。4开头:客户端错误 |
404 | 请求资源未找到 |
405 | 请求方式不被支持 |
500 | 服务器运行内部错误。5开头:服务器错误 |
2. 字节流响应消息并解决乱码问题
/*字节流响应消息*/
@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//指定浏览器采用的编码格式
resp.setContentType("text/html; charset=UTF-8");
//获取字节输出流对象
ServletOutputStream os = resp.getOutputStream();
//定义一个消息
String str = "落霞与孤鹜齐飞,秋水共长天一色";
//因为是Windows系统,所以getByte默认采用的是gbk字符集将字符串转化为字节数组
//指定将消息转换为utf-8编码的字节流,此时需要解决中文乱码问题
byte[] bytes = str.getBytes("UTF-8");
//通过字节流对象在浏览器输出消息
os.write(bytes);
//通过响应对象获取的流对象不需要自己关闭
//os.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3. 字符流响应消息和解决乱码问题
/*字符流响应消息*/
@WebServlet("/servletDemo02")
public class ServletDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//指定浏览器采用的编码格式
resp.setContentType("text/html; charset=UTF-8");
//获取字符输出流对象
PrintWriter printWriter = resp.getWriter();
String str = "风萧萧兮易水寒";
//通过字符流输出到浏览器
printWriter.write(str);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4. 响应图片
/*响应图片*/
@WebServlet("/servletDemo03")
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建输入流对象,关联图片所在路径(/web/img/01.jpg)
//图片路径需要为绝对路径
ServletContext context = getServletContext();
String realPath = context.getRealPath("/img/01.jpg");
FileInputStream fileInputStream = new FileInputStream(realPath);
BufferedInputStream bs = new BufferedInputStream(fileInputStream);
//通过响应对象获取字节输出流
ServletOutputStream os = resp.getOutputStream();
//循环读写
byte[] bytes = new byte[1024];
int len;
while ((len=bs.read(bytes))!=-1){
os.write(bytes,0,len);
}
//只需关闭输入流
bs.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
5. 设置缓存时间
/*设置缓存*/
@WebServlet("/servletDemo04")
public class ServletDemo04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String str = "马作的卢飞快,弓如霹雳弦惊";
//设置1小时缓存,第一次请求走服务端,过后1小时内再次访问,都是从缓存拿数据
//ie浏览器测试
resp.setDateHeader("Expires", System.currentTimeMillis()+60*60*1000);
//设置编码格式
resp.setContentType("text/html; charset=UTF-8");
//写数据
resp.getWriter().write(str);
//第一次访问服务区会显示,之后在地址栏回车控制台不会显示
System.out.println("冷冷清清,凄凄惨惨戚戚");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
6. 设置定时刷新
/*定时刷新*/
@WebServlet("/servletDemo05")
public class ServletDemo05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String str = "您的用户名或密码有误,3秒后自动跳转到登录页面";
//设置编码格式
resp.setContentType("text/html; charset=UTF-8");
//写出数据
resp.getWriter().write(str);
//设置定时刷新时间和跳转路径
resp.setHeader("Refresh","3;URL=/response/login.html");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
7. 重定向
重定向:客户端的一次请求到达后,需要借助其他Servlet来实现功能
特点:浏览器地址栏会发生改变,两次请求,请求域对象中不能共享数据,可以重定向到其他服务器
/*重定向*/
@WebServlet("/servletDemo06")
public class ServletDemo06 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servletDemo06执行了。。。。。");
//设置一个共享数据
req.setAttribute("username", "yulu");
//重定向(虚拟路径+映射路径)
resp.sendRedirect(req.getContextPath()+"/servletDemo07");
//还可以重定向到其他服务器
// resp.sendRedirect("https://www.baidu.com/");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
/*重定向*/
@WebServlet("/servletDemo07")
public class ServletDemo07 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servletDemo07执行了。。。。。");
//尝试获取共享数据
Object username = req.getAttribute("username");
System.out.println(username);//null
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
8. 文件下载
@WebServlet("/servletDemo08")
public class ServletDemo08 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.创建字节输入流,关联读取的文件
//获取文件的绝对路径
String realPath = getServletContext().getRealPath("/img/01.jpg");
//创建字节输出流对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath));
//2.设置响应头支持的类型 应用支持的类型为字节流
/*
Content-Type 消息头名称 支持的类型
application/octet-stream 消息头参数 应用类型为字节流
*/
resp.setHeader("Content-Type","application/octet-stream");
//3.设置响应头以下载方式打开 以附件形式处理内容
/*
Content-Disposition 消息头名称 处理的形式
attachment;filename= 消息头参数 附件形式进行处理
*/
resp.setHeader("Content-Disposition","attachment;filename=" + System.currentTimeMillis() + ".png");
//4.获取字节输出流对象
ServletOutputStream sos = resp.getOutputStream();
//5.循环读写文件
byte[] arr = new byte[1024];
int len;
while((len = bis.read(arr)) != -1) {
sos.write(arr,0,len);
}
//6.释放资源
bis.close();
sos.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
如有错误欢迎留言评论,2021年7月7日 羽露风