i解决Servlet中乱码的问题:
way1:
//设置response使用的码表,以控制response以什么码表向浏览器读出数据
response.setCharacterEncoding("UTF-8"
);
//制定浏览器以什么码表打开服务器发送的数据
response.setHeader("content-type","text/html;charset=UTF-8"
);
way2:
//这个方法间接也把setCharacterEncoding设置好了
//response.setContentType("text/html;charset=UTF-8");
response的getOutputStream和getWriter方法
OutputStream:字节流
//程序以什么输出,就一定要控制什么码打开
private void test1(HttpServletResponse response)
throws IOException,
UnsupportedEncodingException {
response.setHeader("content-type","text/html;charset=UTF-8");
//注意中间是分号,不是逗号
OutputStream out=
response.getOutputStream();
String data="中国"
;
out.write(data.getBytes("UTF-8"
));
}
public void test(){
OutputStream out=
response.getOutputStream();
//用html中的meta标签来模拟一个http响应头,来控制浏览器的响应
out.write(("<meta http-equiv='content-type' content='text/html; charset=UTF-8'>"
).getBytes());
String data="中国la"
;
out.write(data.getBytes("UTF-8"
));
}
PrintWriter://字符流
//设置response使用的码表,以控制response以什么码表向浏览器读出数据
response.setCharacterEncoding("UTF-8"
);
//制定浏览器以什么码表打开服务器发送的数据
response.setHeader("content-type","text/html;charset=UTF-8"
);
//这个方法间接也把setCharacterEncoding设置好了
//response.setContentType("text/html;charset=UTF-8");
PrintWriter p=response.getWriter();
//只能打印字符串
String data="中国d"
;
p.write(1);
//这样是不行的,结果是浏览器制定的数码1对应的数据
p.write(data);
p.print(data);
细节:
*
getOutputStream和getWriter方法分别用于得到输出二进制数据,输出文本数据的
ServeletOutputStream,PrintWriter对象
*
getOutputStream 和getWriter这两个方法是互斥的,调用了其中的一个方法后就不能调用另外一个方法。
java.lang.IllegalStateException:...has already been called for this response(同时调用的异常)
*
Servlet引擎会调用close方法去关闭这两个输出流对象(注意:其他自己创的流要自己关)
刷新有两个作用:1
,不管有没有缓存,就向服务器发出请求
2
,把上次的事情再干一次
重定向:
重定向的特点:
*
浏览器会向服务器发送两次,意味着就有两个response,request
*
重定向技术会使浏览器地址栏会发生变化
用户登录和购物车会用到重定向技术
response.setStatus(302
);
response.setHead("location","URL"
);
=
response.setRedirect("URL"
);实现原理:302状态码和location头即可实现重定向
自动更新:
response.setHeader("refresh","3;url=/day_06/index.jsp"
);
设置缓存:
resoonse.setHeader("expires","time(mills)"
):
注意:比如设置缓存为一个小时System.currentTimeMillIs()+1000*3600
使用response实现资源下载:
String path=
this.getServletContext().getRealPath("/download/1.jpg"
);
String name=path.substring(path.lastIndexOf("\\")+1
);
response.setHeader("content-disposition","attachment;filename="+
name);
InputStream in=
null;
OutputStream out=
null;
try{
in=
new FileInputStream(path);
int len=0
;
byte buffer[]=
new byte[1024
];
out=
response.getOutputStream();
while((len=in.read(buffer))>0
){
out.write(buffer,0
, len);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(in!=
null){
in.close();
}
}
response实现验证码:
小技巧:将鼠标放在图片上,图片出现文字用的是Img中的titile(alt="图片加载失败"
,alt是无法找到图片显示的)
小技巧:将鼠标放在图片上,图片出现文字用的是Img中的titile(alt="图片加载失败",alt是无法找到图片显示的) jsp部分: <script language="javascript" > function update(img){ img.src=img.src+"?"+new Date().getTime(); } </script> 或者οnclick="this.src=this.src+'?'+new Date().getTime()"" <img src="/day_06/Demo3" title="换一张" alt="图片加载失败" οnclick="update(this)" style="cursor:pointer"><br/>
Servlet代码 import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo3
extends HttpServlet {
private static final int HEIGHT =25
;
private static final int WIDTH = 123
;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8"
);
response.setHeader("content-type","text/html;charset=UTF-8"
);
BufferedImage b=
new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
Graphics g=
b.getGraphics();
//设置背景色
setBackGround(g);
//设置表框
setBorder(g);
//画干扰线
dramLine(g);
//写随机数
setRandomNumber((Graphics2D)g);
//图像写给浏览器
response.setContentType("image/jpeg"
);
//静止缓存这张图片,不是再进这个网站是无法获得新的图片
//图片动态变化不要缓存
response.setDateHeader("expries",-1
);
response.setHeader("Pragma","no-cache"
);
response.setHeader("Cache-control","no-cache"
);
ImageIO.write(b,"jpg"
,response.getOutputStream());
}
private void setRandomNumber(Graphics2D g){
g.setColor(Color.RED);
g.setFont(new Font("宋体",Font.BOLD,20
));
int x=10
;
for(
int i=0;i<4;i++
){
Random random=
new Random();
int number=random.nextInt(10
);
int dushu=random.nextInt()%60
;
g.rotate(dushu*Math.PI/180,x,20);
//,x,20);
g.drawString(number+"", x, 20
);
g.rotate(-dushu*Math.PI/180,x,20);
//旋转回去
x+=30
;
}
}
private void dramLine(Graphics g){
g.setColor(Color.GREEN);
Random random=
new Random();
for(
int i=0;i<5;i++
){
int x1=
random.nextInt(WIDTH);
int y1=
random.nextInt(HEIGHT);
int x2=
random.nextInt(WIDTH);
int y2=
random.nextInt(HEIGHT);
g.drawLine(x1, y1, x2, y2);
}
}
private void setBorder(Graphics g) {
g.setColor(Color.BLACK);
g.drawRect(1, 1, WIDTH-2, HEIGHT-2
);
}
private void setBackGround(Graphics g) {
g.setColor(Color.white);
g.fillRect(0, 0
, WIDTH, HEIGHT);
}