HttpServletResponse代表的是一个HTTP请求对应的响应。
在这一篇文章当中,已经提到了HTTP响应是由哪几部分组成的:
【网络原理7】认识HTTP_革凡成圣211的博客-CSDN博客HTTP抓包,Fiddler的使用https://blog.csdn.net/weixin_56738054/article/details/129148515?spm=1001.2014.3001.5502
第一部分:HTTP响应行(包含HTTP版本、状态码、对于状态码的简单描述);
第二部分:HTTP报头(多组键值对);
第三部分:HTTP响应体(body)。
目录
void setStatus(int snc)
resp.setHeader(k,v)和resp.addHeader(k,v)
void setContentType(String type)
如何让浏览器自动刷新(每隔一段时间就刷新一下)
void setCharacterEncoding(字符集编码)
void sendRedirect(跳转的URL);
这一个方法用于设置响应的状态码:常见的状态码有200/400等等。
resp.setStatus(400);
打开开发者工具,可以看到一个400的响应码:
需要注意的是,通过这个方法设置的状态码并不影响浏览器的对于body的响应。
在前面的文章当中,我们也提到了:HTTP的响应头是由多组键值对组成的。
以上两个方法,都是在HTTP响应头当中设置新的响应头的方法。
但是,也是有不同的:
对于resp.setHeader(k,v),将会设置一个带有给定名称的值的header。如果已经有一个键了,那么这个值就会覆盖掉原来的值。
对于resp.addHeader(k1,v1),如果已经有旧的键值对(k1,v0)和新增的一致(k1,v1)。那么将会新增一个键值对(k1,v1)
//会覆盖掉旧的key对应的valueresp.setHeader("hello","hello1");//不会覆盖掉旧的key,而是新增一个key,value结构的键值对resp.addHeader("hello2","hello2");
可以看到,此时新增的内容就可以通过Fidller抓包看到了:
前面我们也提到了,HTTP响应头当中有一个属性叫做:Content-Type
那么,resp就可以通过这个方法来设置响应头的格式:如:
resp.setContentType("text/html");
text/html、text/json、text/json等等的格式。
需要在HTTP响应头当中设置一个属性:Refresh,并且指定隔多久刷新一次。
//设置响应字符集
resp.setCharacterEncoding("utf-8");
//在HTTP响应头当中新增一个属性:Refresh,并且设置每隔1秒刷新一次
resp.setHeader("Refresh","1");
resp.getWriter().write("时间戳:"+System.currentTimeMillis());
运行效果(每隔1秒刷新一次)
设置被发送到客户端的响应的字符编码
resp.setCharacterEncoding("utf-8");
描述的是重定向到哪一个URL。
注意事项:
这一个URL必须是完整的URL,不可以是/servlet3这样的。
重定向一般都是get请求
resp.sendRedirect("http://localhost:8080/ServletLearning_war_exploded/servlet3");
当然,也可以直接设置resp.setHeader(Location,需要跳转的资源)来实现重定向。
resp.setHeader("Location","https://www.baidu.com");
首先,需要创建一个实体类,里面封装3个属性:
class Message{/*** 从哪个地方来*/public String from;/*** 到哪个地方去*/public String to;/*** 想说的话是什么*/public String message;
}
然后,重写doPost方法,使用objectMapper接收json格式的字符串。
并且设置响应的格式:application/json:
ps:
如果不这样设置,服务器就仅仅只会把响应的内容当作普通的字符串进行处理。
/*** json格式的字符串转换工具*/private ObjectMapper mapper=new ObjectMapper();/*** 用来保存消息列表*/private List list=new ArrayList<>();/*** 客户端向服务器提交json字符串* 请求对象@param req* 响应对象@param resp* 异常@throws ServletException* 异常@throws IOException*/@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//消息Message message=mapper.readValue(req.getInputStream(),Message.class);//把消息保存到内存当中list.add(message);//告诉服务器,以json格式的字符串进行返回resp.setContentType("application/json;charset=utf-8");//返回ok,表示接收成功.resp.getWriter().write("{\"ok\": true}");}
运行的结果:
需要调用ObjectMapper的writeValueAsString方法把list转化为json的字符串。
并且设置响应的格式:"application/json"。告诉服务器需要以json格式的字符串进行响应。
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取到消息列表String json=mapper.writeValueAsString(list);//设置响应格式:以json的格式进行响应resp.setContentType("application/json;charset=utf-8");//回写json字符串resp.getWriter().write(json);}
但是,如果重启一下服务器,然后再次使用Fidller抓包,那就看不到响应的结果了:
原因在于:我们刚刚在程序当中保存消息列表的的List是把数据保存在内存当中的。
内存无法做到持久化数据存储,也就是服务器重启之后,数据就会丢失。
但是页面刷新,不会造成数据的丢失,仍然可以看到页面上面存储的数据。
如果想要把这个数据保持久化存储,那么就需要把list的内容存储到磁盘。
存储到磁盘有两种方式:
方式1:jdbc连接数据库;
方式2:IO流存储数据