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);

    }

}
验证码

相关文章:

  • 2021-12-12
  • 2022-12-23
  • 2022-12-23
  • 2021-11-09
  • 2021-10-18
猜你喜欢
  • 2022-01-29
  • 2021-08-31
  • 2021-11-27
  • 2021-07-05
  • 2022-12-23
  • 2021-10-03
  • 2021-11-13
相关资源
相似解决方案