Servlet响应
浏览器访问服务器后,服务器给客户端响应的数据会封装为ServletResponse对象,它有一个子类叫HttpServletResponse对象,用于封装按照Http协议封装的响应数据。
1.响应状态码
状态码 | 状态 |
---|---|
100 | 只有请求的一部分已经被服务器接收,但只要它没有被拒绝,客户端应继续该请求 |
200 | 请求成功 |
302 | 重定向,所请求的页面已经临时转移到一个新的 URL |
304 | 访问缓存,所请求的页面已经临时转移到一个新的 URL |
404 | 客户端错误,请求路径服务器没有对应的资源 |
405 | 客户端错误,请求方式找不到对应的方法 |
500 | 服务端错误,可能服务器内部有异常 |
- 使用字符流响应数据
@WebServlet("/servletResponseDemo1")
public class ServletResponseDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应编码
resp.setContentType("text/html;charset=utf-8");
//输出响应数据
resp.getWriter().println("<h1>你好,这是一个响应消息</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 使用字节流响应数据
@WebServlet("/servletResponseDemo2")
public class ServletResponseDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应编码
resp.setContentType("text/html;charset=utf-8");
//输出响应数据
ServletOutputStream outputStream = resp.getOutputStream();
outputStream.write("你好世界".getBytes("utf-8"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3.响应图片
在web/img目录下放一张a.jpeg图片,把图片中所有的字节响应给客户端。
@WebServlet("/servletResponseDemo3")
public class ServletResponseDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取输出流对象
ServletOutputStream out = resp.getOutputStream();
//获取文件的绝对路径
String imgPath = getServletContext().getRealPath("img/a.jpeg");
//获取输入流对象
FileInputStream fis = new FileInputStream(imgPath);
byte[] bs=new byte[1024];
int len;
while ((len=fis.read(bs))!=-1){
out.write(bs,0,len);
}
fis.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
5.设置定时刷新
定时刷新:过了指定时间后,页面自动进行跳转
@WebServlet("/servletResponseDemo5")
public class ServletResponseDemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setHeader("Refresh","3;url=/day03_Servlet/login.html");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().println("你好世界 三秒钟跳转到登录页面");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
6.重定向
重定向和请求转发不太一样,请求转发是只有一个请求,而重定向有两次请求。所以重定向不能通过请求域共享数据,只有在同一个请求链中才能通过请求域中心数据。
@WebServlet("/servletResponseDemo6")
public class ServletResponseDemo6 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//重定向到servletResponseDemo5
//resp.sendRedirect(req.getContextPath()+"/servletResponseDemo5");
//也可以使用下面两个方法,完成重定向;302表示重定向的状态码
resp.setStatus(302);
resp.setHeader("location",req.getContextPath()+"/servletResponseDemo5");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
7.文件下载
写一个html页面,点击图片开始下载
<a href="/day03_Servlet/servletResponseDemo7">点击下载图片</a>
写以Servlet处理下载的请求,给客户端响应一张图片
@WebServlet("/servletResponseDemo7")
public class ServletResponseDemo7 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//准备要下载的图片
File file=new File("img/a.jpeg");
//设置响应头,告诉浏览器以附件形式接受
resp.setHeader("content-disposition","attachment;filename="+file.getName());
//获取输出流对象
ServletOutputStream out = resp.getOutputStream();
//获取文件的绝对路径
String imgPath = getServletContext().getRealPath(file.getPath());
//获取输入流对象
FileInputStream fis = new FileInputStream(imgPath);
byte[] bs=new byte[1024];
int len;
while ((len=fis.read(bs))!=-1){
out.write(bs,0,len);
}
fis.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}