JavaEE基础 |
您所在的位置:网站首页 › response对象的功能 › JavaEE基础 |
JavaEE基础-----------Response对象
1.Response的功能
设置响应行 格式:HTTP/1.1 200 ok设置状态码:setStatus(int sc)设置响应头:setHeader(String name, String value) 设置响应体: 使用步骤:获取输出流 字符输出流:PrintWriter getWriter() 字节输出流:ServletOutputStream getOutputStream() 使用输出流,将数据输出到客户端浏览器 2.重定向的使用 之前在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); } } 点进源码可以看出,底层已经帮我们做好了传统的步骤。 3.ServletContext对象1.获取方法 通过request对象获取 request.getServletContext();通过HttpServlet获取 this.getServletContext();2.获取文件的真实路径 String realPath = request.getServletContext().getRealPath("/img/1.jpg"); 4.响应字符流形式的数据 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的编写了 5.响应字节流形式的数据这里的字节流我们可以用来响应图片,这是用的最多的,下面就这个实现说明几个方法: 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对象使用上面介绍了,就不多说了。这种方式也是开发中用的最多的,代码简洁,可读性很强 。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |