Servlet笔记(3):Servlet响应对象 HttpServletResponse

服务器对客户端浏览器作出的响应被封装成一个 HttpServletResponse 对象。要对浏览器进行操作,只要要操作HttpServletResponse 对象就可以了。

功能详解

获取输出对象

通过HttpServletResponse.getWriter()获得一个 PrintWriter 对象,该对象为 OutputStream 的子类。如

  1. HttpServletResponse.getWriter():对象只能写字符型的数据
  2. HttpServletResponse.getOutputStream():写二进制数据,如输出图片等

注意:

  1. 同一个 HttpServletResponse 对象这两个方法不能同时使用。getOutputStream () has already bean called for this response
  2. 特别是多层转发的时候,使用的还是同一个 request 对象,不能同时调用这两个方法

设置输出类型

  1. response.setContentType("image/jpeg"),需要与输出方式统一
  2. 例子:输出图片验证码:
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());
    }
}

缓存控制

  1. 不缓存
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");  
response.setHeader("Cache-Control", "no-store");  
response.setDateHeader("Expires", 0);//时间头  
  1. 利用Expires时间头,控制页面缓存。记得加上当前时间。System.currentTimeMillis()
//设置缓存 一定要是当前时间 + 控制的缓存时间  
response.setDateHeader("Expires", System.currentTimeMillis() + 1000*3600);

利用 HttpServletResponse 实现下载

  1. 原生的 Servlet 下载会比较繁琐,自己需要控制流做很多事情。
  2. apache的 org.apache.commons.io ,中有比较好用的工具类:IOUtilsFileUtils可以使用,方便下载、上传等功能的实现
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());
}

参考

  1. 源码地址
  2. Servlet学习笔记(四):Servlet的请求与响应

Fork me on Gitee

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值