1.
request代表请求对象
response代表的响应对象。
学习它们我们可以操作http请求与响应。
2.request,response体系结构.
在我们Servlet中使用的request与response
HttpServletRequest接口------>父接口 ServletRequest
HttpServletResponse接口----->父接口 ServletResponse
在tomcat中它采用门面模式对requst,response进行操作.
对外提供使用的是 RequestFacade ResponseFacade这两个类,
但是直正完成功能的是 Reqeust,Response类.
关于reqeust,response总结:
1.它的作用:
request代表的是http请求对象,通过reqeust可以获取Http请求信息.
response代表的是http响应对象,通过response可以设置响应信息。
2.在我们的servlet中使用的request,response是怎样来的?
它是tomcat服务器帮助创建的,通过service方法传递到了我们的servle中。tomcat在创建request对象时,就将http请求中的信息封装到request中.
3.它们的体系结构
ServletReqeust------>HttpServletReqeust-------->具体的实现类是由服务器创建的。tomcat中是 RequestFacade
ServletResponse----->HttpServletResponse------->具体的实现类是由服务器创建的。tomcat中是 ResponseFacade
HttpServletResponse对象.
它代表的是response响应对象,可以通过这个对象去操作http响应信息.
1.响应行
响应行中重要的是状态码.
response对象可以通过 setStatus(int num)方法去操作.
2.响应头
setHeader()
addHeader()
setDateHeader();
setIntHeader();
3.响应正文
我们通过输出流,操作http响应中的响应正文:
1.获取到的字节流与字符流的类型。
字符流 PrintWriter out=response.getWriter();
字节流 ServletOutputStream sos=response.getOutputStream();
2.字符流与字节流选择
~~字符流:操作文本:
~~ 字节流:如果信息没有改变,只是做copy操作,就选择字节流。操作二进制:图片,音频使用。
我们需要手动在浏览器上显示信息时,一般会使用字符流。
注意事项
1.在一个servlet中只能选择使用一种流,不能两个一起使用,因为它们是排斥的。
2.在servlet中使用完流后,流可以不关闭,tomcat服务器会自动检查,关闭流.
3.我们可以通过response获取输出流,向浏览器写一个页面。但是会出现乱码问题.
当用字节流输出时,我们为防止乱码,要设置两次编码格式:
response.setContentType("text/html;charset=UTF-8");
os.write(str.getBytes("UTF-8"));
而用字符流输出时,一次就可以(这一句相当于两句)
response.setContentType("text/html;charset=UTF-8");
响应头
示例1:通过response去实现重定向.
设置状态码为302 设置location为指定的值.
response.setStatus(302);
response.setHeader("location",url);
注意:url是客户端路径。如果不写协议,那么要以/开头。这里是绝对路径基本格式是/工程名/资源路径.
在开发中我们一般不使用上面的方式完成重定向,使用 response.sendRedirect(url);
原理 302+Lcoation
* 特点: 客户端发出2次请求
* 地址栏改变
* request 域中的数据不能共享
示例2:通过response来控制响应头,完成指定时间跳转到指定页面.
//带协议路径
//response.setHeader("refresh", "3;url=http://localhost/day10/index.html");
//不带协议路径
//response.setHeader("refresh", "3;url=/day10/index.html");
在开发中如果要完成跳转操作,一般很少在服务器端完成,在客户端通过html就可以完成跳转换操作.
<meta http-equiv="refresh" content="5;url=/day10/index.html">
如果要想在页面上显示时间变化,那么可以通过js完成操作.
<script type="text/javascript">
var time = 5;
var span;
var interval;
window.onload = function() {
span = document.getElementById("num");
span.innerHTML = time;
interval=window.setInterval("show()", 1000);
};
function show() {
time--;
if(time==0){
window.clearInterval(interval);
return;
}
span.innerHTML = time;
}
</script>
实例3:控制浏览器禁止缓存当前文档内容
禁止使用缓存:通过三个header设置.
response.setHeader("Cache-Control ", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", -1);
response示例----动态验证码(代码不要求,要求会使用)à防止恶意注册与刷机。
package cn.zl.response; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; 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; /** * 验证码输出 * @author wangli * */ public class AuthCodeServletDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int height=25,width=120; //1.得到一个图像缓冲区 BufferedImage BufferedImage bimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //2.得到一只画笔 Graphics Graphics g = bimage.getGraphics(); //3.画矩形,填背景色 画干扰线条 画字符串 //3.1画矩形框时,可以先调画笔颜色 g.setColor(Color.BLUE);//先调画笔颜色 g.drawRect(0, 0 , width, height); //3.2填充背景 g.setColor(Color.YELLOW);//调画笔颜色 g.fillRect(1,1, width-2, height-2); //3.3画干扰线条 g.setColor(Color.GRAY);//调画笔颜色为灰色 Random random = new Random();//因为要画随机线条,引入随机数 for (int i = 0; i < 20; i++) { //random.nextInt(width)因为要确定x坐标不能超范围 g.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height)); } //3.4画随机字符串 先要控制字符颜色,及字体大小 g.setColor(Color.RED); // Font.BOLD|Font.ITALIC 两种类型做迭加 g.setFont(new Font("黑体",Font.BOLD|Font.ITALIC,20)); for (int i = 0; i < 4; i++) { g.drawString(random.nextInt(9)+"",20+(i*20), 20); } //4.将画好的缓冲区的图像写入到浏览器中 //4.1服务器要通过响应消息头,告知客户端,给它写的内容是一个一幅图片 response.setHeader("Content-Type", "image/jpeg"); //为了更好的让验证码,在客户端不要缓存,设置响应头,告诉客户端不要缓存 response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setHeader("Expires", "-1"); //4.2 写数据到浏览器 ImageIO ImageIO.write(bimage, "jpg", response.getOutputStream()); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }