详解响应消息 response

时间:2022-07-26
本文章向大家介绍详解响应消息 response,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1.1 简介

1.1.1 概述

  Response 对象用于动态响应客户端请示,控制发送给用户的信息,并将动态生成响应。Response 对象在 ASP 中负责将信息传递给用户 Response 对象用于动态响应客户端请求,并将动态生成的响应结果返回到客户端浏览器中,使用 Response 对象可以直接发送信息给浏览器,重定向浏览器到另一个 URL 或设置 cookie 的值等。

1.1.2 流程

  Tomcat 服务器会根据请求 URL 中的资源路径,创建对应的 ServletImpl 的对象。然后会创建 Response 对象,将 Response 对象传递给 service 方法,并且调用 service 方法。根据 Request 对象的信息将返回数据封装到 Response 中,将其响应给请求方。

1.2 response 的使用

  我们创建 Servlet 通常是继承 HttpServlet,所以我们一般操作 HttpServletResponse,HttpServletResponse 继承了 ServletResponse。

1.2.1 常用方法

ServletResponse

方法

描述

void flushBuffer( )

强制将缓冲区中的内容写入客户端

String getCharacterEncoding( )

获取响应数据字符编码

String getContentType( )

返回用于此响应中发送的MIME正文的内容类型

ServletOutputStream getOutputStream( )

获取字节输出流

PrintWriter getWriter( )

获取字符输出流

void setCharacterEncoding(String charset)

设置响应数据字符编码

void setContentType(String type)

设置响应消息类型

HttpServletResponse

方法

描述

void addCookie(Cookie cookie)

将指定的cookie添加到响应中

void addHeader(String name, String value)

添加响应头

String getHeader(String name)

根据名称获取响应头的值

void sendRedirect(String location)

使用指定的重定向位置URL向客户端发送临时重定向响应并清除缓冲区

int getStatus()

获取此响应的状态码

void setStatus(int sc)

设置此响应的状态码

void setHeader(String name, String value)

设置响应头

1.2.2 重定向

  重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置,即当一个请求抵达一个 servlet 时,该 servlet 无法处理这个请求,就让请求方去找另外一个 servlet 处理。就好比,老张向老王借 ¥500,老王没有,但是老王告诉老张说:老李有钱,去找他借。然后老张就去找老李借钱了。

重定向步骤

 ① 设置状态码为 302  ② 重定向方法

特点

 ① 地址栏发生变化  ② 重定向可以访问其他站点(服务器)的资源  ③ 重定向是两次请求。不能使用request对象来共享数据

示例

// 设置状态码为302
response.setStatus(302);

// 重定向
// ① 设置响应头 location
response.setHeader("location","/Bservlet");
// ② 简单的重定向方法
response.sendRedirect("/Bservlet");

执行流程

中文乱码

// 设置字符集
response.setCharacterEncoding("utf-8");

// 设置响应消息类型,主要使用
response.setContentType("text/html;charset=utf-8");

1.2.3 ServletContext

  servletContext 接口是 Servlet 中最大的一个接口,呈现了 web 应用的 Servlet 视图。ServletContext 实例是通过 getServletContext( ) 方法获得的,由于 HttpServlet 继承 GenericServlet,GenericServlet 类和 HttpServlet 类同时具有该方法。每个 web 应用都会有一个 ServletContext 对象与之关联,是最大的域对象。

获取 ServletContext

// 通过 request 对象获取
request.getServletContext();

// 通过 HttpServlet 获取
this.getServletContext();

常用方法

方法

描述

String getMimeType(String file)

返回指定文件的 MIME 类型;如果 MIME 类型未知,则返回 null

String getRealPath(String path)

获取与给定虚拟路径相对应的真实路径

void setAttribute(String name,Object object)

设置属性

Object getAttribute(String name)

根据名称获取属性值

MIME   MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。有以下几种常见类型:

MIME

类型

描述

application/msword

doc dot

Microsoft Word

application/vnd.ms-excel

xls

Microsoft Excel

application/vnd.ms-powerpoint

ppt

Microsoft Powerpoint

application/pdf

pdf

Adobe Acrobat

application/octet-stream

bin exe so dll class

可执行程序

application/zip

zip

winzip

application/x-gzip

gz

gzip

image/gif

gif

GIF图像

image/jpeg

jpg jpeg jpe

JPEG图像

image/png

png

PNG图像

text/html

html jsp

网页文档

text/plain

txt

文本文档

text/xml

xml

XML文档

text/json

json

JSON字符串

1.3 示例

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/6/19
 * @description 文件下载
 */
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    													 throws ServletException, IOException {
        // 获取请求参数,文件名称
        String filename = request.getParameter("filename");

        // 用字节流关联
        FileInputStream fis = new FileInputStream("/path/" + filename );

        // 设置 response 的响应头
        ServletContext servletContext = this.getServletContext();
        String mimeType = servletContext.getMimeType(filename);
        response.setHeader("content-type", mimeType);
        response.setHeader("content-disposition", "attachment;filename=" + filename);
        
        // 将输入流的数据写出到输出流中
        ServletOutputStream sos = response.getOutputStream();
        byte[] buff = new byte[1024 * 8];
        int len = 0;
        while((len = fis.read(buff)) != -1){
            sos.write(buff,0,len);
        }

        fis.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    													 throws ServletException, IOException {
        this.doPost(request,response);
    }
}