运行
3.HTTP协议
客户端浏览器和服务器端Servlet通过HTTP协议进行通信,HTTP 协议采用请求/响应模型,协议的请求报文由请求行、请求头和可选的请求正文组成。
Http请求报文结构
4.构建响应消息头
响应头有两类设置方法,一类是addXxx()方法,另一类是setXxx()方法,addXxx()方法会添加属性,不会覆盖原来的属性。setXxx()会覆盖掉原来的属性
1.addXxx()
addHeader(String name;String value);
addIntHeader(String name;int value);
addDateHeader(String name;long date);
2.setXxx()
setHeader(String name;String value);
setIntHeader(String name;int value);
setDateHeader(String name;long date);
| 响应方法 | 说明 |
| — | — |
| setContentType(String mime) | 设定Content-Type消息头 |
| setContentLength(int length) | 设定Content-Length消息头 |
| addHeader(String name,String value) | 新增String类型的值到名为name的http头部 |
| addIntHeader(String name,int value) | 新增int类型的值到名为name的http头部 |
| addDateHeader(String name,long date) | 新增long类型的值到名为name的http头部 |
| addCookie(Cookie c) | 为Set-Cookie消息头增加一个值 |
示例:使用setHeader()方法设置消息头"Refresh"实现一个页面动态时钟效果
创建ResponseRefreshHeadServlet
package com;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
- Servlet implementation class ResponseRefreshHeadServlet
*/
@WebServlet(“/ResponseRefreshHeadServlet”)
public class ResponseRefreshHeadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
- @see HttpServlet#HttpServlet()
*/
public ResponseRefreshHeadServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
-
@see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
-
response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(“text/html;charset=utf-8”);
response.setHeader(“refresh”, “1”);
PrintWriter out = response.getWriter();
out.print(“现在时间是:”);
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
out.print(sdf.format(date));
}
/**
-
@see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
-
response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
运行
5.创建响应正文
在 Servlet 中,向客户端输出的响应数据是通过输出流对象来完成的,HttpServletResponse 接口提供了两个获取不同类型输出流对象的方法:
| 方法 | 方法描述 |
| — | — |
| getOutputStream() | 返回字节输出流对象ServletOutputStream |
| getWriter() | 返回字符输出流对象PrintWriter |
-
ServletOutputStream 对象主要用于输出二进制字节数据 ,如配合setContentType() 方法响应输出一个图像、视频等。
-
PrintWriter 对象主要用于输出字符文本内容,但其内部实现仍是将字符串转换成某种字符集编码的字节数组后再进行输出 。
-
当向ServletOutputStream或PrintWriter对象中写入数据后,Servlet容器会将这些数据作为响应消息的正文,然后再与响应状态行和各响应头组合成完整的响应报文输出到客户端。同时,在Serlvet的service()方法结束后,容器还将检查getWriter()或getOutputStream(方法返回的输出流对象是否已经调用过close()方法,如果没有,容器将调用close()方法关闭该输出流对象.
示例:使用ServletOutputStream对象响应输出一个服务器端的图案
创建OutputStreamServlet
package com;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
- Servlet implementation class OutputStreamServlet
*/
@WebServlet(“/OutputStreamServlet”)
public class OutputStreamServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
- @see HttpServlet#HttpServlet()
*/
public OutputStreamServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
-
@see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
-
response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(“image/jpeg”);
ServletContext context = getServletContext();
InputStream is = context.getResourceAsStream(“/images/tupian.jpg”);
ServletOutputStream os = response.getOutputStream();
int i = 0;
while ((i = is.read()) != -1) {
os.write(i);
}
is.close();
os.close();
}
/**
-
@see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
-
response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
运行
6.响应输出中文问题
ServletResponse 接口中定义 了 setCharacterEncoding() 、setContentType()和 setLocale() 等方法 来指定 ServletResponse.getWriter() 方法 返回的PrintWriter 对象所使用的字符集编码。
示例:指定字符集编码
response.setCharacterEncoding (“UTF-8”);
response.setContentType (“text/ html;charset =UTF-8”);
response.setLocale (new java.util.Locale (" zh","CN "));// 简体中文
setCharacterEncoding () 、setContentType() 和 setLocale () 三种方法之间的差异分析:
-
setCharacterEncoding() 方法只能用来设置 PrintWriter 输出流中字符的编码方式,它的优先权最高,可以覆盖后面两种方法中的设置;
-
setContentType() 方法既可以设置 PrintWriter 输出流中字符的编码方式,也可以设置浏览器接收到这些字符后以什么编码方式来解码,它的优先权低于第一种方法,但高于第三种方法;
-
setLocale() 方法只能用来设置 PrintWriter 输出流中字符的编码方式,它的优先权最低,在已经使用前两种方法中的一个设置了编码方式以后,它将被覆盖而不再起作用。
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
。**
[外链图片转存中…(img-naiwy3tt-1715713134310)]
[外链图片转存中…(img-Eb4MuwbE-1715713134310)]
[外链图片转存中…(img-LAq71KzX-1715713134310)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!