1.HttpServletResponse类的简介

HttpServletResponse类是实现响应的一个类,他将将要响应的数据封装到response对象里面,通过特定的方法响应。响应数据的响应行,响应头,响应体分别由setStatus()、setHeader ()、getWriter() 和getOutputStream()几个方法实现。下面着重介绍 getWriter()(响应字符数据) 和getOutputStream()(响应字节数据)方法。前面我们说到Servlet请求的转发,他是在服务器里面跳转资源的方式。这里介绍的重定向也有类似的功能,但是实现的原理有所不同。

2.响应字符数据

通过response对象,将你想要响应到客户端的字符型数据发送到浏览器里面。只用两步就可以实现:
1、先通过response对象获取字符输出流:PrintWriter writer = resp.getWriter();
2、将你想要写的数据通过write()方法响应到客户端:writer.write()。

public class HttpServletResponse001 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.write("hello servlet!!!");
    }
}

实现效果
需要注意的几点:
1.response不仅可以返回纯文本,还可以HTML的各个标签。在返回标签时要注意先把响应响应头的ContentType属性改成text/html格式,不然浏览器会默认把相应的内容当成纯文本解析。

public class HttpServletResponse001 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        PrintWriter writer = resp.getWriter();
        writer.write("hello servlet!!!");
        writer.write("<br/>name:<input type = 'text'/>");
    }
}

在这里插入图片描述
2.如果响应的是中文的内容,需要把响应头字体类型改成UTF-8。因为服务器默认的字体类型是ISO-8859-1,如果不修改会导致浏览器解析乱码。
在这里插入图片描述
在这里插入图片描述

public class HttpServletResponse001 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        resp.setContentType("text/html");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.write("我的servlet程序!!!");
        writer.write("<br/>姓名:<input type = 'text'/>");
    }
}

3.修改响应头等信息需要在通过response对象获取字符输出流就完成,在后面才修改没有效果。
在这里插入图片描述
在这里插入图片描述

public class HttpServletResponse001 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        resp.setContentType("text/html");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
//        resp.setContentType("text/html;charset=utf-8");
        writer.write("aaaaa这是在获取输入流对象之前就修改响应头的。");
        writer.write("<br/>姓名:<input type = 'text'/>");
    }
}

4.响应结束后,相应的字符流不需要关闭。他不需要向像Java基础里面字节输入流那种最后需要手动关闭流节省资源。因为在响应结束后,response对象自动销毁,服务器会对其关闭。

3.响应字节数据

通过response对象,将你想要响应到客户端的字符型数据发送到浏览器里面。大致需要3步完成:
1、读取文件(图片,音频,视频等二进制输入输出数据)
2、获取字节输出流
3、通过write()方法响应给客户端

public class HttpServletResponse002 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.读物文件
        FileInputStream inputStream = new FileInputStream("C:\\Users\\cx\\Desktop\\1.png");
        //2.获取字节输出流
        ServletOutputStream outputStream = resp.getOutputStream();
        //3.打印文件
        byte []b = new byte[2048];
        int len = 0;
        while ((len = inputStream.read(b))!=0){
            outputStream.write(b,0,len);
        }
        inputStream.close();
    }
}

在这里插入图片描述

4.重定向

1.重定向与请求的转发的区别

  • 重定向特点;
    (1)浏览器地址栏会发生改变,会变成servlet程序1中指定的地址
    (2)是两次请求
    (3)多个servlet程序不共享request对象内的数据
    (4)不可以访问WEB-INF下的资源
    (5)可以访问工程以外的其他连接(例如百度、谷歌等网页资源)
  • 请求转发的特点(参考我另一篇博客)
    (1)浏览器地址栏没有发生变化。
    (2)多个servlet程序是同一个请求
    (3)多个servlet程序共享一个request对象
    (4)可以转发到WEB-INF目录下

2.重定向与请求转发的图示区别
求情的转发:
在这里插入图片描述
重定向:
在这里插入图片描述

3.重定向程序的实现
第一种:

@WebServlet("/httpServletResponse003")
public class HttpServletResponse003 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.write("servlet001!!!");

        //设置响应状态码(302)
        resp.setStatus(302);
        //设置响应头,告诉新地址在哪
        resp.setHeader("location","http://localhost:8888/servlet_war_exploded/httpServletResponse004");
    }
}

第二种:

@WebServlet("/httpServletResponse005")
public class HttpServletResponse005 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("http://localhost:8888/servlet_war_exploded/httpServletResponse004");
    }
}

在这里插入图片描述
两种方法只要访问了第一个servlet程序再回车,浏览器会自动跳到localhost:8888/servlet_war_exploded/httpServletResponse004而且浏览器地址栏会发生变化。与请求不同,虽然是两个页面,但是是同一个地址(即浏览器地址栏不会发生变化),这与上述所说的第一个特点相对应。

在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐