【Servlet篇3】HttpServletResponse的常用方法

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);


void setStatus(int snc)

  这一个方法用于设置响应的状态码:常见的状态码有200/400等等。

resp.setStatus(400);

 打开开发者工具,可以看到一个400的响应码:

 需要注意的是,通过这个方法设置的状态码并不影响浏览器的对于body的响应


resp.setHeader(k,v)和resp.addHeader(k,v)

在前面的文章当中,我们也提到了:HTTP的响应头是由多组键值对组成的。

以上两个方法,都是在HTTP响应头当中设置新的响应头的方法。

但是,也是有不同的:

        对于resp.setHeader(k,v),将会设置一个带有给定名称的值的header。如果已经有一个键了,那么这个值就会覆盖掉原来的值。

        对于resp.addHeader(k1,v1),如果已经有旧的键值对(k1,v0)新增的一致(k1,v1)。那么将会新增一个键值对(k1,v1)

 //会覆盖掉旧的key对应的value
 resp.setHeader("hello","hello1");

 //不会覆盖掉旧的key,而是新增一个key,value结构的键值对
 resp.addHeader("hello2","hello2");

可以看到,此时新增的内容就可以通过Fidller抓包看到了: 


void setContentType(String type)

前面我们也提到了,HTTP响应头当中有一个属性叫做:Content-Type

那么,resp就可以通过这个方法来设置响应头的格式:如:

resp.setContentType("text/html");

text/htmltext/jsontext/json等等的格式。

 

  如何让浏览器自动刷新(每隔一段时间就刷新一下)

  需要在HTTP响应头当中设置一个属性:Refresh,并且指定隔多久刷新一次。

//设置响应字符集
resp.setCharacterEncoding("utf-8");
//在HTTP响应头当中新增一个属性:Refresh,并且设置每隔1秒刷新一次
resp.setHeader("Refresh","1");
resp.getWriter().write("时间戳:"+System.currentTimeMillis());

   运行效果(每隔1秒刷新一次)


 void setCharacterEncoding(字符集编码)

设置被发送到客户端的响应的字符编码

resp.setCharacterEncoding("utf-8");

void sendRedirect(跳转的URL);

描述的是重定向到哪一个URL。

注意事项:

这一个URL必须是完整的URL,不可以是/servlet3这样的。

重定向一般都是get请求

 resp.sendRedirect("http://localhost:8080/ServletLearning_war_exploded/servlet3");

当然,也可以直接设置resp.setHeader(Location,需要跳转的资源)来实现重定向。

resp.setHeader("Location","https://www.baidu.com");

使用Servlet实现一个表白墙 

步骤1:重写doPost方法,接收消息

首先,需要创建一个实体类,里面封装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<Message> list=new ArrayList<>();

    /**
     * 客户端向服务器提交json字符串
     * 请求对象@param req
     * 响应对象@param resp
     * 异常@throws ServletException
     * 异常@throws IOException
     */
    @Override
    protected 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}");
    }

运行的结果:


 步骤2:重写doGet,把消息列表list的内容转为字符串

 需要调用ObjectMapper的writeValueAsString方法把list转化为json的字符串

 并且设置响应的格式:"application/json"。告诉服务器需要以json格式的字符串进行响应。

 @Override
    protected 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流存储数据

猜你喜欢

转载自blog.csdn.net/weixin_56738054/article/details/129308067