JavaWeb笔记——HttpServletRespone
狂神网课笔记,自用
关系:web服务器接收到客户端http的请求,针对这个请求,分别创建一个获取客户端请求参数的HttpServletResquest,和一个给客户端一些响应的HttpServletResponse。
一、HttpServletRespone
1.1常见方法
- 向游览器发送数据方法:
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
- 向游览器发送响应头的方法:
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)substring是需要查找的子字符串;
2)startindex是起始点,可不设置,默认从字符串末尾向前查找最后一个;
3)输出值为该子字符串开头下标,默认从0开始计数。
lastIndexOf(substring,startindex)
- 实例:
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—— 自动下载文件
- 下载文件的response函数:
response.setHeader( "Content-Disposition", "attachment;filename=" +filename);
- 流程:
1)获取下载文件的路径
2)获取下载文件名,使用方法substring和方法lastIndexOf
3)让游览器支持下载的文件类型,方法resp.setHeader
4)创建输入流类型FileInputStream,使用绝对地址获取下载文件的输入流
5)创建缓冲区,包括存储读取文件长度的len,限制最大读取字节长度的buffer
6)获取OutputStream对象
7)将FileOutputStream写入到buffer缓冲区
8)使用OutputStream将缓冲区数据输出到客户端 - 实例:在网页中自动下载本地的图片
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)运行效果:输入网址回车后自动下载
- 下载文件名是中文,出现乱码的问题:修改resp.setHeader在读取文件名时的编码格式
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
——tips4:图片类BufferedImage
- 内存中创建画布:
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.setFont(new Font(null,Font.BOLD,20));//字体设置
1.3 实例2—— 验证码功能
- 刷新页面:
response.setHeader("refresh","2");
- 关闭缓存:
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
- 实现方法:
1)前端实现——js
2)后端实现——需要使用java的图片类,产生图片 - 实例:定时刷新随机数的验证码功能
流程:新建画布->新建画笔设置参数->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)运行效果:每三秒刷新一次