概述
servlet-api 4.0.1版本
Web服务器收到客户端的http请求,会针对每一次请求,创建一个代表响应的response对象,这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。
详细方法可以在IDEA里直接点进去看
常用方法
HttpServletResponse
扩展ServletResponse接口以在发送响应时提供特定于HTTP的功能
可以找到所有的响应码:
public void addCookie(Cookie cookie); // 将指定的cookie添加到响应中。可以多次调用此方法来设置多个cookie
public boolean containsHeader(String name); // 返回一个布尔值,指示命名的响应头是否已经设置
public String encodeURL(String url); //
public String encodeRedirectURL(String url); // 编码含有中文的重定向链接
public void sendError(int sc, String msg) throws IOException;
public void sendError(int sc) throws IOException;
public void sendRedirect(String location) throws IOException; // 重定向功能
public void setDateHeader(String name, long date); // 设定具有指定日期的头
public void addDateHeader(String name, long date);
public void setHeader(String name, String value); // 使用给定的名称和值设置响应头。 如果已设置,则新值将覆盖前一个值
public void addHeader(String name, String value); // 添加具有给定名称和值的响应头。 此方法允许响应标头具有多个值
public void setIntHeader(String name, int value); // 用给定的名称和整数值设置响应头。 如果已设置标题,则新值将覆盖前一个值
public void addIntHeader(String name, int value); // 添加具有给定名称和整数值的响应标头。 此方法允许响应标头具有多个值
public void setStatus(int sc); // 设置此响应的状态码
public int getStatus(); // 获取此响应的当前状态代码
public String getHeader(String name); // 获取具有给定名称的响应头的值。如果具有给定名称的响应标头存在并且包含多个值,则将返回最先添加的值。
public Collection<String> getHeaders(String name); // 获取具有给定名称的响应头的值组
public Collection<String> getHeaderNames(); // 获取此响应的标头名称
ServletResponse
public String getCharacterEncoding(); // 返回用于此响应中发送的正文的字符编码(MIME字符集)的名称
public String getContentType(); // 返回用于此响应中发送的MIME正文的内容类型。 在提交响应之前,必须已经使用setContentType指定了适当的内容类型
public ServletOutputStream getOutputStream() throws IOException; // 返回适合于在响应中写入二进制数据的ServletOutputStream。 Servlet容器不对二进制数据进行编码
public PrintWriter getWriter() throws IOException; // 返回一个PrintWriter对象,该对象可以将字符文本发送到客户端。 PrintWriter使用getCharacterEncoding返回的字符编码
public void setCharacterEncoding(String charset); // 设置用于此响应中发送的正文的字符编码(MIME字符集)的名称
public void setContentType(String type); // 设置用于此响应中发送的MIME正文的内容类型
public void setContentLength(int len);
public void setBufferSize(int size); // 设置响应主体的首选缓冲区大小。 Servlet容器将使用至少与请求的大小一样大的缓冲区
public int getBufferSize(); // 返回用于响应的实际缓冲区大小。 如果不使用缓冲,则此方法返回0
public void flushBuffer() throws IOException; // 强制将缓冲区中的任何内容写入客户端。 对此方法的调用将自动提交响应,这意味着将写入状态代码和标头
public void resetBuffer(); // 清除响应中基础缓冲区的内容,而不清除标头或状态码
public boolean isCommitted(); // 返回一个布尔值,指示是否已提交响应。 提交的响应已经写入了其状态代码和标头
public void reset(); // 清除缓冲区中存在的所有数据以及状态代码,标头
public void setLocale(Locale loc); // 设置响应的语言环境。 如果尚未使用setContentType或setCharacterEncoding显式设置字符编码,它还会针对区域设置适当地设置响应的字符编码
public Locale getLocale(); // 使用setLocale方法返回为此响应指定的语言环境。 如果未指定任何语言环境,则返回容器的默认语言环境。
细节:
- response获得的流不需要手动关闭,web容器(tomcat容器)会帮助我们关闭
- getWriter和getOutputStream不能同时调用
- 重定向语句一般作为终结代码
浏览器乱码问题
设置浏览器响应类型,指定浏览器解析时用的编码,包含setCharacterEncoding()
功能,写在开头
response.setContentType("text/html;charset=UTF-8");
重定向
B一个web资源收到客户端A请求后,B他会通知A客户端去访问另外一个web资源C,这个过程叫重定向
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重定向到 /hello
// 如果有项目名要加上完整路径 /myweb/hello
response.sendRedirect("/hello");
}
重定向和转发的区别
- 相同点
* 页面都会实现跳转 - 不同点
* 请求转发的时候,url不会产生变化,不需要加虚拟路径,307
* 重定向时候,url地址栏会发生变化,需要加虚拟路径,302