6.6、HttpServletResponse
web服务器接收到客户端的Http请求,会针对这个请求分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse对象;
- 如果要获取客户端请求过来的参数:找HttpServletRequest
- 如果要给客户端响应一些信息:找HttpServletResponse
1、简单分类
- 负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
- 负责向浏览器发送响应头的方法
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentType(String var1);
void setBufferSize(int 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);
- 响应的状态码
int SC_OK = 200;//响应成功
int SC_NOT_FOUND = 404;//找不到资源,资源不存在
int SC_INTERNAL_SERVER_ERROR = 500;//服务器代码错误
int SC_BAD_GATEWAY = 502;//网关错误
//3XX 请求重定向
2、常见应用
- 向浏览器输出消息
- 下载文件
- 要获取下载文件的路径
- 下载的文件名
- 设置想办法让浏览器能够支持我们需要的东西
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStream对象
- 将FileOutputStream流写入buffer缓冲区
- 使用OutputStream将缓冲区的数据输出到客户端
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 要获取下载文件的路径
String realPath = "D:\\App\\IDEA\\Project\\response\\src\\main\\resources\\叶通.jpg";
System.out.println("下载文件的路径:" + realPath);
//2. 下载的文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
//3. 设置想办法让浏览器能够支持(Content-Disposition)我们需要的东西,中文文件名URLEncoder.encode编码,否则可能有乱码
resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
//4. 获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
//5. 创建缓冲区
int len = 0;
byte[] bytes = new byte[1024];
//6. 获取OutputStream对象
ServletOutputStream out = resp.getOutputStream();
//7. 将FileOutputStream流写入buffer缓冲区,8. 使用OutputStream将缓冲区的数据输出到客户端
while ((len = in.read(bytes)) > 0) {
out.write(bytes, 0, len);
}
in.close();
out.close();
}
注意:调试时遇到一个错误,讲逻辑处理写在doPost()里面,访问过去并没有出现下载也没有报错
3、验证码功能
验证码怎么来?
- 前端实现
- 后端实现,需要用到java的图片类,生成一个图片
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如何让浏览器3秒自动刷新一次
resp.setHeader("refresh", "3");
//如何在内存中创建一个图片
BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
//得到图片
Graphics2D g = (Graphics2D) image.getGraphics();//笔
//设置图片背景颜色
g.setColor(Color.white);
g.fillRect(0, 0, 80, 20);
//给图片写数据
g.setColor(Color.blue);
g.setFont(new Font(null, Font.BOLD, 20));
g.drawString(makeNun(), 0, 20);
//告诉浏览器,这个请求用图片的方式打开
resp.setContentType("image/jpg");
//网站存在缓存,不然浏览器缓存
resp.setDateHeader("expires", -1);
resp.setHeader("Cache-Control", "no-cache");
resp.setHeader("Pragma", "no-cache");
//把图片写个浏览器
ImageIO.write(image, "jpg", resp.getOutputStream());
}
private String makeNun() {
Random random = new Random();
String num = random.nextInt(9999999) + "";
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 7 - num.length(); i++) {
sb.append("0");
}
String s = sb.toString() + num;
return num;
}
4、实现重定向
一个web资源B收到客户端A请求后,他会通知客户端A去访问另外一个web资源C,这个过程就叫重定向
常见场景:
- 用户登录
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*两句话直接可以用一句话代替
resp.setHeader("Location","/image");
resp.setStatus(302);
*/
resp.sendRedirect("/image");
}
面试题:请你聊聊重定向和转发的区别?
相同点:
- 都可以实现页面的跳转
不同点:
- 请求转发的时候,url不会发生变化;307
- 重定向的时候,url地址栏会相应变化;302
6.7、HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,Http请求中的所有信息会被封装到HttpServletRequest,通过
这个方法可以获得客户端的所有信息
简单分类:和HttpServletResponse刚好对应,这边刚好都是get
1、获取前端传递的参数
重点掌握两个方法
req.getParameter("");
req.getParameterValues("");
2、请求转发
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbies = req.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
System.out.println(username+":"+password);
//请求转发,特别注意这边的/,代表当前web应用
req.getRequestDispatcher("/success.jsp").forward(req,resp);
//重定向
//resp.sendRedirect("/s/success.jsp");
}