Servlet-----HttpServletResponse类(响应字符数据、响应字节数据以及重定向)的介绍、代码实现

1.HttpServletResponse类的简介

HttpServletResponse类是实现响应的一个类,他将将要响应的数据封装到response对象里面,通过特定的方法响应。响应数据的响应行,响应头,响应体分别由setStatus()、setHeader ()、getWriter() 和getOutputStream()几个方法实现。下面着重介绍 getWriter()(响应字符数据) 和getOutputStream()(响应字节数据)方法。前面我们说到Servlet请求的转发,他是在服务器里面跳转资源的方式。这里介绍的重定向也有类似的功能,但是实现的原理有所不同。

2.响应字符数据

通过response对象,将你想要响应到客户端的字符型数据发送到浏览器里面。只用两步就可以实现:
1、先通过response对象获取字符输出流:PrintWriter writer = resp.getWriter();
2、将你想要写的数据通过write()方法响应到客户端:writer.write()。

public class HttpServletResponse001 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.write("hello servlet!!!");
    }
}

实现效果
需要注意的几点:
1.response不仅可以返回纯文本,还可以HTML的各个标签。在返回标签时要注意先把响应响应头的ContentType属性改成text/html格式,不然浏览器会默认把相应的内容当成纯文本解析。

public class HttpServletResponse001 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        PrintWriter writer = resp.getWriter();
        writer.write("hello servlet!!!");
        writer.write("<br/>name:<input type = 'text'/>");
    }
}

在这里插入图片描述
2.如果响应的是中文的内容,需要把响应头字体类型改成UTF-8。因为服务器默认的字体类型是ISO-8859-1,如果不修改会导致浏览器解析乱码。
在这里插入图片描述
在这里插入图片描述

public class HttpServletResponse001 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        resp.setContentType("text/html");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.write("我的servlet程序!!!");
        writer.write("<br/>姓名:<input type = 'text'/>");
    }
}

3.修改响应头等信息需要在通过response对象获取字符输出流就完成,在后面才修改没有效果。
在这里插入图片描述
在这里插入图片描述

public class HttpServletResponse001 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        resp.setContentType("text/html");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
//        resp.setContentType("text/html;charset=utf-8");
        writer.write("aaaaa这是在获取输入流对象之前就修改响应头的。");
        writer.write("<br/>姓名:<input type = 'text'/>");
    }
}

4.响应结束后,相应的字符流不需要关闭。他不需要向像Java基础里面字节输入流那种最后需要手动关闭流节省资源。因为在响应结束后,response对象自动销毁,服务器会对其关闭。

3.响应字节数据

通过response对象,将你想要响应到客户端的字符型数据发送到浏览器里面。大致需要3步完成:
1、读取文件(图片,音频,视频等二进制输入输出数据)
2、获取字节输出流
3、通过write()方法响应给客户端

public class HttpServletResponse002 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.读物文件
        FileInputStream inputStream = new FileInputStream("C:\\Users\\cx\\Desktop\\1.png");
        //2.获取字节输出流
        ServletOutputStream outputStream = resp.getOutputStream();
        //3.打印文件
        byte []b = new byte[2048];
        int len = 0;
        while ((len = inputStream.read(b))!=0){
            outputStream.write(b,0,len);
        }
        inputStream.close();
    }
}

在这里插入图片描述

4.重定向

1.重定向与请求的转发的区别

  • 重定向特点;
    (1)浏览器地址栏会发生改变,会变成servlet程序1中指定的地址
    (2)是两次请求
    (3)多个servlet程序不共享request对象内的数据
    (4)不可以访问WEB-INF下的资源
    (5)可以访问工程以外的其他连接(例如百度、谷歌等网页资源)
  • 请求转发的特点(参考我另一篇博客)
    (1)浏览器地址栏没有发生变化。
    (2)多个servlet程序是同一个请求
    (3)多个servlet程序共享一个request对象
    (4)可以转发到WEB-INF目录下

2.重定向与请求转发的图示区别
求情的转发:
在这里插入图片描述
重定向:
在这里插入图片描述

3.重定向程序的实现
第一种:

@WebServlet("/httpServletResponse003")
public class HttpServletResponse003 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.write("servlet001!!!");

        //设置响应状态码(302)
        resp.setStatus(302);
        //设置响应头,告诉新地址在哪
        resp.setHeader("location","http://localhost:8888/servlet_war_exploded/httpServletResponse004");
    }
}

第二种:

@WebServlet("/httpServletResponse005")
public class HttpServletResponse005 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("http://localhost:8888/servlet_war_exploded/httpServletResponse004");
    }
}

在这里插入图片描述
两种方法只要访问了第一个servlet程序再回车,浏览器会自动跳到localhost:8888/servlet_war_exploded/httpServletResponse004而且浏览器地址栏会发生变化。与请求不同,虽然是两个页面,但是是同一个地址(即浏览器地址栏不会发生变化),这与上述所说的第一个特点相对应。

在这里插入图片描述

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是使用Java Servlet实现Server-Sent Event实时数据交互的前后端代码示例: 前端代码(HTML/JavaScript): ```html <!DOCTYPE html> <html> <head> <title>Server-Sent Event</title> </head> <body> <h1>Server-Sent Event</h1> <div id="sse"></div> <script> var sse = new EventSource("data"); // 创建EventSource对象,指定服务器地址为"data" sse.onmessage = function(event) { // 接收服务器推送的消息,并将消息显示在页面上 document.getElementById("sse").innerHTML += event.data + "<br>"; }; </script> </body> </html> ``` 后端代码Java Servlet): ```java import java.io.IOException; import java.time.LocalTime; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DataServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/event-stream"); // 设置响应内容型为"text/event-stream" response.setCharacterEncoding("UTF-8"); response.setHeader("Cache-Control", "no-cache"); // 禁用缓存 while (true) { String data = "Current time: " + LocalTime.now(); // 获取当前时间并构造消息 response.getWriter().write("data: " + data + "\n\n"); // 将消息写入响应 response.flushBuffer(); // 刷新缓冲区,立即发送响应 try { Thread.sleep(1000); // 等待1秒钟 } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` 在上述代码中,当浏览器向服务器发送请求时,服务器返回的响应内容型为"text/event-stream",表示服务器将推送事件流给浏览器。在服务器端,通过response.getWriter()方法获取响应输出流,并将消息写入响应体,使用"\n\n"表示消息结束。在浏览器端,通过EventSource对象接收服务器推送的消息,并将消息显示在页面上。 以上代码仅作为示例,实际应用中需要根据具体业务需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我没得冰阔落.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值