JavaWeb学习笔记之HttpServletResponse
HttpServletResponse
Responses:问句应答;响应;回应;应答;及时作出反应。对浏览器的请求作出响应(反应)
简单分类
负责向浏览器发送数据的方法
1 |
ServletOutputStream getOutputStream() throws IOException;//字节输出流(二进制数据 |
一般使用getOutputStream方法,有中文可以使用getWriter方法(避免乱码)。
负责向浏览器发送响应头的方法
1 |
void setCharacterEncoding(String var1);//设置编码类型 |
响应状态码,点这里复习一下。
1 |
int SC_CONTINUE = 100; |
常见应用
- 向浏览器输出信息(
response对象.getWriter().print(“要输出到浏览器的信息”)
) - 下载文件
- 验证码实现
- 重定向(重要)
下载文件
- 要获取下载文件的路径
- 下载的文件名是啥?
- 设置响应头,让浏览器知道这是要下载文件
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStream对象
- 将FileOutputStream流写入到buffer缓冲区
- 使用OutputStream将缓冲区中的数据输出到客户端
- 关闭流
代码演示
在resources文件夹内新建一个文件夹img,用于存放我们的图片资源。将一个名为xhr.gif的图片放在里边。

注意:若文件在classpath下,使用类加载器来查找资源,只需要知道文件名即可。但是如果文件不在classpath路径(/WEB-INF/classes/
)下,需要指定相对路径。可以理解为类加载器的根目录就是classpath,所以我们需要在第6行代码的方法getResource()
中填写img/xhr.gif
。
- 查找文件
this.getServletContext().getClassLoader().getResource("img/xhr.gif").getPath();
- 设置响应头
resp.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));
- 这是告诉浏览器,现在传输的是用户要下载的文件
URLEncoder.encode(fileName,"utf-8")
,这是对下载的文件的文件名进行编码,避免中文乱码
1 |
public class FileServlet extends HttpServlet { |
别忘了注册servlet,这里FileServlet的请求路径配置为/down
。
别忘了配置Tomcat,若是该web应用程序配置过了则不需要重复配置。
运行结果:
验证码实现
验证码怎么来的?
- 前端实现
- 后端实现,需要用到Java的图片类,生成一个图片
案例应用,见这里:传送门
代码演示:
方法getRandom,用于生成7位数的随机数。
1 |
//获取7位数的随机数 |
重写方法doGet、doPost。
1 |
|
绘制验证码核心代码:
1 |
//在内存中创建一个图片 |
需要注意方法drawString中的参数y。字符串的坐标中心点并不是左上角,看下图:
别忘了注册servlet,这里Servlet程序的请求路径配置为/img
。
别忘了配置Tomcat,若是该web应用程序配置过了则不需要重复配置。
运行结果:
扩展
客户端请求该Servlet程序时,带上一个参数timeout,代表验证码超时的时间,单位秒。
1 |
int timeout = 30;//默认值; |
getColor方法:
1 |
//生成随机颜色 |
若跨域,session无法保存验证码。解决方法:
- 使用UUID类,生成一个唯一的uuid码。
- 生成uuid码:
String uuid = UUID.randomUUID().toString();
- 生成uuid码:
- 将生成的验证码图片保存在服务器上,将验证码图片的路径和uuid码一块返回给客户端,并保存到ServletContext中。(可以用uuid给图片命名,这样只需要发送图片地址给客户端即可)
- 使用多线程定时或定时器类Timer(实现接口ActionListener中的actionPerformed()方法),在超时后将服务器上的验证码图片删掉
- 当客户端发送输入的验证码到服务器进行验证时,将验证码和uuid一块发过来
- 取出保存在ServletContext中的验证码和uuid,与客户端发过来的进行比对
- 具体实现案例,点这里。
前端接收图片:
- 第一种方式:后端以流的方式返回图片
- 使用Ajax异步请求,更新id为verificode_img的
img标签
的src。 - 使用
window.URL.createObjectURL(服务器响应的图片流)
将流转换为URL - jQuery不能接受流,为了解决跨域问题,只能使用原始的XHR。vue也可以实现接收流不过解决跨域有点麻烦。
1 |
function changecode(timeout){ |
- 第二种方式:后端返回图片URL
- 使用Ajax异步请求,更新id为verificode_img的
img标签
的src。 - 如果返回的URL相同,可能浏览器会使用本地的缓存图片,导致验证码图片不能及时更新。可以在src后边拼接一个随机参数。例如:?Math.random()
- 参考文件上传案例将图片保存在服务器上,定时删掉图片(timeout超时时间),将图片的URL返回给客户端
- 具体实现案例,点这里。
重定向(重点)
- 请求转发,浏览器地址栏路径不变
- 路由重定向,浏览器地址栏路径会变
- 常见场景:用户登陆
- 重定向的地址,可能是站内资源也可能不是站内资源
1 |
void sendRedirect(String var1) throws IOException; |
面试题:请你聊聊重定向和转发的区别?
相同点:
- 页面都会实现跳转
不同点:
- 请求转发,URL不会发生变化,状态码:307
- 重定向,URL会发生变化,状态码:302
代码演示
注意:重定向是可以跳转到其他web应用程序的,所以重定向路径要带上web应用程序在Tomcat服务器中注册的请求路径。(就是在Tomcat服务器中部署web应用程序时设置的Application context
)(访问在web.xml中注册了请求路径的servlet类时,不要带上web应用程序路径,因为会自动添加web应用程序路径进去)
请求转发:映射的地址包括当前web应用程序路径(内部资源跳转)
重定向:映射的地址不包括当前web应用程序路径
首页
改写web应用程序的首页,添加一个form表单。form表单的数据提交到路径当前web应用程序/login
进行处理。
验证表单
类RequestTest,在网站配置文件web.xml中注册servlet时使用请求路径/login
。用于处理form表单传过来的数据。使用HttpServletRequest对象的getParameter方法,获取过来的数据。重定向,使用的是HttpServletResponse对象的sendRedirect
方法。重定向是可以跳转到其他web应用程序的,所以重定向路径要带上web应用程序在Tomcat服务器中注册的请求路径。(就是在Tomcat服务器中部署web应用程序时设置的Application context
)
1 |
public class RequestTest extends HttpServlet { |
重定向
模拟表单数据验证成功后,跳转到一个新的页面。新建一个jsp页面success.jsp,显示登陆成功。
运行结果
别忘了注册servlet,这里RequestTest的请求路径配置为/login
。
别忘了配置Tomcat,若是该web应用程序配置过了则不需要重复配置。