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.mzph.cn/news/160951.shtml

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

相关文章

【Redis】持久化-RDBAOF混合持久化

文章目录 前置知识RDB(定期备份)触发机制流程说明RDB文件的处理RDB 的优缺点 AOF(实时备份)使用AOF命令写入AOF工作流程文件同步重写机制重写触发机制AOF进制重写流程 混合持久化启动时数据恢复 总结 前置知识 回顾MySQL MySQL的事…

LeetCode(28)盛最多水的容器【双指针】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 盛最多水的容器 1.题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水…

对线程的创建

一,概括 二,线程构建方式一(继承Thread类) 三,案例 父类: package Duoxiancheng;public abstract class Name {public static void main(String[] args) {//3,创建一个Thread线程类对象Thr…

汇编语言学习笔记

汇编语言的不同种类 as86汇编:能产生16位代码的Intel 8086汇编 mov ax, cs //cs→ax,目标操作数在前GNU as汇编:产生32位代码,使用AT&T系统V语法 movl var, %eax // var→%eax,目标操作数在后内嵌汇编…

基于Qt的UDP通信、TCP文件传输程序的设计与实现——QQ聊天群聊

🙌秋名山码民的主页 😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 获取源码,添加WX 目录 前言一…

Selenium 元素不能定位总结

目录 元素不能定位总结: 1、定位语法错误: 定位语法错误,如无效的xpath,css selector,dom路径错误,动态dom 定位语法错误,动态路径(动态变化) 定位策略错误,如dom没有id用id定位…

vue history路径编码

记录今天遇到的一个问题: 问题现状 有一个需要前端伪造302进行重定向的需求,我们需要将这样的一个路径:http://xxx.com/system-name/#/index,拼接在跳转地址的后面,进行重定向。拼接的方式是这样的: htt…

攻防世界-web-Confusion1

1. 题目描述 打开链接,如图 点击Login和Rigister,都报错 但是有提示 指出了flag所在的位置,题目中直接能获取到的信息暂时就这么些了 2. 思路分析 既然告诉了我们flag文件的位置,那么要读取到这个文件,要么是任意文…

AI辅助带货直播场景源码系统 附带网站的搭建教程

互联网技术的发展和普及,直播带货行业迅速崛起。然而,直播带货在带来商机的同时,也面临着诸多挑战。如直播内容缺乏新意、转化率低等问题。针对这些问题,AI辅助带货直播场景源码系统应运而生,旨在利用人工智能技术&…

对接苹果支付退款退单接口

前言 一般而言,我们其实很少对接退款接口,因为退款基本都是商家自己决定后进行操作的,但是苹果比较特殊,用户可以直接向苹果发起退款请求,苹果觉得合理会退给用户,但是目前公司业务还是需要对接这个接口&am…

试试MyBatis-Plus可视化代码生成器,太香了,你一定会感谢我

前言 在基于Mybatis的开发模式中,很多开发者还会选择Mybatis-Plus来辅助功能开发,以此提高开发的效率。虽然Mybatis也有代码生成的工具,但Mybatis-Plus由于在Mybatis基础上做了一些调整,因此,常规的生成工具生成的代码…

PC端使子组件的弹框关闭

子组件 <template><el-dialog title"新增部门" :visible"showDialog" close"close"> </el-dialog> </template> <script> export default {props: {showDialog: {type: Boolean,default: false,},},data() {retu…

Java面向对象(高级)-- 类中属性赋值的位置及过程

文章目录 一、赋值顺序&#xff08;1&#xff09;赋值的位置及顺序&#xff08;2&#xff09;举例&#xff08;3&#xff09;字节码文件&#xff08;4&#xff09;进一步探索&#xff08;5&#xff09;最终赋值顺序&#xff08;6&#xff09;实际开发如何选 二、(超纲)关于字节…

1992-2021年省市县经过矫正的夜间灯光数据(GNLD、VIIRS)

1992-2021年省市县经过矫正的夜间灯光数据&#xff08;GNLD、VIIRS&#xff09; 1、时间&#xff1a;1992-2021年3月&#xff0c;其中1992-2013年为年度数据&#xff0c;2013-2021年3月为月度数据 2、来源&#xff1a;DMSP、VIIRS 3、范围&#xff1a;分区域汇总&#xff1a…

SpringBoot : ch05 整合Mybatis

前言 随着Java Web应用程序的快速发展&#xff0c;开发人员需要越来越多地关注如何高效地构建可靠的应用程序。Spring Boot作为一种快速开发框架&#xff0c;旨在简化基于Spring的应用程序的初始搭建和开发过程。而MyBatis作为一种优秀的持久层框架&#xff0c;提供了对数据库…

【Linux】-进程间通信-共享内存(SystemV),详解接口函数以及原理(使用管道处理同步互斥机制)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

中低压MOSFET 2N7002T 60V 300mA 双N通道 采用SOT-523封装形式

2N7002KW小电流双N通道MOSFET&#xff0c;电压60V电流300mA&#xff0c;采用SOT-523封装形式。低Ros (on)的高密度单元设计&#xff0c;坚固可靠&#xff0c;具有高饱和电流能力&#xff0c;ESD防护门HBM2KV。可应用于直流/直流转换器&#xff0c;电池开关等产品应用上。

成为AI产品经理——AI产品经理工作全流程

一、业务背景 背景&#xff1a;日常排球训练&#xff0c;中考排球项目和排球体测项目耗费大量人力成本和时间成本。 目标&#xff1a;开发一套用于实时检测排球运动并进行排球垫球计数和姿势分析的软件。 二、产品工作流程 我们这里对于产品工作流程的关键部分进行讲解&…

「Docker」如何在苹果电脑上构建简单的Go云原生程序「MacOS」

介绍 使用Docker开发Golang云原生应用程序&#xff0c;使用Golang服务和Redis服务 注&#xff1a;写得很详细 为方便我的朋友可以看懂 环境部署 确保已经安装Go、docker等基础配置 官网下载链接直达&#xff1a;Docker官网下载 Go官网下载 操作步骤 第一步 创建一个…