【JavaEE】_HttpServletResponse类

news2024/11/13 16:14:37

目录

1. 核心方法 

2. 关于setStatus(400)与sendError

2.1 setStatus(400)

2.2 sendError

3. setHeader方法

4. 构造重定向响应

4.1  使用setHeader和setStatus实现重定向

4.2  使用sendRedirect实现重定向


本专栏已有文章介绍HttpServlet和HttpServletRequest类,文章链接如下:

1. 关于HttpServlet类:

【JavaEE】_HttpServlet类-CSDN博客

2. 关于HttpServletRequest类:

【JavaEE】_HttpServletRequest类-CSDN博客

本文介绍第三个类:

HttpServletResponse类;


HttpServletResponse类表示一个响应;

1. 核心方法 

方法描述
void setStatus(int sc)为该响应设置状态码
void setHeader(String name, String value)设置一个带有给定的名称和值的header,如果name已经存在,则覆盖旧值
void addHeader(String name, String value)添加一个带有给定的名称和值的header,如果name已经存在,不覆盖旧值,并列添加新的键值对
void setContentType(String type)设置被发送到客户端的响应的内容类型
void setCharacterEncoding(String charset)设置被发送到客户端的响应的字符编码(MIME字符集),例如UTF-8
void sendRedirect(String Location)使用指定的重定向URL发送临时重定向响应到客户端
PrintWriter getWriter()用于往body中写入文本格式数据
OutputStream getOutputStream()用于往body中写入二进制格式数据

注:1. 可以通过setCharacterEncoding指定响应的编码格式:

浏览器默认不知道程序员的页面编码方式,会采取猜测的方式使用字符集进行解析,比如在getParameterServlet.java中将写回浏览器的响应格式写为:

resp.setContentType("text/html");
resp.getWriter().write("学生id: "+studentId +" 班级id: "+classId);

 此时根据路径打开浏览器页面,就会出现乱码: 

为了避免这种情况,我们需要在写回响应前,显式指定响应的编码格式字符集:

        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().write("学生id: "+studentId +" 班级id: "+classId);

刷新浏览器页面,有: 

2. 对于后两个方法,用于构造响应,注意响应的body也是通过流对象来体现的,

对于响应而言,是写入,需要使用输出流

而对于请求为读出,使用的是输入流

3.对于响应HttpServletResponse,其API都是set系列方法;

对于请求HttpServletRequest,其API都是get系列方法;

2. 关于setStatus(400)与sendError

2.1 setStatus(400)

.java文件内容如下:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/Status")
public class StatusServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 不显式书写200,默认响应状态码就是200
        resp.setStatus(404);
    }
}

使用Postman构造一个GET请求并发送:

可见响应部分为:

这种写法并不利于在浏览器页面查看到响应的直接状态码设置,可以使用servlet提供的sendError方法,返回默认的错误页面;

2.2 sendError

.java文件内容如下:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/Status")
public class StatusServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendError(404,"错误页面");
    }
}

使用Postman发送一个GET请求:

响应如下:

3. setHeader方法

setHeader方法可以向响应中设置一些特殊的header;

以refresh header为例,令浏览器页面每秒刷新一次页面并显示时间戳:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/Refresh")
public class RefreshServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setHeader("refresh","1");
        resp.getWriter().write(""+System.currentTimeMillis());
    }
}

Postman处可以查看到设置的refresh的header:

但postman并不会对其进行处理,可以使用浏览器打开目标webapp:

就可以看到页面每秒更新一个时间戳;

注:并不是精确的1000ms刷新一次,会略多一点(发送请求与返回响应也需要时间);

4. 构造重定向响应

4.1  使用setHeader和setStatus实现重定向

重定向响应的特点:

(1)状态码为3××系列;

(2)header需要有一个Location属性,描述要跳转到哪里;

.java文件内容如下:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/Redirect")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setStatus(302);
        resp.setHeader("Location", "https://sogou.com");
    }
}

输入127.0.0.1:8080/Servlet/Redirect后回车,随即页面跳转至搜狗主页:

使用Fiddler抓包,HTTP请求如下:

HTTP响应如下:

4.2  使用sendRedirect实现重定向

.java文件内容如下:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/Redirect")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("https://sogou.com");
    }
}

重新启动服务器验证即可,同上,此处不再展示结果;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1481640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Python语言实现一个基于动态数组的序列队列

一、动态数组的实现 首先,我们需要创建一个DynamicArray类,该类将管理我们的动态数组。 动态数组能够动态地调整其大小,以容纳更多的元素。 目录 一、动态数组的实现 代码示例: 二、序列队列的实现 接下来,我…

【rust】10 project、crate、mod、pub、use、项目目录层级组织、概念和实战

文章目录 一、项目目录层级组织概念1.1 cargo new 创建同名 的 Project 和 crate1.2 多 crate 的 package1.3 mod 模块1.3.1 创建嵌套 mod1.3.2 mod 树1.3.3 用路径引用 mod1.3.3.1 使用绝对还是相对? 1.3.4 代码可见性1.3.4.1 pub 关键字1.3.4.2 用 super 引用 mod1.3.4.3 用…

Mathtype安装时word启动显示“文件未找到:MathPage.WLL”

背景 由于老板布置的临时工作,需要安装Mathtype,但尝试了3个不同的版本后(每次都卸载干净了),均未能成功安装,出现的报错3个版本各不相同: ①解压安装过程中失败(这个版本不再尝试…

数据可视化原理-腾讯-热力图

在做数据分析类的产品功能设计时,经常用到可视化方式,挖掘数据价值,表达数据的内在规律与特征展示给客户。 可是作为一个产品经理,(1)如果不能够掌握各类可视化图形的含义,就不知道哪类数据该用…

MySQL、高级SQL操作

学习数据库的目的 岗位需求、大数据时代、被迫需求,存数据 数据库是所有软件体系中最核心的存在 数据库 DB DB dataBase 数据仓库,软件,安装在window、linux、mac上,可以存储大量数据,500w 作用:存储数据…

docker的数据卷和docker的自定义镜像

docker的数据卷和docker的自定义镜像 1.docker的数据卷1.1创建 docker volume create 数据卷名称1.2 查看数据卷docker volume ls1.3 删除一个volume 2.将宿主机的目录与容器的目录进行挂载,实现数据共享2.1数据卷相互共享 3.自定义镜像3.1编辑Dockerfiile文件 vim …

位运算第二弹

力扣191.位1的个数 public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int ret0;while(n!0){n(n&n-1);ret;}return ret;} } 推荐是自己去手动推一下,深刻理解一下,什么叫做最右侧的1。 力扣338.…

3694-51-7,3,5-Dinitro-1,2-phenylenediamine,合成其他化合物的重要中间体

您好,欢迎来到新研之家 文章关键词:3694-51-7,3,5-Dinitro-1,2-phenylenediamine,3,5-二硝基-1,2-苯二胺;3,5-二硝基苯-1,2-二胺 一、基本信息 【产品简介】:3,5-Dinitro-1,2-phenylenediamine, with the molecular…

MySql出现无法正常启动(0x000007b)的快速解决

目录 1.背景介绍 2.解决方案 1.背景介绍 昨天在清理电脑内存空间的时候,不小心将一些重要的系统组件删除,导致无法正常启动mysql,一开始是提示经过msvcp120.dll,于是找到下载dll的网站将组件补充进system,但随后又提…

【办公类-25-01】20240304 UIBOT上传 ”班级主页-信息窗“

一、背景需求: 本学期制作了 “信息窗主题说明”合并A4内容 【办公类-22-07】周计划系列(3-1)“信息窗主题知识(提取)” (2024年调整版本)-CSDN博客文章浏览阅读797次,点赞7次&…

渗压计使用中的常见问题及其解决方案

渗压计作为一种用于测量土壤或岩石中孔隙水压力的重要工具,在地质工程和水文学领域具有广泛的应用。然而,在实际使用过程中,渗压计可能会遇到多种常见问题,这些问题不仅影响测量精度,还可能对设备本身造成损害。本文将…

【力扣】207.课程表(图)

依旧还是有关于图的题目,这次不一样的点在于题目并没有明确的给出他是图的题目的形式,而是说让你根据其题目意思来进行操作。 首先,就是搞清楚题目的意思。假设你想学习A课程,那就是必须先学习B课程,但是这里给出的例…

消息队列+更新DB极易引发的DB并发修改bug

背景 我们在生产系统中和其他系统进行交互时一般都会通过消息队列来解耦生产者和消费者,然后通过每个使用方消费消息队列的消息的方式来完成消息的消费,并且一般来说我们消费消息后极有可能会操作DB,不过这种方式如果处理不够仔细&#xff0…

Linux——进程控制(一)进程的创建与退出

目录 一、进程创建 1.写时拷贝 2.创建多个进程 二、进程终止 1.main函数的返回值 2.bash中的$? 3.自定义退出码 4.C语言的错误码 5.错误码与退出码的区别 6.代码异常终止 7.exit函数 8.总结 一、进程创建 在之前,我们学过linux中的非常重要的函数——…

全网爆火的 MBTI 测试,是隐藏的割韭菜工具?

小伙伴们,谁能想到,作为一名冲浪老手,果子在网上又被骗了。 事情是这样的,前几天,我刷微博,看到一个推荐,大概如下图,是一个 MBTI 人格测试。 MBTI 测试,果子早就做过了…

【前端素材】推荐优质在线电影院商城电商网页Hyper平台模板(附源码)

一、需求分析 1、系统定义 在线电影商城是指一个通过互联网提供电影服务的平台,用户可以在该平台上浏览电影资源、租借或购买电影,以及观看在线影片。 2、功能需求 在线电影商城是指一个通过互联网提供电影服务的平台,用户可以在该平台上…

Windows Docker 部署 Redis

部署 Redis 打开 Docker Desktop,切换到 Linux 内核。然后在 PowerShell 执行下面命令,即可启动一个 redis 服务。这里安装的是 7.2.4 版本,如果需要安装其他或者最新版本,可以到 Docker Hub 中进行查找。 docker run -d --nam…

2.25_模式识别大作业的三种方法

filename sys.argv[1] df pd.read_csv(filename,index_col["ID"]) ax df.plot() ax.set_xlabel("Data_ID") ax.set_ylabel("load_value") plt.show() 这段代码是用来读取一个CSV文件,并将文件中的数据绘制成一个简单的折线图。 在…

lv20 QT 常用控件 2

1 QT GUI 类继承简介 布局管理器 输出控件 输入控件 按钮 容器 2 按钮示例 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QCheckBox> #include <QLineEdit> #include <QPushButton>class Widget : public QWidget {Q_OBJECTpublic…

【C语言】常见的动态内存管理错误

前言 上一篇介绍了C语言中 动态内存管理函数&#xff0c;本片讲解的是 在我们使用动态内存管理时 常见的错误&#xff0c;一起来看看吧~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 1.对NULL指针的解引⽤操作 错…