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("末日没有进行曲");
- getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。
- Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
- Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。 所以这个流自己可以不关,但是自己开的其他流应该关掉。