详解响应消息 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/msworddoc dotMicrosoft Word
application/vnd.ms-excelxlsMicrosoft Excel
application/vnd.ms-powerpointpptMicrosoft Powerpoint
application/pdfpdfAdobe Acrobat
application/octet-streambin exe so dll class可执行程序
application/zipzipwinzip
application/x-gzipgzgzip
image/gifgifGIF图像
image/jpegjpg jpeg jpeJPEG图像
image/pngpngPNG图像
text/htmlhtml jsp网页文档
text/plaintxt文本文档
text/xmlxmlXML文档
text/jsonjsonJSON字符串


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



关注公众号一起学习 Java 开发,跟大家分享我的学习成长过程

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值