响应:回馈结果。在BS架构中,就是服务器给客户端浏览器反馈结果
响应对象:就是在项目中用于发送响应的对象
状态码 | 说明 |
---|---|
200 | 成功 |
302 | 重定向 |
304 | 请求资源未改变 |
400 | 请求错误,常见于请求参数错误 |
404 | 请求资源未找到 |
405 | 请求方式不支持 |
500 | 服务器错误 |
405:请求方式不支持,例如:一般是后台只支持post请求,而发起的请求确实get请求,这时候就会提示405
状态码首位含义
状态码 | 说明 |
---|---|
1xx | 消息 |
2xx | 成功 |
3xx | 重定向 |
4xx | 客户端错误 |
5xx | 服务器错误 |
返回值 | 方法名 | 说明 |
---|---|---|
ServletOutputStream | getOutputStream() | 获取响应字节输出流对象 |
void | setContentType(“text/html;charset=UTF-8”) | 设置响应内容类型,解决中文乱码问题 |
字节流,常用于处理图片,文件
- package servlet;
-
- import javax.servlet.ServletException;
- import javax.servlet.ServletOutputStream;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
-
- /*
- 字节流响应消息
- */
- @WebServlet("/servletDemo01")
- public class ServletDemo01 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- /*
- 项目中常用的编码格式是utf-8,而浏览器默认使用的编码是gbk。导致乱码!
- */
- //1. 获取字节流输出对象
- ServletOutputStream sos = resp.getOutputStream();
- //2. 定义一个消息
- String str = "你好";
- //通过字节流对象输出
- sos.write(str.getBytes());//getBytes不带参数,默认获取操作系统的编码集(我们安装的都是中文windows,所以系统编码集是gbk)
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doGet(req,resp);
- }
- }
要想出现乱码,修改代码:
sos.write(str.getBytes("UTF-8"));
解决乱码的一种常用方法
response.setContentType("text/html;charset=UTF-8");
返回值 | 方法名 | 说明 |
---|---|---|
PrintWriter | getWriter() | 获取响应字符输出流对象 |
void | setContentType(“text/html;charset=UTF-8”) | 设置响应内容类型,解决中文乱码问题 |
- package servlet;
-
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- import java.io.PrintWriter;
-
- /*
- 字符流响应消息
- */
- @WebServlet("/servletDemo02")
- public class ServletDemo02 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //1. 准备一个消息
- String str = "你好";
- //2. 获取字符流对象
- PrintWriter pw = resp.getWriter();
- //3. 通过字符流输出
- pw.write(str);
- //pw.close();
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doGet(req,resp);
- }
- }
解决乱码问题
- //解决中文乱码
- resp.setContentType("text/html;charset=UTF-8");
如果是响应解决乱码问题,一般思路就是让浏览器与代码中的编码风格保持一致(utf-8)
resp.setContentType("text/html;charset=UTF-8");
如果请求中解决乱码,将gbk编码的中文信息转换为utf-8
- //设置编码格式 (将浏览器默认编码gbk的中文信息,转换为utf-8的信息)
- req.setCharacterEncoding("UTF-8");
1.创建字节输入流对象,关联读取的图片路径
2.通过响应对象获取字节输出流对象
3.循环读取和写出图片
4.将xxx.png图片,复制到web/img目录下
- package servlet;
-
- import javax.servlet.ServletException;
- import javax.servlet.ServletOutputStream;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.BufferedInputStream;
- import java.io.FileInputStream;
- import java.io.IOException;
-
- /*
- 响应图片
- */
- @WebServlet("/servletDemo03")
- public class ServletDemo03 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //1. 创建字节输入流对象,关联图片路径
- String realPath = getServletContext().getRealPath("/img/zjl.png");
- System.out.println(realPath);
- BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath));
- //注意:不能直接指定图片路径,需要同getRealPath获取,因为项目还要发布,我们需要获取到发布之后的图片路径
- //BufferedInputStream bis = new BufferedInputStream(new FileInputStream(/img/a.png));
- //2. 获取字节输出流对象
- ServletOutputStream sos = resp.getOutputStream();
- //3. 循环读写
- byte[] arr = new byte[1024];
- int len;
- while((len = bis.read(arr)) != -1) {
- sos.write(arr,0,len);
- }
- bis.close();
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doGet(req,resp);
- }
- }
-
缓存:对于不经常变化的数据,我们可以设置合理缓存时间,以避免浏览器频繁请求服务器。以此来提高效率
返回值 | 方法名 | 说明 |
---|---|---|
void | setDateHeader(String name,long time) | 设置消息头添加缓存 |
- package servlet;
-
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
-
- /*
- 设置缓存
- */
- @WebServlet("/servletDemo04")
- public class ServletDemo04 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String news = "这是一条很火爆的新闻~";
- //设置缓存时间:1小时的缓存时间
- //参数1:Expires:失效的意思
- //参数2:当前时间+1小时毫秒值(意思就是在1小时之后过期)
- resp.setDateHeader("Expires",(System.currentTimeMillis()+1*60*60*1000L));
- //设置编码格式
- resp.setContentType("text/html;charset=UTF-8");
- //写出数据
- resp.getWriter().write(news);
- System.out.println("aaa");
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doGet(req,resp);
- }
- }
第一次访问:发现执行了Servlet,并且打印了aaa此时,这个Servlet已经被缓存下来了,第二次访问执行了Servlet,并且控制台没有打印aaa
定时刷新:过了指定时间后,页面自动进行跳转
返回值 | 方法名 | 说明 |
---|---|---|
void | setHeader(String name,String value) | 设置消息头定时刷新 |
- package servlet;
-
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
-
- /*
- 定时刷新
- */
- @WebServlet("/servletDemo05")
- public class ServletDemo05 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String str = "您的用户名或密码错误,3秒后自动跳转到登录页面...";
- //设置编码格式
- resp.setContentType("text/html;charset=UTF-8");
- //写出数据
- resp.getWriter().write(str);
- //设置响应消息头定时刷新
- //Refresh:刷新
- //第二个参数第一部分:3,3设之后
- //第二个参数第二部分:跳转到哪个路径
- resp.setHeader("Refresh","3;URL=/response/login.html");
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doGet(req,resp);
- }
- }
-
在web目录下新建login.html
访问:3s之后自动跳转到login.html
请求重定向:客户端的一次请求到达后,发现需要借助其他的Servlet来实现功能。
特点:浏览器地址栏会发生改变,再次请求、请求域对象中不能共享数据,可以重定向到其它服务器。
重定向实现原理
- //设置响应状态码为302
- resp.setStatus(302);
- //设置响应的资源路径(响应到哪里去,通过响应消息头location来指定)
- resp.setHeader("location","/responseDemo07");
返回值 | 方法名 | 说明 |
---|---|---|
void | sendRedirect(String name) | 设置重定向 |
- package servlet;
-
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
-
- /*
- 请求重定向
- */
- @WebServlet("/servletDemo06")
- public class ServletDemo06 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- System.out.println("servletDemo06执行了...");
- //设置请求域共享数据
- req.setAttribute("username","zhangsan");
- //设置重定向
- resp.sendRedirect(req.getContextPath() + "/servletDemo07");
- //resp.sendRedirect("https://www.baidu.com");
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doGet(req,resp);
- }
- }
获取共享数据
- package servlet;
-
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
-
- /*
- 请求重定向
- */
- @WebServlet("/servletDemo07")
- public class ServletDemo07 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- System.out.println("servletDemo07执行了...");
- Object username = req.getAttribute("username");
- System.out.println(username);
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doGet(req,resp);
- }
- }
重定向与转发的区别
重定向:
两次请求
地址栏发生变化
不可以使用request域共享数据 (既然是两次请求,那肯定不能使用请求域中共享的数据)
可以重定向到其他服务器的url
转发:
一次请求
地址栏不发生变化
可以使用request域共享数据
只能转发到自己服务器内部的url
1.创建字节输入流,关联读取的文件
2.设置响应消息头支持的类型
3.设置响应消息头以下载方式打开资源
4.通过响应对象获取字节输入流对象
5.循环读写
6.释放资源
- package servlet;
- import javax.servlet.ServletException;
- import javax.servlet.ServletOutputStream;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.BufferedInputStream;
- import java.io.FileInputStream;
- import java.io.IOException;
- /*
- 文件下载
- */
- @WebServlet("/servletDemo08")
- public class ServletDemo08 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //1.创建字节输入流,关联读取的文件
- //获取文件的绝对路径
- String realPath = getServletContext().getRealPath("/img/zjl.png");
- //创建字节输出流对象
- BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath));
-
- //2.设置响应头支持的类型 应用支持的类型为字节流
- /*
- Content-Type 消息头名称 支持的类型
- application/octet-stream 消息头参数 应用类型为字节流
- */
- resp.setHeader("Content-Type","application/octet-stream");
-
- //3.设置响应头以下载方式打开 以附件形式处理内容
- /*
- Content-Disposition 消息头名称 处理的形式
- attachment;filename= 消息头参数 附件形式进行处理;指定下载文件名称
- */
- resp.setHeader("Content-Disposition","attachment;filename=ljb.png");
-
- //4.获取字节输出流对象
- ServletOutputStream os = resp.getOutputStream();
-
- //5.循环读写文件
- byte[] arr = new byte[1024];
- int len;
- while((len = bis.read(arr)) != -1) {
- os.write(arr,0,len);
- }
-
- //6.释放资源
- bis.close();
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doGet(req,resp);
- }
- }