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 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);
响应的状态码,可以回顾 https://blog.edjoke.com/archives/534.html 4.4
2、常见应用-下载文件
1.向浏览器输出消息
2.下载文件
1.要获取下载文件的路径
2.下载的文件名是什么?
3.设置想办法让浏览器能够支持下载我们需要的东西
4.获取下载文件的输入流
5.创建缓冲区
6.获取OutputStream对象
7.将FileOutputStream流写入到buffer缓冲区
8.使用OutputStream将缓冲区中的数据输出到客户端!
3的疑问1
javaWeb项目-文件下载的消息头和编码问题
https://blog.csdn.net/weixin_33747129/article/details/93745005
3的疑问2
使用Content-Disposition: attachment; filename=FILENAME,在Firefox浏览器中下载文件,文件名中文乱码问题解决。
https://blog.csdn.net/Jon_Smoke/article/details/53699400?fps=1&locationNum=5
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.要获取下载文件的路径
//String realPath = this.getServletContext().getRealPath("/1.png");
String realPath = "D:\\CIINTool\\CIIN_Java\\Java_Web\\javaweb-02-servlet\\response\\target\\classes\\陈爺.png";
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[] buffer = new byte[1024];
//6.获取OutputStream对象
ServletOutputStream out = resp.getOutputStream();
//7.将FileOutputStream流写入到buffer缓冲区
while ((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
//8.使用OutputStream将缓冲区中的数据输出到客户端!
in.close();
out.close();
}
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);
//如何得到图片 getGraphics()其实是一个画笔
Graphics2D g = (Graphics2D) image.getGraphics(); //笔
//设置图片背景颜色
g.setColor(Color.white);
//填充矩形
g.fillRect(0,0,140,20);
//给图片写数据
g.setColor(Color.blue);
//设置字体
g.setFont(new Font(null,Font.BOLD,20));
//画字体
g.drawString(makeNum(),0,18);
//告诉浏览器,这个请求用图片的方式打开
resp.setContentType("image/jpeg");
//网站存在缓存,不让浏览器缓存
resp.setDateHeader("expires",-1); //禁止浏览器缓存
resp.setHeader("Cache-Control","no-cache"); //缓存策略不缓存
resp.setHeader("Pragma","no-cache");
//图片写给浏览器
boolean write = ImageIO.write(image,"jpg", resp.getOutputStream());
}
随机数生成
//生成随机数
private String makeNum(){
Random random = new Random();
String num = random.nextInt(9999999) + "";//8位随机数 转换成字符串 + ""
StringBuffer sb = new StringBuffer();
for (int i=0;i<7-num.length();i++){
sb.append("0");
}
num = sb.toString() + num;
return num;
}
4、实现重定向(需掌握)
B一个web资源收到客户端A的请求后,B他会通知客户端A去访问另外一个web资源C,这个过程叫重定向。
常见场景:
。用户登录
void sendRedirect(String var1) throws IOException;
测试
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//resp.sendRedirect("/index.jsp"); 这个地址不一定正确
/*
* 重定向做了两件事
resp.setHeader("Location","/s3/img");
resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); //resp.setStatus(302); HttpServletResponse.SC_MOVED_TEMPORARILY ==302
* */
resp.sendRedirect("/s3/img"); //重定向到了/img访问地址上去了
}
面试题:请你聊聊重定向和转发的区别
相同点
页面都会实现跳转
不同点
请求转发的时候,URL不会发生变化
重定向的时候,URL地址栏会发生编号
请求转发参考:6.5-3
ps://www.edjoke.com/archives/727.html
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
System.out.println("进入了ServletDemo04");
//原始写法
//RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/gp");//请求转发到/gp这个路径上
//requestDispatcher.forward(req,resp);//调用forward实现请求转发
//一句话的写法
servletContext.getRequestDispatcher("/gp").forward(req,resp);
}
5、JSP 实战表单提交 请求
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!-Response</h2>
<%--这里提交的路径,需要寻找到项目的路径--%>
<%--${pageContext.request.contextPath}代表当前项目的路径--%>
<form action="${pageContext.request.contextPath}/login" method="get">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit">
</form>
</body>
</html>
pom.xml 配置依赖 jsp 页面才能调用获取当前路径的Java语法 <%–${pageContext.request.contextPath}代表当前项目的路径–%>
jsp请求提交表单 成功后跳转到success页面
配置Java后台请求路径
success 页面
页面请求效果
6.7、 HttpServletRequest