下载文件
package com.mrli;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.w3c.dom.ls.LSOutput;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
public class responseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取需要下载的文件绝对路径
String realpath="D:\\idea\\javaweb-maven-01\\response\\src\\main\\resources\\img.png";
System.out.println(realpath);
//需要下载的文件名
String filename=realpath.substring(realpath.lastIndexOf("\\")+1);
//设置response头信息
resp.setHeader("Content-Dispostion","attachment;filename="+ URLEncoder.encode(filename,"UTF-8"));
//获取文件输入流
FileInputStream fis = new FileInputStream(realpath);
//创建缓冲区
int len=0;
byte[] buffer=new byte[1024];
//获取响应输出流
ServletOutputStream outputStream = resp.getOutputStream();
while((len=fis.read(buffer))!=-1){
//输出文件
outputStream.write(buffer,0,len);
}
//关闭资源
fis.close();
outputStream.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
实现验证码功能
package com.mrli;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
public class imageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setHeader("refresh","3");//告诉浏览器每三秒刷新一次
BufferedImage bufferedImage = new BufferedImage(100, 30, BufferedImage.TYPE_INT_RGB);//在内存中创建一个图片
Graphics2D graphics = (Graphics2D) bufferedImage.getGraphics();//获得图片的笔
graphics.setColor(Color.white);//设置画笔颜色
graphics.fillRect(0,0,100,30);//填充一个举行,从(x,y)开始填充,填充一个widdth*height的矩形
graphics.setColor(Color.BLUE);//设置画笔颜色
graphics.setFont(new Font(null,Font.BOLD,25));//设置画笔的字体
graphics.drawString(randomNum(8),0,30);//画一个字符串
resp.setContentType("image/jpg");//设置响应类型为jpg格式的image
//告诉浏览器不要缓存
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
//将图片写入到响应对象
ImageIO.write(bufferedImage,"jpg",resp.getOutputStream());
}
//获取n长度的随机数
private String randomNum(int n){
Random random =new Random();
String str = "";
for (int i = 0; i < n; i++) {
str+= random.nextInt(10) + "";
}
return str;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
重定向
index.jsp表单提交之后到项目目录下的/login下处理请求
<html>
<body>
<h2>Hello World!</h2>
<form action="${pageContext.request.contextPath}/login" method="get">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit">
</form>
</body>
</html>
处理请求的文件
package com.mrli;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class loginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username=req.getParameter("username");//getParameter获取请求中的一个参数
String password=req.getParameter("password");
System.out.println(username+"---->"+password);
//sendRedirect重定向做的事情就是下面这两句
//resp.setHeader("Location","/img");
//resp.setStatus(302);
resp.sendRedirect("/r/img");//sendRedirect重定向
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
面试题:请你说说重定向和转发的区别?
相同点
- 都会跳转页面
不同点
- 转发不会改变url,307
- 重定向会改变url,302