设置响应行
- 格式:HTTP/1.1 200 ok
- 设置状态码:setStatus(int sc)
设置响应头:setHeader(String name, String value)
设置响应体:
- 使用步骤:
获取输出流
字符输出流:PrintWriter getWriter()
字节输出流:ServletOutputStream getOutputStream()
使用输出流,将数据输出到客户端浏览器
之前在request中学过转发,那么为什么又要使用重定向,看起来差不多,都是实现跳转,但是二者有很多区别,这也是常见的面试题,它们的区别如下:
1.重定向地址栏会发生改变,转发地址栏不会发生改变
2.重定向是两次请求,因此共用两个request对象,不能共享数据,转发是一次请求,可以共享 数据
3.重定向可以访问任意站点的资源,转发是服务器内部行为,跳转仅限于当前站点
尤其是上面的第二点,转发是一次请求,是可以共享数据的,但是重定向是发出第二次请求的,这个是很容易让人混淆的。
下面介绍一下重定向的两种实现方式:
1.传统方式实现:
@WebServlet("/as")
public class AServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//传统方式重定向
response.setStatus(302);//设置状态码
response.setHeader("location","https://www.baidu.com");//设置响应头
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
分析:上面的状态码302和location是不变的,变得是url,因此就有下面的更简便的方法
2.最常用的方法实现:
@WebServlet("/bs")
public class BServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//简写方式重定向
response.sendRedirect("https://www.baidu.com");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
点进源码可以看出,底层已经帮我们做好了传统的步骤。
1.获取方法
- 通过request对象获取
request.getServletContext();- 通过HttpServlet获取
this.getServletContext();
2.获取文件的真实路径
String realPath = request.getServletContext().getRealPath("/img/1.jpg");
1.这里需要注意的是,开始我们要设置编码格式,处理中文乱码
response.setContentType(“text/html;charset=utf-8”);
写这个之前先把这一行加上,开发过程的一个习惯,这样就不会出现乱码
2.响应字符流数据
@WebServlet("/cs")
public class CServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//响应字符流
response.setContentType("text/html;charset=utf-8");//防止乱码
response.getWriter().write("字符流");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
这里附加一个知识点,这个不仅仅能输出字符串,还能写html,真正在后端代码中实现了HTML的编写,不过这种方式用的比较少,只在特殊情况下实用:
@WebServlet("/cs")
public class CServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//响应字符流
response.setContentType("text/html;charset=utf-8");//防止乱码
response.getWriter().write("字符流");
response.getWriter().write(""
);
response.getWriter().write("字符流");
response.getWriter().write("");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
我们只要将HTML标签包裹起来就可以实现HTML的编写了
这里的字节流我们可以用来响应图片,这是用的最多的,下面就这个实现说明几个方法:
1.以绝对路劲来读取
@WebServlet("/ds")
public class DServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取图片位置并读取图片
FileInputStream fis = new FileInputStream("F:\\idea_workspace\\yz\\day08_response\\web\\img\\1.jpg");
//获取输出流
ServletOutputStream os = response.getOutputStream();
//对接流
int len = 0;
while ((len=fis.read())!= -1){
os.write(len);
}
//关闭资源
fis.close();
os.close();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
这个使用就是java基础里面io流的常规使用
2.工具类结合ServletContext对象实现
@WebServlet("/fs")
public class FServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取图片的真是路径
String realPath = request.getServletContext().getRealPath("/img/1.jpg");
System.out.println(realPath);
// 获取字节输入流读取图片
FileInputStream fis = new FileInputStream(realPath);
//获取字节输出流
ServletOutputStream os = response.getOutputStream();
//对接流,将图片输出
IOUtils.copy(fis,os);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
IOUtils
使用需要commons-io-2.6.jar,这个jar包,是maven工程直接导入改坐标即可,不是,导入jar包即可,关于ServletContext对象使用上面介绍了,就不多说了。这种方式也是开发中用的最多的,代码简洁,可读性很强 。