1.HttpServletResponse对象
在Servlet API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP响应消息。由于HTTP响应消息分为状态行、响应消息头、消息体三部分,因此,在HttpServletResponse接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。
2.发送状态码相关的方法
当Servlet向客户端回送响应消息时,需要在响应消息中设置状态码。为此,在HttpServletResponse接口中,定义了两个发送状态码的方法,具体如下。
setStatus(int status)方法
该方法用于设置HTTP响应消息的状态码,并生成响应状态行。由于响应状态行中的状态描述信息直接与状态码相关,而HTTP版本由服务器确定,因此,只要通过setStatus(int status)方法设置了状态码,即可实现状态行的发送。需要注意的是,正常情况下,Web服务器会默认产生一个状态码为200的状态行。
@WebServlet(urlPatterns = "/state")
public class StateServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setStatus(404);
}
}
3.发送响应消息头相关的方法
当Servlet向客户端发送响应消息时,由于HTTP协议的响应头字段有很多种,为此,在HttpServletResponse接口中,定义了一系列设置HTTP响应头字段的方法。
需要注意的是,在列举的一系列方法中,addHeader()、setHeader()、addIntHeader()、setIntHeader()方法都是
用于设置各种头字段的,而setContetType() 和setCharacterEncoding()方法用于设置字符编码,这些设置字符编码的方法可以有效解决乱码问题。
package hm04_response;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
@WebServlet(urlPatterns = "/head")
public class HeadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
/*
添加头信息 : addHeader(key, value) , 添加头信息键值对, 键可以重复.
设置头信息: setHeader(key,value) , 设置头信息键值对, 键唯一的. 键重复时, 后面值覆盖前面的值.
=========================
了解 : setIntHeader setDateHeader ,几乎不会调用 ,因为 字符串类型可以替代.
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 添加 头信息
// response.addHeader("name" , "tom");
// response.addHeader("name" , "tom");
// response.addHeader("name" , "tom");
// 设置头信息
response.setHeader("name" , "tom");
response.setHeader("name" , "tom");
response.setHeader("name" , "tom");
response.setHeader("name" , "tommy");
response.setHeader("Date" , new Date().toString());
}
}
package hm04_response;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
@WebServlet(urlPatterns = "/head2")
public class Head2Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
/*
添加头信息 : addHeader(key, value) , 添加头信息键值对, 键可以重复.
设置头信息: setHeader(key,value) , 设置头信息键值对, 键唯一的. 键重复时, 后面值覆盖前面的值.
=========================
了解 : setIntHeader setDateHeader ,几乎不会调用 ,因为 字符串类型可以替代.
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 测试 自动跳转 :
// 格式 : "时间(秒); URL=地址"
response.setHeader("Refresh","5; URL=https://www.baidu.com");
response.getWriter().println("5 秒 自动跳转到 baidu.com");
}
}
4.解决中文输出乱码问题
在开发中,如果需要响应给浏览器中文数据,我们需要使用getWriter()方法,tomcat使用getWriter()处理字符时,默认编码时ISO8859-1。响应给浏览器的数据,此时为乱码。在开发中我们需要使用setCharacterEncoding方法来设置编码。此时响应给浏览器的数据为正常数据,但浏览器查看编码,可能使我们查看到内容仍为乱码,需要使用响应头 content-type进行设置。
在HttpServletResponse对象中,提供了两种解决乱码的方案,具体如下:
第一种方式:
// 设置HttpServletResponse使用utf-8编码,此数据提供给tomcat使用。
response.setCharacterEncoding("utf-8");
// 通知浏览器查看编码为utf-8
response.setHeader("Content-Type","text/html;charset=utf-8");
第二种方式:
使用通用方法,setContentType底层自动调用了setCharacterEncoding
response.setContentType("text/html;charset=utf-8");
5.发送响应消息体相关的方法
由于在HTTP响应消息中,大量的数据都是通过响应消息体传递的,因此,ServletResponse遵循以IO流传递大量数据的设计理念。在发送响应消息体时,定义了两个与输出流相关的方法,具体如下。
getOutputStream()方法
该方法所获取的字节输出流对象为ServletOutputStream类型。由于ServletOutputStream是OutputStream的子类,它可以直接输出字节数组中的二进制数据。因此,要想输出二进制格式的响应正文,就需要使用getOutputStream()方法。
getWriter()方法
该方法所获取的字符输出流对象为PrintWriter类型。由于PrintWriter类型的对象可以直接输出字符文本内容,因此,要想输出内容全为字符文本的网页文档,需要使用getWriter()方法。
6.重定向
package hm05_redirect;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
重定向 :
浏览器请求 AServlet , 由于A无法处理请求 , 将 此请求 重新定向到 BServlet ,此过程就是重定向.
response的方法 :
sendRedirect("路径") : 由于是重新定向 , 再次发起的请求来自于服务器外部, 所有需要添加 项目名称
举例 : "/web09/b"
*/
@WebServlet(urlPatterns = "/a")
public class AServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("AServlet.doGet");
// 设置 重定向
response.sendRedirect("/day09/b");
}
}
package hm05_redirect;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/b")
public class BServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// response.getWriter().println("BBBBBBBBBBBBB");
// 重定向 登录页面
response.sendRedirect("/day09/login.jsp");
}
}