JavaEE基础

您所在的位置:网站首页 response对象的功能 JavaEE基础

JavaEE基础

2024-07-05 01:52| 来源: 网络整理| 查看: 265

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