JavaWeb笔记——HttpServletRespone


狂神网课笔记,自用


关系:web服务器接收到客户端http的请求,针对这个请求,分别创建一个获取客户端请求参数的HttpServletResquest,和一个给客户端一些响应的HttpServletResponse。

一、HttpServletRespone

1.1常见方法

  1. 向游览器发送数据方法:
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
  1. 向游览器发送响应头的方法:
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);

——tips1:lastIndexOf()

  1. 方法:返回某个子字符串在父字符串中最后出现的位置。
  2. 语法:
    1)substring是需要查找的子字符串;
    2)startindex是起始点,可不设置,默认从字符串末尾向前查找最后一个;
    3)输出值为该子字符串开头下标,默认从0开始计数。
lastIndexOf(substring,startindex)
  1. 实例:
public class LastIndexOf_test {
    public static void main(String[] args) {
        String str = "abcdefcdg";//下标从0计数,a是0
        int getStrCD1Index = str.lastIndexOf("cd",5);//从下标为5的f开始,向前找cd
        int getStrCD2Index = str.lastIndexOf("cd");//默认从最末的g开始向前找cd
        System.out.println("cd1下标:"+getStrCD1Index);
        System.out.println("cd2下标:"+getStrCD2Index);
    }
}

运行结果:
在这里插入图片描述
4. 应用:和从父字符串中截取子字符串的方法substring(startIndex,endIndex)组合使用

String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);

——tips2:FileInputStream流

详见:FileInputStream(文件字节输入流)
解析:(len = is.read(buffer)) != -1.md


——tips3:设置响应头——setHeader()

response.setHeader的各种用法
常见的设置:

1)下载文件:
response.setHeader( "Content-Disposition", "attachment;filename=" +filename);
2)两秒刷新页面:
response.setHeader("refresh","2");
3)关闭缓存:
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");

1.2 实例1—— 自动下载文件

  1. 下载文件的response函数:
response.setHeader( "Content-Disposition", "attachment;filename=" +filename);
  1. 流程:
    1)获取下载文件的路径
    2)获取下载文件名,使用方法substring和方法lastIndexOf
    3)让游览器支持下载的文件类型,方法resp.setHeader
    4)创建输入流类型FileInputStream,使用绝对地址获取下载文件的输入流
    5)创建缓冲区,包括存储读取文件长度的len,限制最大读取字节长度的buffer
    6)获取OutputStream对象
    7)将FileOutputStream写入到buffer缓冲区
    8)使用OutputStream将缓冲区数据输出到客户端
  2. 实例:在网页中自动下载本地的图片
    1)获取本地图片的绝对地址:
    在这里插入图片描述
    2)类FileServlet的doGet方法:
 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//下载文件:
//1)获取下载文件的路径
        String realPath = "改成需要下载的文件的绝对地址";
        System.out.println("下载文件地址:"+realPath);
//2)下载文件名
        String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
//3)让游览器支持(参数:"Content-Disposition")下载的文件类型(附件:"attachment;")
        resp.setHeader("Content-Disposition","attachment;filename="+fileName);
//4)获取下载文件的输入流
        FileInputStream fileInputStream = new FileInputStream(realPath);//文件的实际地址作为参数,创建输入流
//5)创建缓冲区
        int len = 0;//读取文件的长度
        byte[] buffer = new byte[1024];//每次最多读取的字节长度
//6)获取OutputStream对象
        ServletOutputStream outputStream = resp.getOutputStream();
//7)将FileOutputStream写入到buffer缓冲区
        //fileInputStream.read(buffer):一次从该输入流中读取最多buffer字节的内容,直到读完返回-1
        //实例,如果下载100byte的文件,buffer=10,则文件分为{100除以10并向上取整+1}份读取,读11份,其中最后一份是空的,返回-1
        while((len=fileInputStream.read(buffer))>0){
//8)使用OutputStream将缓冲区数据输出到客户
            //outputStream.write:数据写入输出流;buffer:指定字节,off:数组buffer中将写入数据的初始偏移量;len:待读取的最大字节数
            outputStream.write(buffer,0,len);
        }
        //保证信息安全,流使用完后关闭
        fileInputStream.close();
        outputStream.close();

        resp.getWriter().println("下载"+fileName);
    }

3)在web.xml注册;
4)运行效果:输入网址回车后自动下载
在这里插入图片描述

  1. 下载文件名是中文,出现乱码的问题:修改resp.setHeader在读取文件名时的编码格式
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));

——tips4:图片类BufferedImage

  1. 内存中创建画布:
 BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);//宽,高,图片类型
  1. 创建画笔:
Graphics graphics = (Graphics2D) bufferedImage.getGraphics();
  1. 设置画笔的参数函数:
graphics.setColor(Color.WHITE);//设置笔的背景颜色
 graphics.fillRect(0,0,60,60);//填充矩形
 graphics.setFont(new Font(null,Font.BOLD,20));//字体设置

1.3 实例2—— 验证码功能

  1. 刷新页面:
response.setHeader("refresh","2");
  1. 关闭缓存:
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
  1. 实现方法:
    1)前端实现——js
    2)后端实现——需要使用java的图片类,产生图片
  2. 实例:定时刷新随机数的验证码功能

流程:新建画布->新建画笔设置参数->resp.setContentType()打开方式设置->ImageIO()写给游览器
1)类ImageServlet的方法doGet:

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //游览器刷新,3秒一次
        resp.setHeader("refresh","3");
        //内存中创建一个画布
        BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
        //新建画笔
        Graphics graphics = (Graphics2D) bufferedImage.getGraphics();//笔
        //设置背景
        graphics.setColor(Color.WHITE);//设置笔的背景颜色
        graphics.fillRect(0,0,60,60);//填充矩形
        //给图片写数据
        graphics.setColor(Color.black);
        graphics.setFont(new Font(null,Font.BOLD,20));//字体设置
        graphics.drawString(makeRandomNums(),0,20);//绘制随机数
        //以图片方式打开
        resp.setContentType("image/png");
        resp.setDateHeader("expires",-1);//网站存在缓存,关闭缓存
        resp.setHeader("Cache-Control","no-cache");//关闭cache
        resp.setHeader("Pragma","no-cache");
        //把图片写给游览器
        ImageIO.write(bufferedImage,"png",resp.getOutputStream());
    }

2)随机数生成方法makeRandomNums:

private String makeRandomNums(){
            Random random = new Random();
            String randomNums = random.nextInt(99999) + "";//随机生成五位数,转为String保存
            StringBuffer stringBuffer = new StringBuffer();
            //随机生成的五位数中,肯定存在低于五位的,如123,当随机生成的位数低于5时,末尾自动填充0,即输出为12300
            for(int i=0;i<5- randomNums.length();i++){
                stringBuffer.append("0");
            }
            randomNums = stringBuffer.toString() + randomNums;
            return randomNums;
        }

3)web.xml注册
4)运行效果:每三秒刷新一次
在这里插入图片描述


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值