侧边栏壁纸
博主头像
coydone博主等级

记录学习,分享生活的个人站点

  • 累计撰写 306 篇文章
  • 累计创建 51 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Response

coydone
2022-02-05 / 0 评论 / 0 点赞 / 342 阅读 / 2,876 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-04-09,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

注解开发取代web.xml

@WebServlet,注解添加到自己定义的Servlet中的类声明上即可。注解的属性 urlPatterns,属性值就是浏览器的访问地址。

IDEA配置代码模板

非注解版的

注解版的

HttpServletResponse类

概述

response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse。在客户端发出每个请求时,服务器都会创建一个response对象,并传入给Servlet.service()方法。response对象是用来对客户端进行响应的,这说明在service()方法中使用response对象可以完成对客户端的响应工作。

response对象的功能分为以下四种:

  • 设置响应头信息;

  • 发送状态码;

  • 设置响应正文;

  • 重定向;

注解创建Servlet

在包下新建new、选择Create new Servlet、文件名该为/加首字母小写。

//@WebServlet(name = "HelloServlet",urlPatterns = "/helloServlet")
//name = "HelloServlet":servlet名称,相当于web.xml中的<servlet-name>
//urlPatterns = "/helloServlet":servlet的访问路径,相当于<url-pattern>
@WebServlet(urlPatterns = "/helloServlet")
public class HelloServlet extends HttpServlet {
}

响应正文

response是响应对象,向客户端输出响应正文(响应体)可以使用response的响应流,repsonse 一共提供了两个响应流对象:

字节流 :getOutputStream():常用于下载(传递二进制数据) 。

字符流 :getWriter():常用于回传字符串(常用) 。

  • PrintWriter out = response.getWriter():获取字符流。

  • ServletOutputStream out = response.getOutputStream():获取字节流。

当然,如果响应正文内容为字符,那么使用response.getWriter(),如果响应内容是字节,例如下载时,那么可以使用response.getOutputStream()。

注意,在一个请求中,不能同时使用这两个流。也就是说,要么你使用repsonse.getWriter(),要么使用response.getOutputStream(),但不能同时使用这两个流。不然会抛出IllegalStateException异常。

**往客户端回传数据 **

public class ResponseIOServlet extends HttpServlet { 
    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    // 要求 : 往客户端回传 字符串 数据。 
    PrintWriter writer = resp.getWriter(); 
    writer.write("response's content!!!"); 
    } 
} 

缓冲区

response.getWriter()是PrintWriter类型,所以它有缓冲区,缓冲区的默认大小为8KB。也就是说,在响应数据没有输出8KB之前,数据都是存放在缓冲区中,而不会立刻发送到客户端。当Servlet执行结束后,服务器才会去刷新流,使缓冲区中的数据发送到客户端。如果希望响应数据马上发送给客户端:

  • 向流中写入大于8KB的数据;

  • 调用response.flushBuffer()方法来手动刷新缓冲区;

响应的乱码解决

解决响应中文乱码方案一(不推荐使用):

// 设置服务器字符集为 UTF-8 
resp.setCharacterEncoding("UTF-8"); 
// 通过响应头,设置浏览器也使用 UTF-8 字符集 
resp.setHeader("Content-Type", "text/html; charset=UTF-8");

解决响应中文乱码方案二(推荐):

// 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头 
// 此方法一定要在获取流对象之前调用才有效 
resp.setContentType("text/html; charset=UTF-8"); 

设置响应头信息

可以使用response对象的setHeader()方法来设置响应头。使用该方法设置的响应头最终会发送给客户端浏览器。

response.setHeader(“content-type”, “text/html;charset=utf-8”):设置content-type响应头,该头的作用是告诉浏览器响应内容为html类型,编码为utf-8。而且同时会设置response的字符流编码为utf-8,即response.setCharaceterEncoding(“utf-8”)

response.setHeader("Refresh","5; URL=http://www.baidu.com"):5秒后自动跳转到百度主页。

请求重定向

请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求重定向(因为之前的地址可能已经被废弃)。

重定向使用场景:跨域访问 、希望修改浏览器地址栏的路径。

重定向是两次请求;增加访问压力。

重定向的URL可以是其他应用,不局限于当前应用。

重定向的响应头为302,并且必须要有Location响应头。

重定向就不要再使用response.getWriter()或response.getOutputStream()输出数据,不然可能会出现异常。

请求重定向的第一种方案:

// 设置响应状态码 302 ,表示重定向,(已搬迁) 
resp.setStatus(302); 
// 设置响应头,说明 新的地址在哪里 
resp.setHeader("Location", "http://localhost:8080"); 

请求重定向的第二种方案(推荐使用):

resp.sendRedirect("http://www.baidu.com");
//重定向的URL地址为:http://localhost:8080/hello/BServlet
resp.sendRedirect("/hello/BServlet");
0

评论区