概述
1、HttpServletResponse接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar。
2、HttpServletResponse接口实现类由Http服务器负责提供。
3、HttpServletResponse接口负责将doGet/doPost方法执行结果写入到【响应体】交给浏览器。
4、开发人员习惯于将HttpServletResponse接口修饰的对象称为【响应对象】。
主要功能:
1、将执行结果以二进制形式写入到【响应体】。
2、设置响应头中[content-type]属性值,从而控制浏览器使用对应编译器将响应体二进制数据编译为【文字、图片、视频、命令】。
3、设置响应头中【location】属性,将一个请求地址赋值给location,从而控制浏览器向指定服务器发送请求。
代码示例
package com.zyh.contrller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
public class OneServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {
//执行结果
String result = "Hello world!";
/*响应对象将结果写入到响应体*/
//1、通过响应对象,向Tomcat索要输出流
PrintWriter out = response.getWriter();
//2、通过输出流,将执行结果以二进制形式写入到响应体
out.write(result);
/*---至此doGet执行完毕,Tomcat将响应包推送给浏览器*/
}
}
package com.zyh.contrller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class TwoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int i = 50;
PrintWriter out = response.getWriter();
/*out.write(i);*/
/*------浏览器显示2,而不是50------*/
/*
* 问题描述:
* 浏览器接收到数据是2,不是50。
* 问题原因:
* out.writer方法可以将【字符、字符串、ASCII码】写入到响应体。
* 50对应的ASCII码是2。
* 解决方案:
* 通过out.print()将真实数据写入到响应体
*/
out.println(i);
}
}
package com.zyh.contrller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ThreeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//既有文字信息,又有HTML
String result = "aaa</br>bbb</br>ccc</br>";
//包含中文,要设置charset=UTF-8
String result2 = "烧烤</br>火锅</br>啤酒</br>";
//设置响应头
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println(result);
out.println(result2);
/*
* String result = "aaa</br>bbb</br>ccc</br>";
PrintWriter out = response.getWriter();
out.println(result);
* 响应结果依然是:
* aaa</br>bbb</br>ccc</br>
* 没有执行HTML命令。
*
* 原因:
* 浏览器在接收到响应包之后,根据响应头中(content-type)属性的值,
* 来采用对应编译器对响应体中二进制内容进行编译处理。
* 默认的情况下,content-type属性的值为"text"
* (content-type="text")。
* 此时浏览器将会采用文本编译器对响应体二进制数据进行解析。
*
* 解决办法:
* 在得到输出流之前,通过响应对象对响应头中
* content-type属性进行重新赋值,
* 指定浏览器采用正确编译器。
*/
}
}
package com.zyh.contrller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class FourServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 浏览器在接收到响应包之后,
* 如果发现响应头中存在Location属性,
* 自动通过地址栏向Location指定网站发送请求。
* sendRedirect方法远程控制浏览器请求行为。
* 请求行为:请求地址、请求方式、请求参数。
*/
String result = "http://www.baidu.com";
//通过响应对象,将地址赋值给响应头中Location属性
response.sendRedirect(result);
}
}
跳转到百度首页:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>OneServlet</servlet-name>
<servlet-class>com.zyh.contrller.OneServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>TwoServlet</servlet-name>
<servlet-class>com.zyh.contrller.TwoServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>ThreeServlet</servlet-name>
<servlet-class>com.zyh.contrller.ThreeServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>FourServlet</servlet-name>
<servlet-class>com.zyh.contrller.FourServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>OneServlet</servlet-name>
<url-pattern>/one</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>TwoServlet</servlet-name>
<url-pattern>/two</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ThreeServlet</servlet-name>
<url-pattern>/three</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>FourServlet</servlet-name>
<url-pattern>/four</url-pattern>
</servlet-mapping>
</web-app>