Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。


我们要获取客户机提交过来的数据,只需要找request对象就行了。要向容器输出数据,只需要找response对象就行了。

下面我们介绍response的主要用法

中文文件名文件的下载

关于编码:

文件内容要用 response.setContextChest()

文件名用URLEncoder.encode()

//获取文件的路径
String path = getServletContext().getRealPath("/WEB-INF/classes/美女.jpg");//默认从工程路径开始 //创建输入流
InputStream is = new FileInputStream(path);
byte[] bs = new byte[1024];
int b = 0; //创建输出流对象
ServletOutputStream os = response.getOutputStream(); //对中文进行编码
//先拿到中文的文件名,"/"以"\\"替换(Windows平台特性)
String name = path.substring(path.lastIndexOf("\\") + 1, path.length()); //对中文文件名进行编码
name = URLEncoder.encode(name, "utf-8"); //通知浏览器以下载的方式打开文件
response.setHeader("Content-Disposition", "attachment;filename=美女.jpg"); while((b = is.read(bs)) != -1){
os.write(bs, 0, b);
}

输出随机图片

  • HTML页面上

    需要设置一个图片,然后图片地址设置为servlet。点击按钮重新让图片的url改变为访问servlet(url地址每次需要不一样,不然会有缓存,可以采用+一个当前时间)

  • servlet中

    //创建两个变量
    int width = 120;
    int height = 30;
    //创建内存图片
    BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
    //创建画笔
    Graphics g = image.getGraphics();
    //指定边框的颜色
    g.setColor(Color.RED);
    //画图像的边框
    g.drawRect(0, 0, width, height); //填充一下矩形的背景色
    //设定画笔的颜色
    g.setColor(Color.YELLOW);
    //填充矩形的背景
    g.fillRect(1, 1, width-2, height-2); //设置字体大小
    g.setFont(new Font("幼圆",Font.BOLD + Font.ITALIC,25)); //填充内容
    Random r = new Random(); //设置画笔颜色
    g.setColor(Color.GRAY);
    //花30条干扰线
    for(int i=0;i<30;i++){
    g.drawLine(r.nextInt(width),r.nextInt(height),r.nextInt(width),r.nextInt(height));
    } //画到图片中
    //设定画笔的颜色
    g.setColor(Color.RED); //随机产生4个汉子
    String s = "末日没有进行曲IhavenoMoney";
    //先将汉字转换成Unicode编码
    //可新建一个properties然后输入汉字,看源码
    s = "\u672B\u65E5\u6CA1\u6709\u8FDB\u884C\u66F2IhavenoMoney";
    for(int i = 0; i<4; i++){
    char c = s.charAt(r.nextInt(s.length()));
    int flag = r.nextBoolean()?1:-1;
    g.drawString(c+"",20 + 20*i + flag*r.nextInt(10),23 + flag*r.nextInt(5));
    } //随机产生4个数字输出到页面
    for(int i = 0; i<4; i++){
    int n = r.nextInt(10);
    //画到图片中
    g.drawString(n+"",20 + 20*i,20);
    } //告诉客户端不要缓存
    response.setHeader("Expires", -1+"");
    response.setHeader("Cache-control","no-cache");
    response.setHeader("Pragram","no-cache"); //将图片输出到客户端
    ImageIO.write(image, "jpg", response.getOutputStream());

定时刷新

//每隔2s刷新
response.setHeader("Refresh", "2");
response.getWriter().write("aa"+new Random.nextInt()); //每隔2s刷新到其他资源
response.setHeader("Refresh", "2;url=/a.html");
response.getWriter().write("aa"+new Random.nextInt());

控制客户端浏览器的缓存

response.setContentType("text/html;charset=UTF-8");
response.getWrite().write("圣诞快乐"); //控制缓存的时间
//时间是从1970年的1月1日0点0时0分0秒0毫秒开始计时
response.setDateHeader("Expires", System.currentTimeMills() + 10000);

请求重定向

System.out.println("servletresponse");

//第一种方式
response.setStatus(302);
response.setHeader("Location","ServletResponse/servlet/ServletRespon2"); //第二种方式(底层和第一种方式实现一样)
response.sendRedirect("Location","ServletResponse/servlet/ServletRespon2");

response对象的一些细节

//不要在一个servlet中同时使用字节流和字符流
//以下会引发500错误
response.getOutputStream().write("圣诞快乐".getBytes());
response.getWriter().write("末日没有进行曲");
  1. getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。
  2. Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
  3. Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。 所以这个流自己可以不关,但是自己开的其他流应该关掉。

Web开发之response的更多相关文章

  1. Vim下的Web开发之html,CSS,javascript插件

    Vim下的Web开发之html,CSS,javascript插件   HTML 下载HTML.zip 解压HTML.zip,然后将里面的所有文件copy到C:\Program Files\Vim\vi ...

  2. Web开发之Tomcat&Servlet

    <!doctype html>01 - JavaEE - Tomcat&Servlet figure:first-child { margin-top: -20px; } #wri ...

  3. 移动web开发之rem适配布局

    移动web开发之rem适配布局 方案: 页面布局文字能否随着屏幕大小变化而变化 流式布局和flex布局主要针对于宽度布局,那高度如何布局? 怎样让屏幕发生变化的时候元素高度和宽度等比例缩放? 1. r ...

  4. Web开发之Cookie and Session

    会话 什么是会话? 简单说:用户开一个浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器,整个过程就称之为一个会话. 会话过程要解决什么问题 每个用户在使用浏览器与服务器进行会话的过程 ...

  5. vert.x学习(三),Web开发之Thymeleaf模板的使用

    在vert.x中使用Thymeleaf模板,需要引入vertx-web-templ-thymeleaf依赖.pom.xml文件如下 <?xml version="1.0" e ...

  6. Web开发之tomcat配置及使用(环境变量设置及测试,一个简单的web应用实例)

    Tomcat的配置及测试: 第一步:下载tomcat,然后解压到任意盘符 第二步:配置系统环境变量 tomcat解压到的D盘 (路径为: D:\tomcat), 配置环境变量: 启动tomcat需要两 ...

  7. Java Web开发之Servlet、JSP基础

    有好多年不搞Java Web开发了,这几天正好国庆放假,放松之余也有兴趣回头看看Java Web开发技术的基础. 我们都知道,Servlet是Java Web开发的重要基础,但是由于Servlet开发 ...

  8. Web开发之RSET API

    REST介绍 如果要说什么是REST的话,那最好先从Web(万维网)说起. 什么是Web呢?读者可以查看维基百科的词条(http://zh.wikipedia.org/zh-cn/Web),具体的我就 ...

  9. .NET Web开发之.NET MVC框架

    摘要:MVC是一种架构设计模式,该模式主要应用于图形化用户界面(GUI)应用程序.那么什么是MVC?MVC由三部分组成:Model(模型).View(视图)及Controller(控制器). MVC概 ...

随机推荐

  1. 学习型的“文山表海无限发展公司”——《Office妖精是怎样炼成的》续1

    本篇无故事情节版:https://www.cnblogs.com/officeplayer/p/14841590.html <Office妖精是怎样炼成的>http://blog.sina ...

  2. CF108A Palindromic Times 题解

    Content 现在是 \(h\) 时 \(m\) 分,请求出在此之后(不包含此时)的第一个回文时间. 数据范围:\(0\leqslant h\leqslant 23,0\leqslant m\leq ...

  3. jquery Ajax 不执行回调函数success的原因

    jquery Ajax 不执行回调函数success的原因: $.ajax({ type: "post", contentType: "application/json& ...

  4. navicat模型分享方法

    一. 查看模型保存路径选中模型如:<app-订单模型>,点击右键,对象信息,可以看到文件位置:C:\Users\Administrator\Documents\Navicat\Premiu ...

  5. ARTS Week 18

    Algorithm 本周的 LeetCode 题目为 55. 跳跃游戏 给定一个非负整数数组 nums, 你最初位于数组的 第一个下标 .数组中的每个元素代表你在该位置可以跳跃的最大长度.判断你是否能 ...

  6. CMake判断操作系统和编译器

    判断操作系统 IF (CMAKE_SYSTEM_NAME MATCHES "Linux") ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Wind ...

  7. 【LeetCode】650. 2 Keys Keyboard 只有两个键的键盘(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 素数分解 日期 题目地址:https://le ...

  8. Boost的反射库PFR

    目录 目录 简介 使用方法 限制 总结 简介 Boost.PFR是一个Boost 1.75版本出的C++14的基础反射库,其使用非常简单,非常便捷,但是适用性也比较差,有很多的地方无法使用,适合比较简 ...

  9. Java中对象的内存分配机制

    一.内存划分 Java把内存划分为两种,一种是栈内存,另一种是堆内存. 1.栈内存 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配.当在一段代码块定义一个变量时,Java就在栈 ...

  10. 编写Java程序,使用Swing事件处理机制实现用户登录和英雄信息显示

    返回本章节 返回作业目录 需求说明: 使用Swing事件处理机制实现用户登录和英雄信息显示 实现思路: 创建LoginView类,该类用于显示登录界面,为登录按钮添加ActionListener事件, ...