目录
Request:是请求对象。Response:是应答对象
由页面请求到Servlet,由Servelt的service(request,response)方法应答给页面。 request对象是用来封装请求数据的对象 。 response对象是用来封装响应数据的对象 。
Request获取请求行数据
请求行数据包括三部分{分别是 请求方式 、 请求资源路径 、 HTTP协议及版本};对于这三部分内容,request对象都提供了对应的API方法来获取。
Request请求转发
1. 请求转发(forward):一种在服务器服务器内部的资源跳转
2.实现方式:request.getRequestDispatcher("资源路径").forward(request,response);
Respones重定向
请求转发与响应重定向的区别
1.请求转发是服务器跳转,只会产生一次请求。请求转发语句
request.getRequestDispatcher().forward().
2.重定向是向浏览器跳转,会产生两次请求。响应重定向语句是
response.sendRedirect()
Session
response重定向产生两次请求,导致第一次存入request对象的共享数据第二次无法获取,因此要将数据存入一个范围更大的对象Session。
实现方式:
request.getSession().setAttribute(key,Object);
request.getSession().getAttribute(key);
Response响应字符
response.setContentType( "text/html" ); "text/xml" "text/json"
Response响应字节数据(验证码)
response.setContentType("image/jpg"); "application/mp4"
验证码的目的:进行人机识别,以防程序大量注册。
页面生成图片验证码图片:
<img src="checkCode">
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//准备工作
response.setContentType("image/jpg");
//返回的是一个图片类型都是规定好的,如写错规定类型浏览器就无法识别类型就会下载下来
//用的是二进制字节流
OutputStream outputStream=response.getOutputStream();
//生成图片
int width=100;
int height=50;
//创建一个对象,能在内存中生成一个图片
BufferedImage image=new BufferedImage(
width,
height,
BufferedImage.TYPE_INT_RGB
);
//一、填充图片
//2.1填充背景图片
Graphics g= image.getGraphics();
g.setColor(Color.pink);
g.fillRect(0,0,width,height);
//2.2画边框
g.setColor(Color.blue);
g.drawRect(0,0,width-1,height-1);
//2.3生成随机验证码,并画到图片中
String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuwxyz0123456789";
Random random=new Random();
StringBuffer sb=new StringBuffer();
for (int i = 0; i < 4; i++) {
int index=random.nextInt(str.length());
//通过下标获取字符
char ch=str.charAt(index);//生成随机字符
sb.append(ch);//把生成的字符添加到stringBuffer里
g.drawString(ch+"",width/5*i,height/2);
}
//验证码放入到共享对象中 选择(Session)
request.getSession().setAttribute("checkCode",sb.toString());
//2.4 生成干扰线,让爬虫程序读不出我们生成的字符串
g.setColor(Color.green);
//随机生成坐标点
for (int i = 0; i < 10; i++) {//10.fori回车自动生成for循环体
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);//生成线
}
//3.将图片输出到页面
ImageIO.write(image,"jpg",outputStream);
}
}
心得:
转发与重定向的差别,重定向简单理解就是多次请求,而request共享数据范围没有那么大,只能一次请求一次应答,所以转发用request。重定向用Session共享数据范围可以。在Servlet中请求处理的行为方式是,以线程的方式。