Java学习之servlet02之response重定向,输出字符数据到浏览器,验证码,中文乱码问题解决

response重定向

  1. 概念:浏览器访问服务器资源,服务器响应,返回302状态码和资源所在路径
  2. 代码是实现
    // 1.设置状态码为302
    respomse.setStatus(302);
    //2.设置响应头
    response.setHeader("location","资源路径");
    
  3. 显然,上面的代码在进行重定向时操作时,只有资源路径是根据资源的不同会有所变化,而其他地方的写法是固定的,所以为了简化操作,java提供了简化的方法,即sendRedirect(“资源路径”)。
  4. 请求转发与重定向对比
    • 请求转发的特点
      • 转发地址栏路径不变
      • 转发只能访问当前服务器下的资源
      • 转发只是一次请求
      • 可以使用request对象来共享数据
    • 重定向的特点
      • 重定向地址栏发生变化
      • 重定向可以访问其他站点的资源
      • 重定向是两次请求
      • 不能用request对象来共享数据
  5. 路径的写法:
    • 路径的分类:相对路径和绝对路径
    • 相对路径:通过相对路径不可以去欸的确定唯一资源
      如:./index.html,不以 ‘/’ 开头的路径,规则:找到访问当前资源和目标资源的位置关系,’./’ 代表当前路径,‘ …/ ’(这里是两个点,csdn的显示问题) 代表上一级目录
    • 绝对路径:通过绝对路径可以确定唯一资源
      http://localhost:8080/week01//wednesday/responseDemo2,因为前面的ip是固定的,所以也通常简化为/wednesday/responseDemo2,可以简单地认为,以 ‘/’ 开头的路径为绝对路径。
      • 规则:判断定义的路径是给谁用的?判断请求将来从哪发出
        • 给客户端浏览器使用(请求从客户端发出,例如a标签点击事件):需要加虚拟目录wednesday/responseDemo2
        • 给服务器使用(请求从服务器端发出,例如请求转发):不需要加虚拟目录/responseDemo2
        • 虚拟目录一般是由方法来动态地获取,以便即使动态目录有所改变,也不必修改所有的代码。

服务器输出字符到浏览器

  1. 获取字符输出流
    response.getWriter();
  2. 输出数据
    getWriter().println()
  3. 中问乱码问题
    • 乱码原因:编解码使用的编码格式不一致
    • 查看浏览器解码的通用方法:按f12,在控制台中输入document.characterSet即可看到浏览器的解码方式
    • 解决乱码
    • 告知浏览器编码(告知的同时也设置了流的编码):resp.setContentType("text/html;charset=utf-8")
    • 注意:这段代码要放在流创建之前

服务器输出字节数据到浏览器

  1. 设置编码
    resp.setContentType("text/html;charset=utf-8");
  2. 获取字节输出流
    ServletOutputStream sos = resp.getOutputStream();
  3. 输出数据
    sos.write("hello 你好".getBytes());

验证码

  1. 本质:是一张图片
  2. 作用:防止有人恶意注册
  3. 举例:写一张验证码:
    //       设置宽高
            int width =100;
            int height = 50;
    //
    //        1.创建一个对象,在内存中画一张图(验证码图片对象)
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    //        2.美化图片
            Graphics g = image.getGraphics();//画笔对象
            g.setColor(Color.WHITE);//设置画笔颜色
            g.fillRect(0,0,width,height);//填充颜色
    //        2.2话边框
            g.setColor(Color.RED);
            g.drawRect(0,0,width-1,height-1);//使其画在方框内,框和高都减去一个像素
    //        2.3在图片中写字符串
            g.setColor(Color.BLACK);
    
            String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
    //        生成随机角标
            Random ran = new Random();
            for (int i = 0; i < 4; i++) {
    
            int index = ran.nextInt(str.length());
    //        获取字符
            char ch = str.charAt(index);
            g.drawString(ch+"",20+i*20,25);
            }
    //        画干扰线
            g.setColor(Color.GREEN);
    //        随机生成坐标点
            for (int i = 0; i <10 ; i++) {
            int x1 = ran.nextInt(width);
            int y1 = ran.nextInt(height);
            int x2 = ran.nextInt(width);
            int y2 = ran.nextInt(height);
            g.drawLine(x1,y1,x2,y2);
    
            }
    
    //        将图片输出到页面显示
            ImageIO.write(image,"jpg",resp.getOutputStream());
    
  4. 在登陆验证的时候我们通常使用别人已经写好的代码,然后自己修改就可以了,主要是能看懂,毕竟自己写的验证码还是很简陋的。
  5. 在表单登陆验证时,需要只更新验证码的时候,使用的方法是用js改变img标签的src,操作步骤为
    • 获取img对象
    • 设置img.src的值
    • 在路径后面加上?后面跟时间戳,因为图片会被浏览器缓存,如果路径不变,图片不会重新加载,所以需要在后面给一个参数,一个不会重复的参数,时间是不会重复的,所以在后面跟一个时间戳
      • js代码
          var img = document.getElementById("checkCode");
      	img.onclick = function(){
         // 加时间戳
         	var date = new Date().getTime();
        	img.src='/thursday/responseDemo4?'+date;
      }
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值