Servlet---HttpServlet、HttpServletRequest、HttpServletResponseAPI详解

文章目录

  • HttpServlet
    • 基础方法
    • doXXX方法
    • Servlet的生命周期
  • HttpServletRequest
    • 获取请求中的信息
    • 获取请求传递的参数
      • 获取 query string 里的数据
      • 获取form表单里的数据
      • 获取JSON里的数据
        • 如何解析JSON格式
        • 获取数据
        • 返回数据
  • HttpServletResponse
    • 设置响应的Header
    • 设置不同的状态码
    • 设置重定向
    • 设置返回的数据

Servlet提供的类和方法很多,但是最常用的只有三个:HttpServlet、HttpServletRequest、HttpServletResponse。我们下面也只介绍这三个常用的类:

HttpServlet

我们在写Servlet代码的时候,第一步就是创建一个类,继承HttpServlet,然后重写其中的方法。它里面的方法分为俩类,我们依次介绍:

基础方法

在这里插入图片描述

注:

  1. HttpServlet的实例只在程序启动的时候创建一次,而不是每次收到请求都要创建一次。因此,init方法也就只执行一次

  2. destory方法不一定能被调用到。只要tomcat关闭,就不再使用HttpServlet类,按理就应该调用destory方法,但是关闭有两种情况:

    • 正常关闭:通过8005端口给tomcat发送关闭指令,tomcat就会正常关闭,会调用到destory方法
    • 异常关闭:点击红色×关闭、通过任务管理器关闭、断电关闭,这些情况下tomcat会异常关闭,不会调用到destory方法
  3. tomcat收到请求后实际会先调用service方法,再由service方法调用对应的do×××方法来处理请求。但是实际开发过程中直接重写do×××方法就行了。

doXXX方法

在这里插入图片描述

注:tomcat每次收到不同类型的请求,调用不同类型的方法来处理请求。

Servlet的生命周期

在初始阶段,实例化的时候,会调用一次init()方法;在每次收到请求的时候,都会调用service()方法,再由service()方法分别调用do×××()方法进行处理请求;在结束之前,调用一次destroy()方法。

HttpServletRequest

Tomcat通过SocketAPI读取HTTP请求(字符串),并按照HTTP协议的格式把字符串解析成HttpServletRequest对象。

获取请求中的信息

在这里插入图片描述

在这里插入图片描述

获取请求传递的参数

请求中的参数是用来传递真实的数据的,我们往往需要通过这些数据来计算响应。因此,我们就需要对参数中的这些数据进行接收。根据数据传递的不同方式,我们总结出以下三种方式来对数据进行接收:

获取 query string 里的数据

@WebServlet("/getParameter")
public class GetParameterServlet extends HelloServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//  浏览器构造的quary String 的形式: ?studentId=1&studentName=张三String studentId = req.getParameter("studentId");String studentName = req.getParameter("studentName");System.out.println(studentId);System.out.println(studentName);resp.setContentType("text/html;charset=utf8");resp.getWriter().write(studentId + "," + studentName);}}

在这里插入图片描述

注:

  1. 使用getParameter()方法来接收请求中传递来的参数,这些参数都是以键值对的形式传递的;()里面写键值对的key,就可以得到键值对中的value
  2. 在将数据返回前端时要注意设置数据返回的格式,否则前端接收到数据后会随机选择一种格式展示在页面上,可能不是我们想要的格式。

获取form表单里的数据

	@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 预期请求的 body 里是 studentId=1&studentName=张三String studentId = req.getParameter("studentId");String studentName = req.getParameter("studentName");System.out.println(studentId);System.out.println(studentName);resp.setContentType("text/html;charset=utf8");resp.getWriter().write(studentId + "," + studentName);}

在这里插入图片描述

注:

  1. 使用getParameter()方法来接收请求中传递来的参数,这些参数都是以键值对的形式传递的;()里面写键值对的key,就可以得到键值对中的value
  2. 在将数据返回前端时要注意设置数据返回的格式,否则前端接收到数据后会随机选择一种格式展示在页面上,可能不是我们想要的格式。

获取JSON里的数据

如何解析JSON格式

Servlet内部没有提供解析JSON格式的工具,那怎么办呢?

  • 我们自己写一个嘛?

    不需要,太麻烦了。我们知道JSON是支持嵌套的,如果我们自己写一段代码来解析就需要使用递归等途经,非常麻烦。

  • 使用现成的第三方库—jackson

    这种现成的第三方库就提供了解析JSON格式的工具,我们只需要在项目中引入依赖就可以使用这些功能。我们主要学习jackson提供的一个类俩个方法:

    一个类:ObjectMapper
    方法一:readValue()用来把JSON格式的数据转化为Java的对象
    方法二:writeValue()用来把Java的对象转化为JSON格式的数据

获取数据
@WebServlet("/json")
public class JsonServlet extends HelloServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 此处假设请求的 body 格式为// { studentId: 1, studentName: "张三" }// jackson 提供的核心的类ObjectMapper objectMapper = new ObjectMapper();// 一个方法叫做 readValue, 把 json 格式的数据转成 java 的对象// readValue 第一个参数可以是字符串, 也可以是输入流.// 第二个参数, 是一个类对象. 也就是要解析出来的结果的对象的类.Student student = objectMapper.readValue(req.getInputStream(), Student.class);System.out.println(student.studentId);System.out.println(student.studentName);resp.setContentType("text/html;charset=utf8");resp.getWriter().write(student.studentId + "," + student.studentName + "," + student.score.scores.toString());}
}

在这里插入图片描述

注:

  1. 在接收JSON格式的数据时,要先创建出一个类用来接收数据。这个类中的属性要和JSON的键值对匹配(键的名字务必和属性名一一对应)。
  2. 一定要导入jackson依赖,使用jackson来获取数据
返回数据
		// 还有一个方法叫做 writeValueAsString, 把 java 对象转成 json 格式的字符串resp.setContentType("application/json;charset=utf8");//写法一:resp.getWriter().write(objectMapper.writeValueAsString(student));//写法二:objectMapper.writeValue(resp.getWriter(),student);

在这里插入图片描述

注:

  1. 两种写法都可以,可以任选一种使用。
  2. 在返回JSON格式的数据时,要设置数据的返回格式为 application/json;charset=utf

HttpServletResponse

设置响应的Header

在这里插入图片描述

@WebServlet("/autoRefresh")
public class AutoRefreshServlet extends HelloServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setHeader("refresh","2");resp.getWriter().write(System.currentTimeMillis() + "");}
}

注:

  1. 通过设置refresh这个Header来实现页面的自动刷新,第二个参数表示刷新的频率,单位是”秒“
  2. Header的种类很多,有许多默认存在的我们可以更改他们的值,也可以自定义的写入一些header

设置不同的状态码

在这里插入图片描述

@WebServlet("/status")
public class StatusServlet extends HelloServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 约定, 浏览器 query string 传个参数过来.// 形如 type=1// 如果 type 为 1, 返回 200; type 为 2, 返回404; type 为 3 返回一个 500;String type = req.getParameter("type");if (type.equals("1")){resp.setStatus(200);}else if (type.equals("2")){resp.setStatus(404);}else {resp.setStatus(500);}}
}

注:

  1. 这些状态码设置什么值、前端页面如何处理? 都是由程序员自定义的。
  2. 状态码表:描述了不同的状态码表示什么状态点击查看状态码表

设置重定向

在这里插入图片描述

@WebServlet("/redirect")
public class RedirectServlet extends HelloServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//方式一:resp.sendRedirect("https://www.sogou.com");//方式二:resp.setStatus(302);resp.setHeader("Location","https://www.sogou.com");}
}

注:

  1. 方式一直接设置重定向,填写一个参数,表示重定向到的URL
  2. 方式二间接设置重定向,要同时设置 1.状态码302:表示重定向 2. 填写两个参数:第一个参数是重定向位置标志,第二个参数填入重定向的URL

设置返回的数据

在这里插入图片描述

@WebServlet("/getMessage")
public class GetMsgServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf8");resp.getWriter().write("成功返回一条消息");}
}

注:响应数据的格式有很多,点击此处查看所有的响应数据格式

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML+CSS+ElementUI搭建个人博客静态页面展示(纯前端)

网站演示 登录页面 门户页面 搭建过程 技术选取:HTML/CSS VUE2 ElementUI(Version - 2.15.14)编程软件:VSCode 环境配置与搭建 安装指令 1. 先确保你的电脑已经安装好了npm和node npm -vnode -v2. ElementUI下载,推荐使用 npm 的方式安装 npm i element-ui…

Postman API Enterprise 10.18.1 Crack

适合您企业的 Postman API 平台 掌控您的 API 环境。构建更好的 API。加快产品开发。 无论您处于 API 之旅的哪个阶段,Postman 都会为您提供帮助 想让您团队的 API 更容易被发现吗?希望减少开发和质量检查之间的滞后时间?想要更快地让新开发…

aspera替代方案,镭速大文件传输解决方案替代

相信不少的互联网用户对于传输软件aspera并不陌生,但是市面上有没有哪一些aspera替代方案,aspera替代方案是否比aspera更加能够解决数据传输的需求,是一个值得思考的事情,那么我们先来了解一下aspera以及aspera替代方案。 了解Asp…

JAVA项目测试----用户管理系统

一)项目简介: 用户管理系统是依据于前后端分离来实现的,是基于Spring SpringBoot Spring MVC,SpringAOP,MyBatis等框架来实现的一个用户管理网站,并且已经部署到了云服务器上, 目前的用户管理系统实现了超级管理员的注册功能&…

新手必看!!附源码!!STM32通用定时器输出PWM

一、什么是PWM? PWM(脉冲宽度调制)是一种用于控制电子设备的技术。它通过调整信号的脉冲宽度来控制电压的平均值。PWM常用于调节电机速度、控制LED亮度、产生模拟信号等应用。 二、PWM的原理 PWM的基本原理是通过以一定频率产生的脉冲信号&#xff0…

Python BDD之Behave测试报告

behave 本身的测试报告 behave 本身提供了四种报告格式: pretty:这是默认的报告格式,提供颜色化的文本输出,每个测试步骤的结果都会详细列出。plain:这也是一种文本格式的报告,但没有颜色,并且…

使用Python画一棵树

🎊专栏【不单调的代码】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 🥰欢迎并且感谢大家指出我的问题 文章目录 🌹Turtle模块🎄效果🌺代码🛸代码…

【SpringCloud微服务全家桶学习笔记-Hystrix(服务降级,熔断,接近实时的监控,服务限流等)】

服务雪崩 (微服务面临的问题) 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用&…

Redis的持久化(新)

Redis中数据都保存在内存,但是内存中的数据变换很快,也很容易丢失,比如连接断开、宕机停机等等。而Redis提供的数据持久化机制有RDB(Redis DataBase)和AOF(Append Only File)。 1.RDB RDB是指在指定的时间间隔内将内存中的数据集快照写入到磁…

多普勒流速流量计的功能作用

在当今的城市管理中,排水系统的监控和管理一直是难题之一。传统的人工巡检方式不仅效率低下,而且无法做到实时监控和预警。然而,随着科技的进步,多普勒流速流量计的出现为城市排水管理带来了新的解决方案。 多普勒流速流量计是一种…

UI自动化之Playwright简介

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

UI设计师岗位的基本职责八篇(合集)

UI设计师岗位的基本职责1 职责: 1. 负责公司互联网产品app、web、h5等的用户界面设计工作; 2. 负责运营活动相关的平面及视频设计支持; 3. 负责完成产品相关的界面、图标、动画等的图形界面设计,并参与制定、编写产品视觉设计规范文档; 4. 整理和分…