新建一个项目,创建一个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响应协议包发送给浏览器,
浏览器接收到数据后,读取响应体中的执行结果,将其展示到浏览器上。
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); }
通过浏览器访问,可以接收到真实数据。
新创建一个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。
将一句包含中文的字符串写入到响应体中:
@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); }
响应对象可以调用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); }