javaEE(四) ServletResponse

javaEE(四) ServletResponse

该对象主要的功能是用来协助servlet给客户端返回响应的

常见的功能

1.设置响应报文的各个部分

@WebServlet("/resp1")
public class RespServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //可以设置响应报文 服务器创建一个对象,对象里面包含很多属性
        //开发者需要做的事情及时往对象里面的属性进行赋值;最终服务器读取里面的数据生成HTTP响应报文
        response.setStatus(404);
        response.setHeader("Server", "OS");
        //响应体
        response.getWriter().println("<div style='color:red'>File Not Found</div>");
    }
}

2.输出字符数据

response.getWriter().println("xxxxxx")

3.中文乱码

方式一:设置Content-Type响应头

@WebServlet("/resp2")
public class RespServlet2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置完之后依然乱码,主要的原因在于编解码不一致 推测浏览器使用的是GBK
        //可以采取这种方式去解决吗?不可以。说明浏览器默认使用的是GBK
        //因为有的浏览器默认情况下不会默认选择GBK来进行解码,此时如果你这么设置,肯定会出问题
        //我们希望可以彻底的解决该问题 服务器设置一个编码格式 + 将使用的编码格式告诉给客户端
        response.setCharacterEncoding("GBK");
        response.getWriter().println("你好");
    }
}

@WebServlet("/resp3")
public class RespServlet3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        response.setCharacterEncoding("utf-8");
        //把使用的编码格式告诉给客户端,可以通过哪个部分?响应头、响应体
        //其中下面这行代码有两个功能,如果设置了该响应头,那么服务器会自动读取里面的charset的值,作用于响应体
        //所以,上面的那行代码可以不用写
        response.setHeader("Content-Type","text/html;charset=utf-8");
        response.getWriter().println("你好");
    }
}

方式二:通过响应体告诉客户端编码格式

@WebServlet("/resp4")
public class RespServlet4 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");

        //通过响应体告诉客户端使用的编码格式
        response.getWriter().println("<!DOCTYPE html>\n" +
                "<html lang=\"en\">\n" +
                "<head>\n" +
                "    <meta charset=\"UTF-8\">\n" +
                "    <title>Title</title>\n" +
                "</head>\n" +
                "<body>");

        response.getWriter().println("你好");

        response.getWriter().println("</body>\n" +
                "</html>");
    }
}

4.输出字节数据

@WebServlet("/stream")
public class StreamServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //字节流
        //todo note:字符流和字节流不可以同时调用,只可以调用一个
//        response.getWriter().println();
        //今后如果遇到一个新的类,不知道该如何去使用,那么可以查看一下类继承关系
        ServletOutputStream outputStream = response.getOutputStream();
        //新建一个文件输入流
        String realPath = getServletContext().getRealPath("WEB-INF/1.jpeg");
        FileInputStream fileInputStream = new FileInputStream(new File(realPath));
        int length = 0;
        byte[] bytes = new byte[1024];
        while ((length = fileInputStream.read(bytes)) != -1){
            outputStream.write(bytes, 0, length);
        }
        //关闭流
        fileInputStream.close();
        //关于ServletOutputStream可以关闭也可以不关闭,如果不关闭,tomcat会帮我们关闭
        outputStream.close();
    }
}

5.页面的跳转方式(定时刷新,重定向)

定时刷新

希望页面时时刻刻显示最新的时间,不需要用户主动的去刷新
主要利用一个叫做refresh响应头

@WebServlet("/refresh")
public class RefreshServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //定时刷新、跳转
        //1.定时刷新,只会刷新当前页面 每隔多少秒刷新一次当前的时间
        response.getWriter().println(new Date());
//        response.setHeader("refresh", "1");
        //2.用法二:定时跳转 表示经过指定秒数之后,跳转至指定的页面
        response.setHeader("refresh", "2;url=" + request.getContextPath() + "/1.jpeg");
    }
}

重定向

服务器返回301、302、307状态码,同时搭配着Location响应头,浏览器会再次往location的地址去发起新的请求

@WebServlet("/redirect")
public class SendRedirectServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //根据重定向的定义,302、Location
//        response.setStatus(302);
//        response.setHeader("Location", request.getContextPath() + "/1.jpeg");
        //上述是我们根据重定向的定义自己去实现的,其实ee规范给我们提供了一个简化的方式
        response.sendRedirect(request.getContextPath() + "/1.jpeg");
    }
}

6.下载

对于浏览器来说,有如下行为:对于可以打开的文件,默认会执行打开操作;对于无法打开的文件,默认就会执行下载操作。
我们这里提及的下载指的是对于可以打开的文件,可以设置一个响应头,让浏览器将该资源进行下载,而不是打开。

@WebServlet("/down")
public class DownServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //字节流
        //只需要在原先的代码基础上追加一个下载的响应头
        response.setHeader("Content-Disposition", "attachment;filename=1.jpeg");
        //todo note:字符流和字节流不可以同时调用,只可以调用一个
//        response.getWriter().println();
        //今后如果遇到一个新的类,不知道该如何去使用,那么可以查看一下类继承关系
        ServletOutputStream outputStream = response.getOutputStream();
        //新建一个文件输入流
        String realPath = getServletContext().getRealPath("WEB-INF/1.jpeg");
        FileInputStream fileInputStream = new FileInputStream(new File(realPath));
        int length = 0;
        byte[] bytes = new byte[1024];
        while ((length = fileInputStream.read(bytes)) != -1){
            outputStream.write(bytes, 0, length);
        }
        //关闭流
        fileInputStream.close();
        //关于ServletOutputStream可以关闭也可以不关闭,如果不关闭,tomcat会帮我们关闭
        outputStream.close();
    }
}

下载的应用场景:
管理系统中有一个页面可以显示图表数据,导出到excel按钮。

posted @ 2022-06-01 21:05  向着年薪百万前进  阅读(55)  评论(0)    收藏  举报