javaEE(四) ServletResponse
javaEE(四) ServletResponse
该对象主要的功能是用来协助servlet给客户端返回响应的
常见的功能
1.设置响应报文的各个部分
@WebServlet("/resp1")
public class RespServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//可以设置响应报文 服务器创建一个对象,对象里面包含很多属性
//开发者需要做的事情及时往对象里面的属性进行赋值;最终服务器读取里面的数据生成HTTP响应报文
response.setStatus(404);
response.setHeader("Server", "OS");
//响应体
response.getWriter().println("<div style='color:red'>File Not Found</div>");
}
}
2.输出字符数据
response.getWriter().println("xxxxxx")
3.中文乱码
方式一:设置Content-Type响应头
@WebServlet("/resp2")
public class RespServlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置完之后依然乱码,主要的原因在于编解码不一致 推测浏览器使用的是GBK
//可以采取这种方式去解决吗?不可以。说明浏览器默认使用的是GBK
//因为有的浏览器默认情况下不会默认选择GBK来进行解码,此时如果你这么设置,肯定会出问题
//我们希望可以彻底的解决该问题 服务器设置一个编码格式 + 将使用的编码格式告诉给客户端
response.setCharacterEncoding("GBK");
response.getWriter().println("你好");
}
}
@WebServlet("/resp3")
public class RespServlet3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// response.setCharacterEncoding("utf-8");
//把使用的编码格式告诉给客户端,可以通过哪个部分?响应头、响应体
//其中下面这行代码有两个功能,如果设置了该响应头,那么服务器会自动读取里面的charset的值,作用于响应体
//所以,上面的那行代码可以不用写
response.setHeader("Content-Type","text/html;charset=utf-8");
response.getWriter().println("你好");
}
}
方式二:通过响应体告诉客户端编码格式
@WebServlet("/resp4")
public class RespServlet4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
//通过响应体告诉客户端使用的编码格式
response.getWriter().println("<!DOCTYPE html>\n" +
"<html lang=\"en\">\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <title>Title</title>\n" +
"</head>\n" +
"<body>");
response.getWriter().println("你好");
response.getWriter().println("</body>\n" +
"</html>");
}
}
4.输出字节数据
@WebServlet("/stream")
public class StreamServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//字节流
//todo note:字符流和字节流不可以同时调用,只可以调用一个
// response.getWriter().println();
//今后如果遇到一个新的类,不知道该如何去使用,那么可以查看一下类继承关系
ServletOutputStream outputStream = response.getOutputStream();
//新建一个文件输入流
String realPath = getServletContext().getRealPath("WEB-INF/1.jpeg");
FileInputStream fileInputStream = new FileInputStream(new File(realPath));
int length = 0;
byte[] bytes = new byte[1024];
while ((length = fileInputStream.read(bytes)) != -1){
outputStream.write(bytes, 0, length);
}
//关闭流
fileInputStream.close();
//关于ServletOutputStream可以关闭也可以不关闭,如果不关闭,tomcat会帮我们关闭
outputStream.close();
}
}
5.页面的跳转方式(定时刷新,重定向)
定时刷新
希望页面时时刻刻显示最新的时间,不需要用户主动的去刷新
主要利用一个叫做refresh响应头
@WebServlet("/refresh")
public class RefreshServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//定时刷新、跳转
//1.定时刷新,只会刷新当前页面 每隔多少秒刷新一次当前的时间
response.getWriter().println(new Date());
// response.setHeader("refresh", "1");
//2.用法二:定时跳转 表示经过指定秒数之后,跳转至指定的页面
response.setHeader("refresh", "2;url=" + request.getContextPath() + "/1.jpeg");
}
}
重定向
服务器返回301、302、307状态码,同时搭配着Location响应头,浏览器会再次往location的地址去发起新的请求
@WebServlet("/redirect")
public class SendRedirectServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//根据重定向的定义,302、Location
// response.setStatus(302);
// response.setHeader("Location", request.getContextPath() + "/1.jpeg");
//上述是我们根据重定向的定义自己去实现的,其实ee规范给我们提供了一个简化的方式
response.sendRedirect(request.getContextPath() + "/1.jpeg");
}
}
6.下载
对于浏览器来说,有如下行为:对于可以打开的文件,默认会执行打开操作;对于无法打开的文件,默认就会执行下载操作。
我们这里提及的下载指的是对于可以打开的文件,可以设置一个响应头,让浏览器将该资源进行下载,而不是打开。
@WebServlet("/down")
public class DownServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//字节流
//只需要在原先的代码基础上追加一个下载的响应头
response.setHeader("Content-Disposition", "attachment;filename=1.jpeg");
//todo note:字符流和字节流不可以同时调用,只可以调用一个
// response.getWriter().println();
//今后如果遇到一个新的类,不知道该如何去使用,那么可以查看一下类继承关系
ServletOutputStream outputStream = response.getOutputStream();
//新建一个文件输入流
String realPath = getServletContext().getRealPath("WEB-INF/1.jpeg");
FileInputStream fileInputStream = new FileInputStream(new File(realPath));
int length = 0;
byte[] bytes = new byte[1024];
while ((length = fileInputStream.read(bytes)) != -1){
outputStream.write(bytes, 0, length);
}
//关闭流
fileInputStream.close();
//关于ServletOutputStream可以关闭也可以不关闭,如果不关闭,tomcat会帮我们关闭
outputStream.close();
}
}
下载的应用场景:
管理系统中有一个页面可以显示图表数据,导出到excel按钮。
本文来自博客园,作者:向着年薪百万前进,转载请注明原文链接:https://www.cnblogs.com/likangnianxinbaiwan/p/16335714.html

浙公网安备 33010602011771号