服务器对客户端浏览器作出的响应被封装成一个 HttpServletResponse 对象。要对浏览器进行操作,只要要操作HttpServletResponse 对象就可以了。
功能详解
获取输出对象
通过HttpServletResponse.getWriter()获得一个 PrintWriter 对象,该对象为 OutputStream 的子类。如
- HttpServletResponse.getWriter():对象只能写字符型的数据
- HttpServletResponse.getOutputStream():写二进制数据,如输出图片等
注意:
- 同一个 HttpServletResponse 对象这两个方法不能同时使用。
getOutputStream () has already bean called for this response
- 特别是多层转发的时候,使用的还是同一个 request 对象,不能同时调用这两个方法
设置输出类型
response.setContentType("image/jpeg")
,需要与输出方式统一- 例子:输出图片验证码:
public class IdentityServlet extends HttpServlet {
private static final long serialVersionUID = -479885884254942306L;
/**
* 随机字符字典
*/
public static final char[] CHARS = {'2', '3', '4', '5', '6', '7', '8', '9', 'A',
'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K',
'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z'};
public static Random random = new Random();
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置输出类型
response.setContentType("image/jpeg");
// 获取随机字符串
String randomString = getRandomString();
// 放入session
request.getSession(true).setAttribute("randomString", randomString);
// 图片宽度
int width = 100;
// 图片高度
int height = 30;
// 随机颜色,用于背景色
Color color = getRandomColor();
// 反色,用于前景色
Color reverse = getReverseColor(color);
//创建一个彩色图片
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取绘图对象
Graphics2D g = bi.createGraphics();
//设置字体
g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16));
//设置颜色
g.setColor(color);
// 绘制背景
g.fillRect(0, 0, width, height);
//设置颜色
g.setColor(reverse);
//绘制随机字符
g.drawString(randomString, 18, 20);
//画最多100个噪音点
for (int i = 0, n = random.nextInt(100); i < n; i++) {
g.drawRect(random.nextInt(width), random.nextInt(height), 1, 1);
}
// 转成JPEG格式
ServletOutputStream out = response.getOutputStream();
//编码器
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
//对图片进行编码
encoder.encode(bi);
out.flush();
}
/**
* 获取 6 位 随机数
*
* @return
*/
public static String getRandomString() {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < 6; i++) {
// 每次取一个随机字符
buffer.append(CHARS[random.nextInt(CHARS.length)]);
}
return buffer.toString();
}
/**
* 获取随机的颜色
*
* @return
*/
public static Color getRandomColor() {
return new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));
}
/**
* 返回某颜色的反色
*
* @param c
* @return
*/
public static Color getReverseColor(Color c) {
return new Color(255 - c.getRed(), 255 - c.getGreen(), 255 - c.getBlue());
}
/**
* 测试
*
* @param args
*/
public static void main(String[] args) {
System.out.println(getRandomString());
}
}
缓存控制
- 不缓存
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Cache-Control", "no-store");
response.setDateHeader("Expires", 0);//时间头
- 利用Expires时间头,控制页面缓存。记得加上当前时间。System.currentTimeMillis()
//设置缓存 一定要是当前时间 + 控制的缓存时间
response.setDateHeader("Expires", System.currentTimeMillis() + 1000*3600);
利用 HttpServletResponse 实现下载
- 原生的 Servlet 下载会比较繁琐,自己需要控制流做很多事情。
- apache的
org.apache.commons.io
,中有比较好用的工具类:IOUtils
、FileUtils
可以使用,方便下载、上传等功能的实现
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 注意中文的文件名文件下载时,注意编码 URLEncoder
String realPath = this.getServletContext().getRealPath("/downLoad/下载.jpg");
System.out.println("文件的绝对路径: " + realPath);
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
System.out.println("文件的名称为: " + fileName);
//设置浏览器下载,文件名称是中文,需要编码
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
// 固定输出
InputStream in = null;
OutputStream out;
try {
in = new FileInputStream(realPath);
int len;
byte[] buffer = new byte[1024];
out = response.getOutputStream();
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
} finally {
if (in != null) {
try {
in.close();
} catch (Exception e) {
}
}
}
}
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 注意中文的文件名文件下载时,注意编码 URLEncoder
String realPath = this.getServletContext().getRealPath("/downLoad/下载.jpg");
System.out.println("文件的绝对路径: " + realPath);
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
System.out.println("文件的名称为: " + fileName);
//设置浏览器下载,文件名称是中文,需要编码
resp.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
byte[] bytes = IOUtils.toByteArray(new FileInputStream(realPath));
IOUtils.write(bytes, resp.getOutputStream());
}