1. Response控制字符的输出,尤其是中文
第一种,直接设置输出字符集。
String data = "中国";
//response.setHeader("content-type", "text/html;charset=utf-8");
response.setContentType("text/html;charset=utf-8");
OutputStream os = response.getOutputStream();
os.write(data.getBytes("utf-8"));
第二种,仿HTML语言设置字符编码集
String data = "中国你好!";
OutputStream os = response.getOutputStream();
os.write("<meta http-equiv='content-type' content-type='text/html;charset=utf-8'>".getBytes());
os.write(data.getBytes("utf-8"));
第三种,采用字符流的方式
String data = "中国你好,北京";
response.setHeader("content-type", "text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
response.getWriter().write(data);
在各种设置的方法中,设置字符集必须在获得输出流之前,因为在获取输出流的时候,就已经在查码表了。
2.文件的下载(尤其是中文名称的资源),中文文件名要经过URL的编码指定
注意:字节流可以处理任何的数据类型,而字符流只能处理字符类型,如果用字符流去处理图片或者音频,会造成只下载了部分,会有数据的丢失。
String realPath = this.getServletContext().getRealPath("/download/车子.jpg");
String filname = realPath.substring(realPath.lastIndexOf("\\")+1);
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(filname,"utf-8"));
FileInputStream fin = new FileInputStream(realPath);
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while((len=fin.read(buffer))>0){
out.write(buffer, 0, len);
}
fin.close();
3.输出随机图片
//保证每次刷新,都能得到新的图片,因此要设置不缓存头
private static final int HEIGHT = 25;
private static final int WIDTH = 120;
response.setHeader("Expires", "-1");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
//BufferedImage:代表内存图片
BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
//Graphics:代表画笔
Graphics g = image.getGraphics();
//画边框
g.setColor(Color.RED);
g.drawRect(0, 0, WIDTH, HEIGHT);//选中的单词,ctrl+shift+x-->变大写 ctrl+shift+y-->变小写
//填充背景色
g.setColor(Color.YELLOW);
g.fillRect(1, 1, WIDTH-2, HEIGHT-2);
//画干扰线:9条
g.setColor(Color.BLUE);
Random r = new Random();
for(int i=0;i<9;i++)
g.drawLine(r.nextInt(WIDTH), r.nextInt(HEIGHT), r.nextInt(WIDTH), r.nextInt(HEIGHT));
//画随机的数字:4个
g.setColor(Color.GRAY);
g.setFont(new Font("宋体", Font.BOLD|Font.ITALIC, 20));
int x = 20;
for(int i=0;i<4;i++){
String num = r.nextInt(10)+"";
g.drawString(num, x, 20);
x+=18;
}
//ImageIo:输出
ImageIO.write(image, "jpg", response.getOutputStream());
在HTML页面上显示验证的图片
<body>
用户名 :<input type="text" name="username"> <br>
密码 :<input type="password" name="passwor"> <br>
登陆 :<input type="text" name="checkcode"><img src="/day06/servlet/ResponseDemo2">
<input type="submit" value="注册">
</body>
4. response设置页面的定时刷新和跳转,设置刷新的头,以及刷新的时间为2秒,url对应跳转页面
response.setHeader("Refresh", "2;url=/day06/index.html");
response.getOutputStream().write("欢迎来刷新".getBytes());
5. 请求重定向
response.setStatus(302);
response.setHeader("Location", "/day06/servlet/ResponseDemo1");
response.sendRedirect("/day06/servlet/ResponseDemo1");