HttpServletResponse的入门

HttpServletResponse

第一章 HTTP响应报文

1、HTTP响应报文

	HTTP是基于请求和响应的协议,一次请求对应一次响应。请求和响应的数据格式都遵从HTTP的超文本传输协议。与HTTP的请求一样,HTTP响应的数据也分为3部分:响应行 ,响应头 ,响应体 这3部分组成。

目标: 解释说明HTTP响应报文

步骤:

1、概念:HTTP响应报文指的是服务器给客户端(浏览器)响应数据的数据格式;

2、组成:响应行,响应头,响应体;

小结:

1、HTTP响应报文:HTTP协议中规定的响应数据的数据格式;
2、组成:响应行,响应头,响应体;

2、抓取响应报文

	通过上面的描述,我们已经知道HTTP响应报文由:响应行,响应头,响应体组成。但是,这个数据具体的格式是什么样的,我们并没有一个直观的认识,下面我们将通过软件Fiddler抓取响应报文.

目标: 使用Fiddler抓取响应报文

步骤:

第一步:编写前端页面response.html,页面中编写两个form表单。分别发送get和post请求;
第二步:编写Servelt接收response.html页面发送的请求,并使用response对象响应字符串数据;
第三步:打开Fiddler软件,分别抓取get和post请求对应的响应报文;
第四步:分析响应报文数据;

实现:

第一步:编写前端页面response.html,页面中编写两个form表单。分别发送get和post请求;

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>抓取响应报文</title>
</head>
<body>
<h2>get请求</h2>
<form action="/responseDemoServlet" method="get">
    用户名:<input type="text" name="username" value="jack" /> <br/>
    密码:<input type="text" name="password" value="1234" /> <br/>
    <input type="submit" value="get提交" />
</form>

<h2>post请求</h2>
<form action="/responseDemoServlet" method="post">
    用户名:<input type="text" name="username" value="jack" /> <br/>
    密码:<input type="text" name="password" value="1234" /> <br/>
    <input type="submit" value="post提交" />
</form>
</body>
</html>

第二步:编写Servelt接收response.html页面发送的请求,并使用response对象响应字符串数据;

package com.heima.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author buguniao
 * @version v1.0
 * @date 2018/12/10 17:47
 * @description TODO
 **/
@WebServlet("/responseDemoServlet")
public class ResponseDemoServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求数据编码格式
        request.setCharacterEncoding("UTF-8");

        //1、获取请求数据
        String method = request.getMethod();
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //2、处理数据
        System.out.println("获取"+method+"方式提交的数据,username="+username+";password="+password);

        //3、响应数据
        response.getWriter().println("Hello Browser!");
    }
}

第三步:打开Fiddler软件,分别抓取get和post请求对应的响应报文;

【GET请求对应的响应数据】

【POST请求对应的响应数据】

第四步:分析响应报文数据;

1、GET请求,POST请求对应的响应数据没有区别;
2、响应数据的组成:响应行,响应头,响应体;

3、响应报文详解

目标:详细解释说明响应报文

步骤:

1、响应报文组成:响应行,响应头,响应体;

2、响应行:响应报文的第一行

协议/版本号	状态码

3、响应头:响应行之下,以key:value的形式给客户端(浏览器)发送响应参数

key:value

4、响应体:响应的具体数据

实现:

1、响应报文的组成:响应行,响应头,响应体;

2、响应行:响应报文的第一行,由:协议/版本 状态码 组成;

【常见状态码】

状态码 状态码描述 说明
200 OK 请求已成功,请求所希望的响应头或数据体将随此响应返回。出现此状态码是表示正常状态。
302 Move temporarily 重定向,请求的资源临时从不同的 URI响应请求。
304 Not Modified 从缓存中读取数据,不从服务器重新获取数据
404 Not Found 请求资源不存在。通常是用户路径编写错误,也可能是服务器资源已删除。
403 Forbidden 服务器已经理解请求,但是拒绝执行它
405 Method Not Allowed 请求行中指定的请求方法不能被用于请求相应的资源
500 Internal Server Error 服务器内部错误。通常程序抛异常

3、响应头:响应行之下,以key:value的形式给客户端(浏览器)发送响应参数

【常见响应头】

    响应头Key       	                响应头value                
   location      	      指定响应的路径,需要与状态码302配合使用,完成跳转。       
 content-Type    	响应正文的类型(MIME类型)例如:text/html;charset=UTF-8

content-disposition 通过浏览器以附件形式解析正文,例如:attachment;filename=xx.zip
refresh 页面刷新,例如:3;url=www.itcast.cn //三秒刷新页面到www.itcast.cn

4、响应体:服务器发送给浏览器的数据。

小结:

1、响应报文:规定了服务器给浏览器响应数据的格式;
2、组成:响应行,响应头,响应体;
3、响应行:
		定义:响应报文的第一行;
		组成:协议/版本号	状态码
		常见状态码:200 302 304 404 500
4、响应头:
		定义:响应行以下,以key:value的形式给浏览器发送响应参数
		常见响应头:
		location			指定响应的路径,需要与状态码302配合使用,完成跳转
		content-Type		响应正文的类型(MIME类型)例如:text/html;charset=UTF-8
		content-disposition	通过浏览器以附件形式解析正文,例如:attachment;filename=xx.zip
		refresh				页面刷新,例如:3;url=www.itcast.cn    //三秒刷新页面到www.itcast.cn

4、Chrome浏览器抓包简介

目标:使用Chrome浏览器抓取HTTP报文

步骤:

第一步:按F12打开浏览器控制台,选择Netword面板;

第二步:发送请求;

第三步:打开请求链接;

第四步:查看HTTP报文信息;

实现:

第一步:按F12打开浏览器控制台,选择Netword面板;

第二步:发送请求;

第三步:打开请求链接;

第四步:查看HTTP报文信息;

小结:

1、浏览器开发者工具:按F12打开;
2、Network面板:抓取请求和响应数据,这些数据并不是原始的HTTP报文信息,被Chrome浏览器美化过;

第二章 HttpServletResponse

1、HttpServletResponse

目标: HttpServletResponse对象及其作用

步骤:

1、概念:HttpServletResponse对象代表服务器响应,tomcat创建HttpServletResponse对象,并将该对象作为参数传递给servlet的service方法。

2、作用:设置响应行,头,体;

小结:

1、HttpServletResponse:代表服务器响应,tomcat创建response对象;
2、HttpServletResponse的作用:给浏览器设置响应报文(设置响应行,头,体)。

2、HttpServletResponse常用API

2.1 设置响应行

目标: 使用HttpServletResponse设置响应行

步骤:

1、响应行组成说明:协议/版本 状态码;

2、创建ResponseApiServlet,在doGet方法中使用HttpServletResponse设置响应状态码,设置响应状态码的API:

setStatus(int code)

3、常见的响应状态码:

响应状态码 说明
200 响应成功
404 资源路径错误或资源被删除
500 服务器内部错误
302 重定向

4、浏览器抓取响应状态码:

实现:

1、响应行组成说明:协议/版本 状态码;

2、创建ResponseApiServlet,在doGet方法中使用HttpServletResponse设置响应状态码;

package com.heima.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author buguniao
 * @version v1.0
 * @date 2018/12/10 23:34
 * @description TODO
 **/
@WebServlet("/responseApiServlet")
public class ResponseApiServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //response对象设置响应状态码
//        response.setStatus(200);
//        response.setStatus(304);
//        response.setStatus(404);
        response.setStatus(500);
    }
}

3、常见的响应状态码;

响应状态码 说明
200 响应成功
404 资源路径错误或资源被删除
500 服务器内部错误
302 重定向

4、通过浏览器访问这个servlet并抓取响应状态码;

小结:

1、response对象设置响应状态码的方法: response.setStatus( int statusCode);
2、常见响应状态码:
	200:请求和响应都OK
	302:重定向
	304:浏览器从缓存中加载数据
	404:请求的路径错误或请求的资源不存在
	500:服务器内部异常
3、注意事项:上述常见的响应状态码,通常是由服务器自动响应给浏览器。我们不需要手动设置;

2.2 设置响应头

2.2.1 设置响应头的API及常用响应头

目标: 介绍response设置响应头的方法及常用响应头

步骤:

1、response对象设置响应头的API

response.setHeader(key,value);

2、常用响应头:

    响应头Key       	                响应头value                
    refresh      	页面刷新,例如:3;url=www.itcast.cn    //三秒刷新页面到www.itcast.cn
 content-type    	设置响应数据的类型(MIME类型)和编码格式 例如:text/html;charset=UTF-8
   location      	      指定响应的路径,需要与状态码302配合使用,完成重定向。      

content-disposition 通知浏览器以附件形式解析正文,例如:attachment;filename=xx.zip。

小结:

1、response对象设置响应头的API: response.setHeader(key,value);
2、value值可以由多个参数组成,不同参数之间使用,隔开: response.setHeader(key,"value1;value2");
3、常用响应头:
	refresh:定时刷新;
	content-type:设置响应数据的数据类型和编码格式;
	location:配合302响应状态码完成重定向;
	conteng-disposition:通知浏览器以附件的形式解析响应的数据;

2.2.2 refresh

目标: 演示refresh响应头的应用

步骤:

1、设置响应头的方法:response.setHeader(key,value);

2、refresh响应头的value值:

时间(秒);url           指定时间后跳转到url所在的地址

3、在ResponseApiServlet的doGet方法中,使用response对象,设置refresh响应头。要求:3秒钟之后跳转到百度;

4、访问ResponseApiServlet观察响应数据和实现的效果;

实现:

1、在ResponseApiServlet的doGet方法中设置refresh响应头:3;http://www.baidu.com

package com.heima.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author buguniao
 * @version v1.0
 * @date 2018/12/10 23:34
 * @description TODO
 **/
@WebServlet("/responseApiServlet")
public class ResponseApiServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //response对象设置响应状态码
//        response.setStatus(200);
//        response.setStatus(304);
//        response.setStatus(404);
//        response.setStatus(500);

        //设置响应头
        response.setHeader("refresh","3;http://www.baidu.com");
    }
}

2、访问responseApiServlet,抓取响应数据,发现在响应头中出现了:

refresh:3;http://www.baidu.com

3、实现效果:3秒钟之后,页面自动跳转到了百度;

小结:

1、refresh响应头的作用:
	实现页面的定时刷新(跳转);
2、通过设置响应头,实现页面跳转的方法:
	response.setHeader("refresh","3;http://www.baidu.com")
3、refresh参数值中时间单位为:秒;

2.2.3 content-type

目标: 演示content-type响应头的使用方法及作用

步骤:

1、设置响应头的方法:response.setHeader(key,value);

2、响应头content-type使用:

取值:responset.setHeader("content-type",MimeType)

MimeType:标识数据类型

	最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型。
	MIME意为多功能Internet邮件扩展,它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。然而当它被HTTP协议支持之后,它的意义就更为显著了。它使得HTTP传输的不仅是普通的文本,而变得丰富多彩。
	每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。
常见的MIME类型(通用型):
超文本标记语言文本 .html text/html
xml文档 .xml text/xml
XHTML文档 .xhtml application/xhtml+xml
普通文本 .txt text/plain
PDF文档 .pdf application/pdf
Microsoft Word文件 .word application/msword
PNG图像 .png image/png
GIF图形 .gif image/gif
JPEG图形 .jpeg,.jpg image/jpeg
......

3、在ResponseApiServlet中设置响应头content-type的值为text/plain,观察响应报文中的内容;

4、content-type响应头的应用:设置响应数据的编码格式。设置方式:response.setHeader(key,“mimeType;charset=utf-8”);

实现:

1、设置响应头的方法:response.setHeader(key,value);

2、响应头content-type使用:

取值:responset.setHeader("content-type",MimeType)

3、在ResponseApiServlet中使用response对象响应中文数据并设置响应头content-type的值为text/plain,观察响应报文中的内容;

package com.heima.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author buguniao
 * @version v1.0
 * @date 2018/12/10 23:34
 * @description TODO
 **/
@WebServlet("/responseApiServlet")
public class ResponseApiServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //response对象设置响应状态码
//        response.setStatus(200);
//        response.setStatus(304);
//        response.setStatus(404);
//        response.setStatus(500);

        //设置响应头
//        response.setHeader("refresh","3;http://www.baidu.com");
        response.setHeader("content-type","text/plain");
        response.getWriter().println("中国");
    }
}

4、content-type响应头的应用:设置响应数据的编码格式。设置方式:response.setHeader(key,“mimeType;charset=utf-8”);

小结:

1、content-type作用:
	1、设置响应数据的数据类型:MimeType
	2、设置响应数据的数据编码:处理响应中文乱码问题
2、tomcat默认响应数据编码格式:ISO-8859-1
3、处理响应中文乱码的简便方式:
		      response.setContentType("text/html;charset=utf-8");
4、Servlet中处理请求和响应中文乱码问题:
【请求乱码】
	post请求乱码: request.setCharacterEncoding("utf-8");
	get请求乱码:不需要处理
【响应乱码】
	response.setContentType("text/html;charset=utf-8");

2.2.4重定向(location)

【1】重定向原理阐述

目标: 阐述重定向的原理

步骤:

1、概念:服务器通过响应设置,让浏览器重新发送一次请求到指定的url。实现资源的跳转。

2、画图演示过程:

小结:

1、重定向:服务器通过对响应设置,让浏览器重新发送一次请求到指定的url,实现资源的跳转;
2、作用:完成了一次资源跳转;
3、特点:
	【1】跳转的实现过程:服务器设置响应信息----浏览器接收到响应信息后自动实现跳转;
	【2】浏览器发送请求的次数:2次;

【2】重定向案例实现

目标: 实现上述重定向案例

步骤:

1、编写html发送请求到MyServlet;

2、编写MyServlet和OtherServlet,MyServlet接收客户端浏览器发送的请求数据;

3、MyServlet接收完数据后,通过设置响应状态码302和设置响应头location完成重定向;

4、在OtherServlet完成业务逻辑的处理,并给浏览器响应数据;

实现:

1、编写html发送请求到MyServlet;

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模拟重定向</title>
</head>
<body>
<form action="/myServlet" method="get">

    邮件正文:<textarea name="msg"  cols="30" rows="10"></textarea> <br>
    <input type="submit" value="发送邮件">
</form>
</body>
</html>

2、编写MyServlet和OtherServlet,MyServlet接收客户端浏览器发送的请求数据;

【MyServlet】

package com.heima.redirect;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author buguniao
 * @version v1.0
 * @date 2018/12/11 9:18
 * @description TODO
 **/
@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、获取请求数据
        String msg = request.getParameter("msg");

        //2、处理数据
        System.out.println(msg);

        //3、响应数据
    }
}

【OtherServlet】
package com.heima.redirect;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**

  • @author buguniao

  • @version v1.0

  • @date 2018/12/11 9:19

  • @description TODO
    **/
    @WebServlet("/otherServlet")
    public class OtherServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
    }

3、MyServlet接收完数据后,通过设置响应状态码302和设置响应头location完成重定向;
在这里插入图片描述
4、在OtherServlet完成业务逻辑的处理,并给浏览器响应数据;
在这里插入图片描述
5、启动tomcat,填写表单信息,模拟邮件发送;
1、重定向实现原理:
【1】通过设置响应状态码,告诉浏览器要实现重定向:response.setStatus(302)
【2】通过设置响应头location,告诉浏览器要跳转的地址:response.setHeader(“location”,url)

2、重定向简写方式:
response.sendRedirect(“url”);

【3】转发和重定向的小结

目标: 解释说明转发和重定向的区别

步骤:

1、共同点:都能够完成资源的跳转;

2、不同点:

【1】转发:是服务器内部的行为,在服务器内完成跳转,浏览器并不知道,整个过程只有一次请求;

【2】重定向:服务器通过响应设置,告诉浏览器完成跳转,浏览器会重新发送一次请求;

3、画图:

在这里插入图片描述
1、转发和重定向:
【实现原理】转发在服务器内部发送,重定向是服务器操作浏览器发送请求
【请求次数】转发只有一次请求,重定向会有两次请求
【地址栏地址】转发不变,重定向后地址栏地址会变为第二次请求的地址
2、转发和重定向的作用:
【转发】完成跳转,共享request域对象(数据);
【重定向】完成跳转
2.3、设置响应体

响应体指的是服务器具体响应给浏览器的数据,通过服务器给浏览器响应数据有以下两种方式:

响应字符流:getWriter()
响应字节流:getOutputStream()

方法 说明
java.io.PrintWriter getWriter() 用于向浏览器输出字符数据。【字符流–给浏览器响应数据】
ServletOutputStream getOutputStream() 用于向浏览器输出二进制数据。【字节流–文件下载】

//1、获取字符流;

PrintWriter writer = response.getWriter();

2、介绍print方法能够打印的数据类型;
在这里插入图片描述
package com.heima.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

/**

  • @author buguniao

  • @version v1.0

  • @date 2018/12/11 10:10

  • @description TODO
    **/
    @WebServlet("/responseBodyServlet")
    public class ResponseBodyServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //响应体—响应字符数
    //1、获取字符流;
    PrintWriter writer = response.getWriter();

     //2、调用字符流中的print方法,给浏览器响应数据;
     //1、int
     writer.print(1);
     //2、String
     writer.print("Hello");
     //3、boolean
     writer.print(true);
     //4、集合
     List<String> arrList = new ArrayList<>();
     arrList.add("itcast");
     arrList.add("itheima");
     writer.print(arrList);
    

    }
    }

4、访问ResponseBodyServlet,查看浏览器上的响应数据;
在这里插入图片描述
第三章 文件下载

1、ServletContext域对象

	ServletContext对象:servlet容器在启动时会加载web应用,并为每个web应用创建唯一的servlet context对象,可以把ServletContext看成是一个Web应用的服务器端组件的共享内存,在ServletContext中可以存放共享数据。ServletContext对象是真正的一个全局对象,凡是web容器中的Servlet都可以访问。

1.1 ServletContext域对象简介

目标: ServletContext 域对象简介

步骤:

1、解释说明ServletContenxt域对象;

2、画图分析ServletContext域对象的作用范围:

3、ServletContext的应用:

实现:

1、解释说明ServletContenxt域对象;

	servlet容器在启动时会加载web应用,并为每个web应用创建唯一的servlet context对象,可以把ServletContext看成是一个Web应用的服务器端组件的共享内存,在ServletContext中可以存放共享数据。

2、画图分析ServletContext域对象的作用范围:
在这里插入图片描述
3、ServletContext的应用:
【1】域对象共享数据;
【2】获取项目的全局参数;

小结:
1、ServletContext作用域:tomcat启动时会创建,属于整个项目的域对象;
2、ServletContext作用范围:整个项目
3、ServletContext的应用:
共享数据
获取项目的全局参数
1.2 ServletContext域对象应用

目标: 演示ServletContext域对象常用API

步骤:

第一步:创建一个Servlet类–ContextDemoServlet,在doGet方法中做如下操作:

第二步:获取ServletContext对象:
//获取ServletContext域对象
ServletContext context = request.getServletContext();

第三步:往ServletContext域中存数据,取数据,移除数据;

/**

  • @author buguniao

  • @version v1.0

  • @date 2018/12/11 10:52

  • @description TODO
    **/
    @WebServlet("/contextDemoServlet")
    public class ContextDemoServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //ServletContext域对象应用
    //1、获取域对象
    ServletContext context = request.getServletContext();

     //2、存数据
     context.setAttribute("contextName", "传智播客!");
     //3、取数据
    String contextName = (String) context.getAttribute("contextName");
     System.out.println(contextName);
    
     //4、移除数据
     context.removeAttribute("contextName");
     String contextName1 = (String) context.getAttribute("contextName");
     System.out.println(contextName1);
    

    }
    }

第四步:访问contextDemoServlet,观察控制台中输出的信息

第五步:将上述代码中的移除域数据注释掉。重新创建一个Servlet,获取ServletContext对象,然后获取"contextName"的值;
在这里插入图片描述

package com.heima.web;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**

  • @author buguniao

  • @version v1.0

  • @date 2018/12/11 11:00

  • @description TODO
    **/
    @WebServlet("/contextDemo2Servlet")
    public class ContextDemo2Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //1、获取ServletContext域对象
    ServletContext servletContext = request.getServletContext();
    //2、获取域对象中的contextName值
    String contextName = (String) servletContext.getAttribute(“contextName”);
    System.out.println(contextName);
    }
    }
    小结:
    1、ServletContext操作域对象的API:
    【1】获取ServletContext域对象: request.getServletContext();
    【2】往域对象中存值,取值,移除值:
    【存数据】
    context.setAttribute(“contextName”, “传智播客!”);
    【取数据】
    context.getAttribute(“contextName”);
    【移除数据】
    context.removeAttribute(“contextName”);

2、ServletContext域对象存数据的特点:能够在多个request中共享;

1.3 ServletContext获取项目全局参数
ServletContext属于整个项目。因此,在整个项目运行期间它能够获取项目的全局参数。这些全局参数中,我们会用到以下两个:
【1】获取资源文件在服务器文件系统上的真实路径(文件的绝对路径):getRealPath(String path)
【2】根据文件名获取文件的MimeType类型:getMimeType(fileName)
目标:使用ServletContext对象获取文件在服务器中的真实路径和文件类型

步骤:

第一步:在web目录下创建一个文件—demo.txt;

第二步:创建一个Servlet类—ContextParamServlet;

第三步:在ContextParamServlet类中使用getRealPath获取文件的路径;

第四步:在ContextParamServlet类中使用getMimeType获取文件的文件类型;

第五步:访问contextParamServlet,查看获取的信息

实现:

第一步:在web目录下创建一个文件—demo.txt;

在这里插入图片描述
第二步:创建一个Servlet类—ContextParamServlet;
package com.heima.web;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**

  • @author buguniao

  • @version v1.0

  • @date 2018/12/11 11:20

  • @description TODO
    **/
    @WebServlet("/contextParamServlet")
    public class ContextParamServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //演示ServletContext对象获取项目运行参数
    }
    }

第三步:在ContextParamServlet类中使用getRealPath获取文件的路径;
在这里插入图片描述

第五步:访问contextParamServlet,查看获取的信息
小结:
1、ServletContext获取资源文件在服务器文件系统上的真实路径(文件的绝对路径):
getRealPath(String path);
【注意】获取的是项目运行时文件的绝对路径。代码中的体现是获取web目录下的路径;

2、ServletContext获取文件的MimeType类型:
context.getMimeType(“demo.txt”);
【注意】根据文件的扩展名获取文件的mimeType类型;
2、文件下载

2.1 超链接文件下载

目标: 演示通过超链接的方式下载文件

步骤:

第一步: 创建下载页面download.html;

第二步:在download.html页面上书写以下超链接标签,并链接到对应的资源;
1.jpg

2.txt

3.zip

Sublime.exe

第三步:启动tomcat,访问download.html页面,点击上述链接;
实现:

第一步: 创建下载页面download.html;

文件下载

通过超链接的方式下载资源

第二步:在download.html页面上书写以下超链接标签,并链接到对应的资源; 文件下载

通过超链接的方式下载资源

1.zip
2.exe
3.txt
4.jpg

在这里插入图片描述

在这里插入图片描述
小结:
1、使用超链接下载资源:
【下载】浏览器不能打开的文件直接下载
【打开】浏览器能打开的文件直接打开
2、超链接的方式下载资源存在的问题:
【1】完全是浏览器的行为;
【2】无法对下载业务进行业务逻辑控制;
2.2 response字节流下载

上述通过超链接直接下载文件,利用的是浏览器的默认行为。无法对下载的过程进行业务逻辑处理,如果要对下载的业务逻辑进行处理,需要使用java编码实现。所以,下载的链接应指向后台Servlet。

目标: 使用response实现文件下载

步骤:

第一步:新建download.html页面;

第二步:在download.html页面,书写几个超链接标签,链接地址为downloadServlet,每个链接后面需要携带要下载的文件的文件名;

第三步:编写downloadServlet,处理下载业务逻辑;

下载业务逻辑:两个头+两个流(流拷贝)
【两个头】
1. 设置响应头:Content-Disposition 告诉浏览器以附件的形式来处理文件;
2. 设置响应头: response.setContentType(mimeType) 告诉浏览器下载的文件的类型;
【两个流】
1. 将文件读取到流里边: FileInputStream fin = new FileInputStream(file);
2. 将流写给浏览器:response.getOutputStream().write(arr,0,len);
实现:

第一步:新建download.html页面;

第二步:在download.html页面,书写几个超链接标签,链接地址为downloadServlet,每个链接后面需要携带要下载的文件的文件名;

文件下载

通过超链接的方式下载资源

1.zip
2.exe
3.txt
4.jpg

第三步:编写downloadServlet,处理下载业务逻辑;

/**

  • @author buguniao

  • @version v1.0

  • @date 2018/12/11 23:12

  • @description TODO
    **/
    @WebServlet("/downloadServlet")
    public class DownloadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //文件下载
    //filename
    String filename = request.getParameter(“filename”);
    //mimeType
    String mimeType = request.getServletContext().getMimeType(filename);
    //file
    String realPath = request.getServletContext().getRealPath(“resource”);
    File file = new File(realPath,filename);

     //1、设置两个头信息
     //告诉浏览器以附件的形式打开这个文件
     response.setHeader("content-disposition","attachment;filename="+filename);
     //告诉浏览器下载的文件的mimetype
     response.setContentType(mimeType);
    
     //2、设置两个流
     //通过response获取输出流
     ServletOutputStream out = response.getOutputStream();
     //将需要下载的文件读取到输入流中
     FileInputStream in = new FileInputStream(file);
     //流拷贝:
     int len = 0;
     byte[] buff = new byte[1024];
     while ((len = in.read(buff)) != -1) {
         out.write(buff,0,len);
     }
     out.close();
     in.close();
    

    }
    }

小结:
1、文件后台下载的本质:流拷贝,将文件以流的形式从服务器发用给浏览器;
2、文件下载的步骤:两个头+两个流
两个头:
设置content-disposition头,告诉浏览器以附件的形式下载当前文件
设置mimeType头,告诉浏览器下载的文件的mimeType
两个流:
输出流:从response中获取输出流
输入流:将文件读取到输入流中
流拷贝:将文件以流的形式发送给浏览器
3、注意事项:
mimeType可以不用设置:现在的浏览器已经很智能了,可自动辨别所下载的文件类型,因此可不用设置此参数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值