• Servlet--Response响应对象


    1.响应对象的概述

    响应:回馈结果。在BS架构中,就是服务器给客户端浏览器反馈结果

    响应对象:就是在项目中用于发送响应的对象

    2.常见状态码

    状态码说明
    200成功
    302重定向
    304请求资源未改变
    400请求错误,常见于请求参数错误
    404请求资源未找到
    405请求方式不支持
    500服务器错误

    405:请求方式不支持,例如:一般是后台只支持post请求,而发起的请求确实get请求,这时候就会提示405

    状态码首位含义

    状态码说明
    1xx消息
    2xx成功
    3xx重定向
    4xx客户端错误
    5xx服务器错误

    3.字节流响应消息和解决乱码问题

    返回值方法名说明
    ServletOutputStreamgetOutputStream()获取响应字节输出流对象
    voidsetContentType(“text/html;charset=UTF-8”)设置响应内容类型,解决中文乱码问题

    字节流,常用于处理图片,文件

    1. package servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.ServletOutputStream;
    4. import javax.servlet.annotation.WebServlet;
    5. import javax.servlet.http.HttpServlet;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. import java.io.IOException;
    9. /*
    10. 字节流响应消息
    11. */
    12. @WebServlet("/servletDemo01")
    13. public class ServletDemo01 extends HttpServlet {
    14. @Override
    15. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    16. /*
    17. 项目中常用的编码格式是utf-8,而浏览器默认使用的编码是gbk。导致乱码!
    18. */
    19. //1. 获取字节流输出对象
    20. ServletOutputStream sos = resp.getOutputStream();
    21. //2. 定义一个消息
    22. String str = "你好";
    23. //通过字节流对象输出
    24. sos.write(str.getBytes());//getBytes不带参数,默认获取操作系统的编码集(我们安装的都是中文windows,所以系统编码集是gbk)
    25. }
    26. @Override
    27. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    28. doGet(req,resp);
    29. }
    30. }

     要想出现乱码,修改代码:

    sos.write(str.getBytes("UTF-8"));
    

    解决乱码的一种常用方法

    response.setContentType("text/html;charset=UTF-8");

    4.字符流响应消息和解决乱码问题

    返回值方法名说明
    PrintWritergetWriter()获取响应字符输出流对象
    voidsetContentType(“text/html;charset=UTF-8”)设置响应内容类型,解决中文乱码问题
    1. package servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. import java.io.PrintWriter;
    9. /*
    10. 字符流响应消息
    11. */
    12. @WebServlet("/servletDemo02")
    13. public class ServletDemo02 extends HttpServlet {
    14. @Override
    15. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    16. //1. 准备一个消息
    17. String str = "你好";
    18. //2. 获取字符流对象
    19. PrintWriter pw = resp.getWriter();
    20. //3. 通过字符流输出
    21. pw.write(str);
    22. //pw.close();
    23. }
    24. @Override
    25. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    26. doGet(req,resp);
    27. }
    28. }

     解决乱码问题

    1. //解决中文乱码
    2. resp.setContentType("text/html;charset=UTF-8");

    如果是响应解决乱码问题,一般思路就是让浏览器与代码中的编码风格保持一致(utf-8)

     resp.setContentType("text/html;charset=UTF-8");
    

    如果请求中解决乱码,将gbk编码的中文信息转换为utf-8 

    1. //设置编码格式 (将浏览器默认编码gbk的中文信息,转换为utf-8的信息)
    2. req.setCharacterEncoding("UTF-8");

    5.响应图片

    1.创建字节输入流对象,关联读取的图片路径

    2.通过响应对象获取字节输出流对象

    3.循环读取和写出图片

    4.将xxx.png图片,复制到web/img目录下

    1. package servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.ServletOutputStream;
    4. import javax.servlet.annotation.WebServlet;
    5. import javax.servlet.http.HttpServlet;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. import java.io.BufferedInputStream;
    9. import java.io.FileInputStream;
    10. import java.io.IOException;
    11. /*
    12. 响应图片
    13. */
    14. @WebServlet("/servletDemo03")
    15. public class ServletDemo03 extends HttpServlet {
    16. @Override
    17. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    18. //1. 创建字节输入流对象,关联图片路径
    19. String realPath = getServletContext().getRealPath("/img/zjl.png");
    20. System.out.println(realPath);
    21. BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath));
    22. //注意:不能直接指定图片路径,需要同getRealPath获取,因为项目还要发布,我们需要获取到发布之后的图片路径
    23. //BufferedInputStream bis = new BufferedInputStream(new FileInputStream(/img/a.png));
    24. //2. 获取字节输出流对象
    25. ServletOutputStream sos = resp.getOutputStream();
    26. //3. 循环读写
    27. byte[] arr = new byte[1024];
    28. int len;
    29. while((len = bis.read(arr)) != -1) {
    30. sos.write(arr,0,len);
    31. }
    32. bis.close();
    33. }
    34. @Override
    35. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    36. doGet(req,resp);
    37. }
    38. }

    6.设置缓存时间

    缓存:对于不经常变化的数据,我们可以设置合理缓存时间,以避免浏览器频繁请求服务器。以此来提高效率

    返回值方法名说明
    voidsetDateHeader(String name,long time)设置消息头添加缓存
    1. package servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. /*
    9. 设置缓存
    10. */
    11. @WebServlet("/servletDemo04")
    12. public class ServletDemo04 extends HttpServlet {
    13. @Override
    14. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    15. String news = "这是一条很火爆的新闻~";
    16. //设置缓存时间:1小时的缓存时间
    17. //参数1:Expires:失效的意思
    18. //参数2:当前时间+1小时毫秒值(意思就是在1小时之后过期)
    19. resp.setDateHeader("Expires",(System.currentTimeMillis()+1*60*60*1000L));
    20. //设置编码格式
    21. resp.setContentType("text/html;charset=UTF-8");
    22. //写出数据
    23. resp.getWriter().write(news);
    24. System.out.println("aaa");
    25. }
    26. @Override
    27. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    28. doGet(req,resp);
    29. }
    30. }

    第一次访问:发现执行了Servlet,并且打印了aaa此时,这个Servlet已经被缓存下来了,第二次访问执行了Servlet,并且控制台没有打印aaa

    6.设置定时刷新

    定时刷新:过了指定时间后,页面自动进行跳转

    返回值方法名说明
    voidsetHeader(String name,String value)设置消息头定时刷新
    1. package servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. /*
    9. 定时刷新
    10. */
    11. @WebServlet("/servletDemo05")
    12. public class ServletDemo05 extends HttpServlet {
    13. @Override
    14. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    15. String str = "您的用户名或密码错误,3秒后自动跳转到登录页面...";
    16. //设置编码格式
    17. resp.setContentType("text/html;charset=UTF-8");
    18. //写出数据
    19. resp.getWriter().write(str);
    20. //设置响应消息头定时刷新
    21. //Refresh:刷新
    22. //第二个参数第一部分:3,3设之后
    23. //第二个参数第二部分:跳转到哪个路径
    24. resp.setHeader("Refresh","3;URL=/response/login.html");
    25. }
    26. @Override
    27. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    28. doGet(req,resp);
    29. }
    30. }

     在web目录下新建login.html

    访问:3s之后自动跳转到login.html

    7.请求重定向

    请求重定向客户端的一次请求到达后,发现需要借助其他的Servlet来实现功能。

    特点:浏览器地址栏会发生改变,再次请求、请求域对象中不能共享数据,可以重定向到其它服务器。

    重定向实现原理

    1. //设置响应状态码为302
    2. resp.setStatus(302);
    3. //设置响应的资源路径(响应到哪里去,通过响应消息头location来指定)
    4. resp.setHeader("location","/responseDemo07");

    返回值方法名说明
    voidsendRedirect(String name)设置重定向
    1. package servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. /*
    9. 请求重定向
    10. */
    11. @WebServlet("/servletDemo06")
    12. public class ServletDemo06 extends HttpServlet {
    13. @Override
    14. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    15. System.out.println("servletDemo06执行了...");
    16. //设置请求域共享数据
    17. req.setAttribute("username","zhangsan");
    18. //设置重定向
    19. resp.sendRedirect(req.getContextPath() + "/servletDemo07");
    20. //resp.sendRedirect("https://www.baidu.com");
    21. }
    22. @Override
    23. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    24. doGet(req,resp);
    25. }
    26. }

    获取共享数据 

    1. package servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. /*
    9. 请求重定向
    10. */
    11. @WebServlet("/servletDemo07")
    12. public class ServletDemo07 extends HttpServlet {
    13. @Override
    14. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    15. System.out.println("servletDemo07执行了...");
    16. Object username = req.getAttribute("username");
    17. System.out.println(username);
    18. }
    19. @Override
    20. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    21. doGet(req,resp);
    22. }
    23. }

    重定向与转发的区别

    重定向:

    两次请求

    地址栏发生变化

    不可以使用request域共享数据 (既然是两次请求,那肯定不能使用请求域中共享的数据)

    可以重定向到其他服务器的url

    转发:

    一次请求

    地址栏不发生变化

    可以使用request域共享数据

    只能转发到自己服务器内部的url

    8.文件下载

    1.创建字节输入流,关联读取的文件

    2.设置响应消息头支持的类型

    3.设置响应消息头以下载方式打开资源

    4.通过响应对象获取字节输入流对象

    5.循环读写

    6.释放资源

    1. package servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.ServletOutputStream;
    4. import javax.servlet.annotation.WebServlet;
    5. import javax.servlet.http.HttpServlet;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. import java.io.BufferedInputStream;
    9. import java.io.FileInputStream;
    10. import java.io.IOException;
    11. /*
    12. 文件下载
    13. */
    14. @WebServlet("/servletDemo08")
    15. public class ServletDemo08 extends HttpServlet {
    16. @Override
    17. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    18. //1.创建字节输入流,关联读取的文件
    19. //获取文件的绝对路径
    20. String realPath = getServletContext().getRealPath("/img/zjl.png");
    21. //创建字节输出流对象
    22. BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath));
    23. //2.设置响应头支持的类型 应用支持的类型为字节流
    24. /*
    25. Content-Type 消息头名称 支持的类型
    26. application/octet-stream 消息头参数 应用类型为字节流
    27. */
    28. resp.setHeader("Content-Type","application/octet-stream");
    29. //3.设置响应头以下载方式打开 以附件形式处理内容
    30. /*
    31. Content-Disposition 消息头名称 处理的形式
    32. attachment;filename= 消息头参数 附件形式进行处理;指定下载文件名称
    33. */
    34. resp.setHeader("Content-Disposition","attachment;filename=ljb.png");
    35. //4.获取字节输出流对象
    36. ServletOutputStream os = resp.getOutputStream();
    37. //5.循环读写文件
    38. byte[] arr = new byte[1024];
    39. int len;
    40. while((len = bis.read(arr)) != -1) {
    41. os.write(arr,0,len);
    42. }
    43. //6.释放资源
    44. bis.close();
    45. }
    46. @Override
    47. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    48. doGet(req,resp);
    49. }
    50. }

  • 相关阅读:
    SpringBoot+TKmybatis+mysql实现简单后台管理demo
    [Android开发学iOS系列] TableView展现一个list
    Linux学习-30-chgrp、chown等修改文件和目录的所有者和所属组命令
    Logback日志框架使用详解以及如何Springboot快速集成
    基于docker实现mysql的主从复制 详细步骤
    语音助手开发小记(2023.9.25)
    fastadmin后台中文章分类ID改为名称显示
    OJ练习第160题——LRU 缓存
    WPF随笔收录-DataGrid固定右侧列
    SpringBoot——自定义自动配置与起步依赖
  • 原文地址:https://blog.csdn.net/weixin_61611746/article/details/132817441