- ServletContext
ServletResponse
ServletContext
- 代表整个web应用,可以和程序的容器(服务器)来通信
- 获取方式
- 通过request对象获取
- 通过HttpServlet获取
- 方法-功能
- 获取MIME类型
- 通过域对象设置共享数据
- 获取文件真实的(服务器路径)-“Out/…下面”
- 项目文件夹的web目录,web-inf目录,src目录下的资源文件对应的真实路径
- src目录下的资源会被放到WEB-INF下的classes文件夹中
Response
- 设置响应信息
- 设置相应头
- 设置相应行
- 设置响应体
- 服务器输出数据到浏览器中
- 字符输出流
- 字节输出流
重定向和转发的区别
- redirect 和 forward
重定向的特点:redirect
- 地址栏发生变化
2. 重定向可以访问其他站点(服务器)的资源
3. 重定向是两次请求。不能使用request对象来共享数据
- 地址栏发生变化
- 设置响应信息
转发的特点:forward
1. 转发地址栏路径不变
2. 转发只能访问当前服务器下的资源
3. 转发是一次请求,可以使用request对象来共享数据案例:文件下载-要求点击超链接,弹出下载询问框
- 页面显示超链接
- 点击超链接后弹出下载提示框
- 完成图片文件下载
- 关键
- 使用响应头设置资源的打开方式: content-disposition:attachment;filename=xxx
- 步骤
- 获取文件名字fileName 和 Mime 文件类型
- 获取文件的真实服务器路径 通过(/img+fileNme)获得,这里默认知道在工作目录/img/fileName 有这个资源
- 设置响应头 MIME文件类型
- 设置资源打开方式resp.setHeader(“content-disposition”, “attachment;filename=” + fileName)
- 将数据写出到response输出流
- 如果要解决文件中文名问题:使用Utils工具,入参数(agent,fileName)
- user-agent
- User-Agent是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。用较为普通的一点来说,是一种向访问网站提供你所使用的浏览器类型、操作系统及版本、CPU 类型、浏览器渲染引擎、浏览器语言、浏览器插件等信息的标识。UA字符串在每次浏览器 HTTP 请求时发送到服务器!
- 浏览器UA 字串的标准格式为: 浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识 版本信息
- 代码 ```java package com.jquan;
import com.jquan.Utils.DownLoadUtils; import com.sun.javaws.IconUtil;
import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream;
@WebServlet(“/demo6”) public class ServletDemo6 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取文件名参数 String fileName = req.getParameter(“fileName”);
//得到文件真实所在路径,获取输入流
ServletContext servletContext = req.getServletContext();
String realPath = servletContext.getRealPath("/img/" + fileName);
System.out.println("see real path of /img/" + fileName + "is: " + realPath);
FileInputStream input = new FileInputStream(realPath);
//设置响应头类型--获取文件的 Mime-Type 类型 (Mime-Type数据格式规范)
String mTypeofFile1 = servletContext.getMimeType(fileName);
resp.setContentType(mTypeofFile1);
/**通过Utils解决文件名中文问题*/
String agent = req.getHeader("user-agent");
fileName = DownLoadUtils.getFileName(agent, fileName);
//设置响应头打开方式
resp.setHeader("content-disposition", "attachment;filename=" + fileName);
//通过response 输出流 输出
ServletOutputStream servletOutputStream = resp.getOutputStream();
byte[] buf = new byte[1024 * 8];
int len = 0;
while ((len = input.read(buf)) != -1) {
servletOutputStream.write(buf, 0, len);
}
input.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
```