web核心66-day09笔记(ServletContext, response, file download)
1.引出ServletContext项目管家
servlet:
运行在服务器端小程序
servlet编写
....
servletConfig------
getServletContext--------->ServletContext
2.ServletContext的获取方式
this.getServletConfig().getServletContext()
this.getServletContext()
3.ServletContext是什么?
servlet上下文 就是项目的管理者 管家
ServletContext 生命周期(了解):
出生:
它是在服务器启动创建的,而且这个对象,一个项目只会创建一个;
死亡:
服务器关闭的时候;
4.ServletContext有什么用:
1.1.操作项目下任意资源(方法)
1) getRealPath("资源路径");
//返回项目下的任意的一个资源(无论是否真实存在)的 在项目发布后的真实磁盘目录
返回值= tomcat家目录+/webapps+项目名/资源路径
2) getResourceAsStream("资源路径");//返回你在项目下的任意的一个资源,直接返回输入流
资源路径写法:
必须/打头 项目根目录的意思
自动判断资源是否存在,不存在返回null
3)应用场景:文件上传和下载
文件上传的时候需要获取 项目发布后的真实磁盘路径,然后上传到此处;
文件下载的时候需要获取 项目文件的输入流.
1.2.提供了一些其他的辅助功能
getMimeType("文件名 不管文件在哪"); 返回一个数据类型
getMimeType("1.png")--> image/png
getMimeType("xxx.gif")--> image/gif
getMimeType("xxx.html")--> text/html
getMimeType("xxx.xml")--> application/xml
1.3.提供了多个servlet之间数据通信功能:(因为一个项目只会创建一个ServletContext对象)
一组xxAttribute();
getAttribute("属性名") 获取属性
setAttribute("属性名",属性值<object>) 设置属性
removeAttribute("属性名") 删除属性
1.4.获取全局配置参数(应用:框架中为配置文件配置地址)
servlet规范中 允许我们为项目 整体设置一些参数
例如:在web.xml中添加
<context-param>
<param-name>班级名</param-name>
<param-value>66期</param-value>
</context-param>
String value = getInitParameter(参数名)
5.response:响应
5.1.响应行:
协议/版本 状态码 状态码说明
setSatus(int code);//设置状态码 1xx-3xx
setSatus(int code,String message);//既可以设置状态码也顺便设置说明
sendError(int code);//设置状态码 4xx-5xx
sendError(int code,String message);//既可以设置状态码也顺便设置说明
如果你要设置的是 4xx-5xx 鼓励使用sendError
5.2.响应头:key/value 是一些辅助信息
1) setHeader("名字","值");//允许设置响应头和值
以下方法了解,不用
setDateHeader("名字",Long 值);//允许设置响应头和值
setIntHeader("名字",int 值);//允许设置响应头和值
2) addHeader("名字","值");//允许设置响应头和值
以下方法了解,不用
addDateHeader("名字",Long 值);//允许设置响应头和值
addIntHeader("名字",int 值);//允许设置响应头和值
3) 例子:
setHeader("xx","yy")
setHeader("xx","zz")
setHeader会覆盖,想都保留,改用addHeader
4) 常用响应头:
Content-Type: 设置响应回去的内容的类型
(替代方法:response.setContentType("text/html;charset=utf-8");)
Location: 配合302状态码 重定向效果
refresh: 定时刷新 值规范 秒值;url='刷新的地址' ---没用
(定时刷新用js做: 详见refresh.html文档)
Content-Disposition: 文件下载(详见 6案例 和 7文件下载工具类)
response.setHeader("content-disposition","attachment;filename="+"不同浏览器编码后的文件名字");
不同浏览器编码后的文件名字 = DownLoadUtils.getName(request.getHeader("user-agent"),name)
response.setHeader("Content-Disposition","attachment;filename="+ DownLoadUtils.getName(request.getHeader("user-agent"),name));
5) //重定向 设置状态码,设置响应头 location 标识跳转地址
/*response.setStatus(302);
response.setHeader("location","http://localhost/xjj");*/
response.sendRedirect("http://localhost/xjj"); ------>重定向
5.3.响应体:放置请求要的正文内容
1) getWriter()//获取字符输出流----------->返回字符串 html代码
response.getWriter().print("<font color='red'>你好</font>");
2) getOutPutStream()//获取字节输出流----->返回压缩包 mp3 图片
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write("哈哈哈哈".getBytes());
//注意:
两流互斥 tomcat8以后不报错 但是不能同时用
7.文件下载(文件名不支持中文问题):
1.如果是火狐浏览器
对文件名进行base64编码
2.如果其他浏览器
对文件名进行utf-8编码
3.工具类DownLoadUtils(针对不同浏览器,对文件名进行编码)
方法:String getName("浏览器名","下载的文件名")
8.验证码举例:
作用:
防止暴力攻击
访问服务器 服务器可以给随机生成一个验证码图片
--------------------- ------------------------------------
案例1 统计网站的访问次数(ServletContext对象应用)
要求:
每次你访问任何一个servlet,都要记录下来 被访问了一次,
提供一个servlet,访问它的时候,把网站整个被访问了多少次 显示出来
案例2 文件下载
需求:
在服务器有一个download.html 页面提供一些文件下载的连接
点击一下 就得下载文件
技术:
servletContext
response
一.案例完成文件下载的方式:
实现方案一 简单到爆炸 但是很少用----------->不能保护你的资源
实现方案二 编码的方式
二.编写Servlet 帮我下载文件
1) 好处:可以控制逻辑,是否允许下载,从而保护资源;
2) 文件下载代码实现重点:(两个头一个流)
(1) 设置一个content-type的响应头 告知浏览器 我返回时什么类型的文件(=请求中想下载的文件类型)
(2) 设置下载头:告知浏览器 此次给你是一个用来下载的文件 即使你认识这个格式也不要打开
response.setHeader("content-disposition","attachment;filename="+"不同浏览器编码后的文件名字");
不同浏览器编码后的文件名字 = DownLoadUtils.getName(request.getHeader("user-agent"),name)
response.setHeader("Content-Disposition","attachment;filename="+ DownLoadUtils.getName(request.getHeader("user-agent"),name));
(3) 通过字节流输出人家想要的内容或者文件
3) 代码实现步骤:
(1) 编辑下载的web页面, download.html (注意事项如下:)
a.下载链接到DownloadServlet,链接添加下载的文件名信息 href="http://localhost/download?filename=1.txt"
(2) 生成DownloadServlet类
(3) 设置响应头 content-type 属性 (注意事项如下:)
a.响应头contet-type属性即为resquest中要下载的文件类型; -- response.setContentType(mimeType);
b.因此先获取request参数值:下载的文件名 -- request.getParameter("filename");
c.再利用项目管家得到文件类型 -- this.getServletContext().getMimeType(filename);
(4) 设置响应头下载属性 content-disposition:attachment;filename="下载的文件名" (需导入 工具类DownLoadUtils)
a.获取请求中浏览器类型:request.getHeader("user-agent")
b.浏览器兼容问题,需要利用DownLoadUtils工具类,将filename按要求编码 -- "下载的文件名" = DownLoadUtils.getName(request.getHeader("user-agent"),filename)
c.response.setHeader("content-disposition","attachment;filename="+"下载的文件名");
(5) 通过管家获取输入流,响应获取输出流
a.this.getServletContext().getResourceAsStream("/WEB-INF/download/"+filename);
b.response.getOutPutStream()
(6) 利用IOUtils工具类输出下载文件给浏览器 (需导入commons-io-1.4.jar 工具包org.apache.commons.io.IOUtils;)
a. IOUtils.copy(inputStream,outputStream);
本节重点总结:
servletContext 管家
response对象
案例一 统计网站访问次数
案例二 从网站下载文件