JavaWeb-03-Servlet-04-HttpServletResponse接口
HttpServletResponse接口
1.HttpServletResponse简介
- HttpServletResponse接口来自于Servlet规范中,存在于Tomcat中的servle-api.jar,具体位置是【javax.servlet.http.HttpServletResponse】
- HttpServletResponse接口实现类由Http服务器负责提供。
- HttpServletResponse接口负责将doGet/doPost方法执行结果写入到【Http响应协议包】的【响应体】中交给浏览器。
- 开发人员习惯将HttpServletResponse接口修饰的对象称为【响应对象】
2.响应对象的主要功能
- 将执行结果以二进制形式写入到【响应体】中
- 设置【响应头】中【content-type】的属性值,从而控制浏览器使用对应的编译器将响应体中的二进制数据编译为【文字、图片、视频、命令】
- 设置响应头中的【location】属性,将一个请求地址赋给location,从而远程控制浏览器向指定服务器发送请求。
3.功能实现1:响应对象将方法中执行结果写入响应体
3.1实现流程
新建一个项目,创建一个Servlet接口实现类。
重写doGet()方法,在方法内使用HttpServletResponse接口对象将执行结果写入到响应体中。
package com.tsccg.controller;
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;
/**
* @Author: TSCCG
* @Date: 2021/08/13 13:16
* 响应对象将执行结果写入到响应体中
*/
public class OneServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//执行结果
String str = "Hello World";
//---响应对象将执行结果写入到响应体中---
//1.通过响应对象向Tomcat索要输出流
PrintWriter out = response.getWriter();
//2.通过输出流将执行结果以二进制形式写入到响应体中
out.write(str);
//response.getWriter().write(str);//合起来写
//---响应对象将执行结果写入到响应体中---
}//doGet方法执行结束,服务器将Http响应协议包推送给浏览器
}
发布网站后,开启服务器,通过浏览器向Tomcat服务器发起请求访问OneServlet:
Tomcat服务器接收到请求后,创建一个OneServlet的实例对象,然后通过该实例对象调用其doGet()方法。
在doGet方法中,得到执行结果后,通过响应对象response向Tomcat服务器索要一个输出流对象:
PrintWriter out = response.getWriter();
然后通过输出流对象调用write()方法将执行结果写入到Http响应协议包的响应体中:
out.write(str);
doGet方法执行结束后,服务器将带有执行结果的Http响应协议包发送给浏览器,
浏览器接收到数据后,读取响应体中的执行结果,将其展示到浏览器上。
3.2write和print
write()方法可以将【字符】、【字符串】、【ASCII码】写入到响应体中。
上面程序中,写入一个字符串没有什么问题,但如果写入的是一个数字的话,就会将数字当作是一个ASCII码。
把上面程序中的执行结果换成97,重启服务器,重新写入响应体:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//执行结果
//String str = "Hello World";
int result = 97;
//1.通过响应对象向Tomcat索要输出流
PrintWriter out = response.getWriter();
//2.通过输出流将执行结果以二进制形式写入到响应体中
out.write(result);
}
通过浏览器访问,得到的结果是ASCII码中97对应的字符【a】。
当我们想写入一个真实数据时,使用write()显然不可行。
此时,我们可以使用print()方法。
print()方法可以将真实数据写入响应体中。
使用print()方法重新写入:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//执行结果
int result = 97;
//1.通过响应对象向Tomcat索要输出流
PrintWriter out = response.getWriter();
//2.通过输出流将执行结果以二进制形式写入到响应体中
//out.write(result);
out.print(result);
}
通过浏览器访问,可以接收到真实数据。
4.功能实现2:设置响应头中content-type的属性值
4.1设置编译html标签命令
新创建一个Servlet接口实现类TwoServlet:
将一句包含html标签的字符串作为执行结果写入响应体中。
package com.tsccg.controller;
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;
/**
* @Author: TSCCG
* @Date: 2021/08/13 15:23
*/
public class TwoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//执行结果
String str1 = "java<br>c++<br>python";
//向服务器索要输出流
PrintWriter out = response.getWriter();
//将执行结果以二进制形式写入响应体中
out.print(str1);
}
}
开启服务器,通过浏览器访问TwoServlet
从结果可见,浏览器在接收到响应结果时,将写入的html语句作为文字内容展示在窗口上了,并没有将其作为html标签命令执行。
原因是什么呢?
浏览器在接收到响应包后,根据响应头中的【content-type】属性值,来选择相对应的【编译器】对响应体中的二进制内容进行编译处理。
在默认情况下,【content-type】的属性值为"text",浏览器会使用【文本编辑器】编译响应体中的二进制文件。
如何解决呢?
在得到输出流之前,通过【响应对象】设置响应头中的【content-type】属性值:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//执行结果
String str1 = "java<br>c++<br>python";
//设置响应头中content-type属性值
response.setContentType("text/html");
//向服务器索要输出流
PrintWriter out = response.getWriter();
//将执行结果写入响应体中
out.print(str1);
}
这样,浏览器接收到响应结果时,就会采用【文本编译器】和【HTML命令编译器】一起对响应体中的二进制数据进行编译。
重启服务器并通过浏览器访问TwoServlet。
4.2设置字符编码集
将一句包含中文的字符串写入到响应体中:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String str1 = "java<br>c++<br>python";
String str2 = "北京烤鸭<br>大盘鸡<br>鸡公煲";//中文字符串
//设置响应头中content-type属性值
response.setContentType("text/html");
//向服务器索要输出流
PrintWriter out = response.getWriter();
//将执行结果写入响应体中
out.print(str1);
out.print(str2);
}
重启服务器,通过浏览器访问
由结果可见,写入的中文显示乱码。
原因是响应头中,Content-Type属性值的【字符编码集charset】默认是【ISO-8859-1】,不支持中文。
我们可以在得到输出流之前设置Content-Type的属性值,将字符编码集设置为【utf-8】。
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String str1 = "java<br>c++<br>python";
String str2 = "北京烤鸭<br>大盘鸡<br>鸡公煲";
//设置响应头中content-type属性值
//response.setContentType("text/html");
response.setContentType("text/html;charset=utf-8");
//向服务器索要输出流
PrintWriter out = response.getWriter();
//将执行结果写入响应体中
out.print(str1);
out.print(str2);
}
5.功能实现3:远程控制浏览器发送请求行为
响应对象可以调用sendRedirect方法将一个网址赋值给响应头中的location属性。
浏览器在接收到响应包后,如果发现响应头中有location属性,会自动通过地址栏向location指定的网站发送请求。
新建一个Servlet接口实现类ThreeServlet,通过响应对象调用sendRedirect方法将百度地址赋给响应头中的location属性。
package com.tsccg.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author: TSCCG
* @Date: 2021/08/13 17:31
*/
public class ThreeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//百度地址
String result = "http://www.baidu.com";
//通过响应对象将地址赋给响应头中的location属性
response.sendRedirect(result);
}
}
通过浏览器请求访问ThreeServlet:
浏览器发现响应头中的location属性有地址,会在地址栏写入该地址并发起请求。
sendRedirect方法还可以控制浏览器的【请求地址,请求方式,请求参数】。
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//百度地址
//String result = "http://www.baidu.com";
String result = "http://www.baidu.com?username=zhangsan";//【请求参数】
//通过响应对象将地址赋给响应头中的location属性
response.sendRedirect(result);
}