Bootstrap

HttpServletResponse对象-Javaweb请求与响应

~本特利~

HttpServletResponse对象

Servlet最主要的作用就是处理客户端请求,并向客户端做出响应。为此,针对Servlet的每次请求,Web服务器在调用service()方法之前,都会创建两个对象,分别是HttpServletRequest和HttpServletResponse。
其中,HttpServletRequest用于封装HTTP请求消息,简称request对象。HttpServletResponse用于封装HTTP响应消息,简称response对象。

request对象和response对象在请求Servlet过程中至关重要,接下来,通过一张图来描述浏览器访问Servlet的交互过程,如图所示:

在这里插入图片描述

需要注意的是,在Web服务器运行阶段,每个Servlet都只会创建一个实例对象。然而,每次HTTP请求,Web服务器都会调用所请求Servlet实例的service(HttpServletRequest request,HttpServletResponse response)方法,重新创建一个request对象和一个response对象。

🤞 发送状态码相关的方法

  • 在Servlet API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP响应消息。
  • 由于HTTP响应消息分为状态行、响应消息头、消息体三部分,因此,在HttpServletResponse接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。

当Servlet向客户端回送响应消息时,需要在响应消息中设置状态码。为此,在HttpServletResponse接口中,定义了两个发送状态码的方法,具体如下。

1.setStatus(int status)方法

该方法用于设置HTTP响应消息的状态码,并生成响应状态行。由于响应状态行中的状态描述信息直接与状态码相关,而HTTP版本由服务器确定,因此,只要通过setStatus(int status)方法设置了状态码,即可实现状态行的发送。需要注意的是,正常情况下,Web服务器会默认产生一个状态码为200的状态行。

2.sendError(int sc)方法

该方法用于发送表示错误信息的状态码,例如,404状态码表示找不到客户端请求的资源。在response对象中,提供了两个重载的sendError(int sc)方法,具体如下:
在这里插入图片描述

在上面重载的两个方法中,第一个方法只是发送错误信息的状态码,而第二个方法除了发送状态码外,还可以增加一条用于提示说明的文本信息,该文本信息将出现在发送给客户端的正文内容中。


🤞发送响应消息头相关方法

当Servlet向客户端发送响应消息时,由于HTTP协议的响应头字段有很多种,为此,在HttpServletResponse接口中,定义了一系列设置HTTP响应头字段的方法,如表所示。
在这里插入图片描述
在这里插入图片描述


🤞发送响应消息体相关方法

由于在HTTP响应消息中,大量的数据都是通过响应消息体传递的,因此,ServletResponse遵循以IO流传递大量数据的设计理念。在发送响应消息体时,定义了两个与输出流相关的方法,具体如下。

1.getOutputStream()方法

该方法所获取的字节输出流对象为ServletOutputStream类型。由于ServletOutputStream是OutputStream的子类,它可以直接输出字节数组中的二进制数据。因此,要想输出二进制格式的响应正文,就需要使用getOutputStream()方法。

2.getWriter()方法

该方法所获取的字符输出流对象为PrintWriter类型。由于PrintWriter类型的对象可以直接输出字符文本内容,因此,要想输出内容全为字符文本的网页文档,需要使用getWriter()方法。


🤞案例代码

使用getOutputStream()方法或者getWriter()方法获取字节输出流对象。

了解了response对象发送响应消息体的两个方法后,接下来,通过一个案例来学习这两个方法的使用

建立web项目,在src下建个包,包下编一个名为PrintServlet的Servlet类,在类中使用getOutputStream()方法或者getWriter()方法获取字节输出流对象。

public class PrintServlet extends HttpServlet {
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)throws ServletException, IOException {
        String data = "itcast";
        // 获取字节输出流对象
        
	       //使用getOutputStream()方法发送消息体
		   // OutputStream out = response.getOutputStream();
           //out.write(data.getBytes());// 输出信息	

          //使用getWriter()方法发送消息体
          PrintWriter print = response.getWriter();
          print.write(data); // 输出信息
    }
    public void doPost(HttpServletRequest request,
                       HttpServletResponse response)throws ServletException, IOException {
        doGet(request, response);
    }
}

在web.xml中配置映射:

  <servlet>
        <servlet-name>PrintServlet</servlet-name>
        <servlet-class>cn.edu.demo04.response.PrintServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>PrintServlet</servlet-name>
        <url-pattern>/PrintServlet</url-pattern>
    </servlet-mapping>

在浏览器中:
在这里插入图片描述


注意:
虽然response对象的getOutputStream()和getWriter()方法都可以发送响应消息体,但是,它们之间互相排斥,不可同时使用,否则会发生IllegalStateException异常,如图所示。
在这里插入图片描述
图中发生异常的原因就是在Servlet中,调用response.getWriter() 方法之前已经调用了response.getOutputStream() 方法。

HttpServletResponse应用-Javaweb请求与响应

;