Response响应方法详解

Response:

  • 响应:服务器把请求的处理结果告知客户端。在B/S架构中,响应就是把结果带回浏览器。
  • 响应对象:在项目中用于发送响应的对象
常用状态码:
状态码 说明
200 执行成功
302 它和307一样,都是用于重定向的状态码。只是307目前已不再使用
304 请求资源未改变,使用缓存。
400 请求错误。最常见的就是请求参数有问题
404 请求资源未找到
405 请求方式不被支持
500 服务器运行内部错误

状态码首位含义:

状态码 说明
1xx 消息
2xx 成功
3xx 重定向
4xx 客户端错误
5xx 服务器错误
字节流响应消息&乱码:
返回值 方法名 说明
ServletOutputStream getOutputStream() 获取响应字节输出流对象
void setContentType(“text/html;charset=UTF-8”) 设置响应内容类型,解决中文乱码

演示:

@WebServlet("/ResponseDemo01")
public class ResponseDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // setContentType:相当于告诉浏览器你要使用这个编码才能解析我的内容
        resp.setContentType("text/html;charset=UTF-8");
        // getOutputStream()	获取响应字节输出流对象
        ServletOutputStream ops = resp.getOutputStream();

        // 定义消息
        String s = "测试会不会乱码";
        /**
         为什么有的时候没有处理乱码,但是浏览器不会乱码
         getBytes:在字符串转成字节的时候,如果没有传递参数(编码格式),它会根据系统的编码转换,这里的系统是电脑的,比如Windows的默认就是GBK
         那就会转换成GBK格式的,如果浏览器也是GBK就不会乱码,但是如果浏览器是其它的就会乱码
         */
        ops.write(s.getBytes("UTF-8"));
    }
}
字符流响应消息:
返回值 方法名 说明
PrintWriter getWriter() 获取响应字符输出流对象
void setContentType(“text/html;charset=UTF-8”) 设置响应内容类型,解决中文乱码

演示:

@WebServlet("/ResponseDemo02")
public class ResponseDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        resp.setContentType("text/html;charset=UTF-8");
        // getWriter()	获取响应字符输出流对象
        PrintWriter printWriter = resp.getWriter();

        String s = "我也呵呵了";
        printWriter.write(s);
    }
}
响应图片:

步骤:

  1. 创建字节输入流对象,关联读取的图片路径
  2. 通过响应对象获取字节输出流对象
  3. 循环读取和写出图片
@WebServlet("/ResponseDemo03")
public class ResponseDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 创建字节输入流对象,关联读取的图片路径
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("/Users/itzhuzhu/Desktop/WechatIMG27.JPG"));

        // 2. 通过响应对象获取字节输出流对象
        ServletOutputStream os = resp.getOutputStream();

        // 3. 循环读取和写出图片
        byte[] bytes = new byte[1024];
        int len;

        while ((len = bis.read(bytes)) != -1) {
            os.write(bytes, 0, len);
        }
    }
}
设置缓存:

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

返回值 方法名 说明
void setDateHeader(String name,long time) 设置消息头添加缓存

演示:

如果开启了缓存是可以在电脑中找到这个缓存文件的,可以看到上次访问时间和过期时间,到了过期时间才会访问服务器

@WebServlet("/ResponseDemo04")
public class ResponseDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String s = "我是测试缓存内容";
        // 设置换缓存1小时,只有第一次请求会请求服务端,后面的请求是走的缓存
        resp.setDateHeader("Expires", System.currentTimeMillis() + 1 * 60 * 60 * 1000);
        // 设置编码格式
        resp.setContentType("text/html;charset=UTF-8");
        // 写出数据
        resp.getWriter().write(s);
        System.out.println("再次访问会走我吗");
    }
}
定时刷新:

过了指定时间,页面自动跳转

返回值 方法名 说明
void setHeader(String name,String value) 设置消息头定时刷新

演示:

@WebServlet("/ResponseDemo05")
public class ResponseDemo05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String s = "计算机被黑客窃取,正在读取数据,读取完毕自动跳转";
        resp.setContentType("text/html; charset=UTF-8");

        // 写数据
        resp.getWriter().write(s);
        // 定时刷新
        resp.setHeader("Refresh", "3;URL=/regist.html");
    }
}
请求重定向:

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

特点:

  • 浏览器地址会改变
  • 两次请求
  • 请求域对象中不能共享数据
  • 可以重定向到其他服务器

实现原理:

  • 设置响应状态码302
  • 设置响应的资源路径(响应消息头指定响应到哪里)

重定向和请求转发用哪一个?

  • 需要共享数据就转发,不需要就重定向

重定向方法:

返回值 方法名 说明
void sendRedirect(String name) 设置重定向

演示:

@WebServlet("/ResponseDemo06")
public class ResponseDemo06 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        System.out.println("ResponseDemo06执行了");
        // 设置共享数据
        req.setAttribute("username","itzhuzhu");
        // 设置重定向
        resp.sendRedirect(req.getContextPath()+"/servletDemo15");
    }
@WebServlet("/ResponseDemo07")
public class ResponseDemo07 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("ResponseDemo07执行了");
        // 获取共享数据,这里会丢失共享数据
        System.out.println(req.getAttribute("username"));
    }
文件下载:
@WebServlet("/ResponseDemo08")
public class ResponseDemo08 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 获取文件路径
        String realPath = getServletContext().getRealPath("/img/首页.png");

        // 2. 把文件读到字节输入流中
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath));

        // 3. 告知浏览器,以下载的方式打开(告知浏览器下载文件的MIME类型)
        /**
          Content-type:消息头名称,支持的类型
          application/octet-stream:消息头参数,应用的类型为字节流
          Content-Disposition:消息头名称,处理的形式
          attachment;filename=首页.jpg:消息头参数,以附件的形式,指定下载文件名称
          */
        resp.setHeader("Content-type", "application/octet-stream");
        resp.setHeader("Content-Disposition", "attachment;filename=首页.jpg");

        // 4. 使用响应对象的字节输出流输出到浏览器上
        ServletOutputStream os = resp.getOutputStream();
        byte[] bytes = new byte[1024];
        int len;
        while ((len = bis.read(bytes)) != -1) {
            os.write(bytes, 0, len);
        }
        bis.close();
    }
}

Response方法详解:

Response响应方法详解_第1张图片

你可能感兴趣的:(JavaEE,Response,响应,javaee,缓存,重定向)