Servlet---API详解

文章目录

  • 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 {
    @Override
    protected 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表单里的数据

	@Override
    protected 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 {
    @Override
    protected 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{
    @Override
    protected 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{
    @Override
    protected 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{
    @Override
    protected 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 {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf8");
        resp.getWriter().write("成功返回一条消息");
    }
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入探讨软件测试技术:方法、工具与最佳实践

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 引言 软件测试是软件开发生命周期中至关重要的…

【操作系统】文件系统之文件共享与文件保护

文章目录 文件共享硬链接软链接 文件保护口令保护加密保护访问控制 文件共享 为了实现文件的共享,引入了“计数器”字段,当一个文件每被一个用户所共享,那么计数器就加一。如果一个用户删除文件,计数器相应的减一。如果计数器为0…

威视佰科荣获:2023年“AI天马”高成长性企业

11月14日下午,2023年度“AI天马”认定评审会顺利召开。落实《深圳经济人工智能产业促进条例》,加快推进智能机器人、智能传感器、智能网联汽车、智能终端、脑科学和类脑智能等人工智能相关产业发展,加速AI产业化和产业AI化进程,持…

Redis篇---第十二篇

系列文章目录 文章目录 系列文章目录前言一、Memcache与Redis的区别都有哪些?二、单线程的redis为什么这么快三、redis的数据类型,以及每种数据类型的使用场景前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇…

BGP笔记实验

IGP(Interior Gateway Protocol)——内部网关协议 OSPF RIP IS-IS IGRP EIGRP EGP(External Gateway Protocol)——外部网关协议 EGP BGP——边界网关协议 AS——自治系统 由单一组织or机构独立维护的网络设备&网络资源的集合 网络范围太大 自治 AS号 为了区分不同…

66从零开始学Java之集合中的Collection体系

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 截止到今天,我们《从零开始学Java系列》的文章已经要到一个新的阶段了。在此之前&#xf…

每天分享五款工具,让大家工作生活更顺心

​ 快乐不是在于拥有什么,而在于我们和别人分享什么。每天分享五款工具,让大家工作办公更顺心就是我最大的快乐。 1.沙盒软件——Sandboxie ​ Sandboxie是一款可以在沙盒中运行程序的软件,它可以保护用户的系统和数据免受恶意软件、病毒和其他威胁的影…

pytorch下载离线包的网址

下载地址:https://download.pytorch.org/whl/torch_stable.html 安装GPU版本需要安装:torch、torchvision、 注意版本需要对应上 格式:适用cuda版本,torch版本 或者 orchvision版本,cp38就是适用python 3.8版本 下…

亚马逊车灯外贸出口CE认证标准办理解析

车灯是车辆夜间行驶在道路照明的工具,也是发出各种车辆行驶信号的提示工具。车灯一般分为前照灯、尾灯、转向灯等。车灯出口欧盟需要办理CE认证。 CE认证是欧盟对进入欧洲市场的产品强制性的认证标志,是指符合欧盟安全、健康、环境保护等标准和要求的产…

运动装备经营小程序商城效果如何

运动装备可包含服装、帐篷、渔具、箱包鞋帽等,对喜欢外出的人来说,靠谱的装备是关键,往往更容易选择品牌和信得过的商家。 而对商家来说,如何打造品牌提升卖货经营效率和提升营收是重中之重;互联网时代需要商家拓展线…

5款免费BI数据可视化工具,2023年最新精选推荐!

BI可视化工具顾名思义是进行数据分析和可视化的软件,旨在将数据以表格、图表、仪表盘等形式展示出来,让用户能够更加直观了解其业务状况、发现问题,并在必要时进行决策。   市面上BI数据可视化工具很多,目前比较火的像国外的Tabl…

windows如何查看自己的ip地址

windows如何查看自己的ip地址 1.打开控制面板 2.进入网络和internet 3.进入网络共享中心 4.点击以太网进入网络详情页,或邮件已连接的网络,点击属性 5.查看ipv4地址就是当前机器ip

[C语言 数据结构] 栈

1.什么是栈? 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压…

qt和window抓包程序

1.思路 使用原始套接字,将网卡设置为混杂模式,监听该网卡的数据。 2. 了解协议封包和协议层 下图是tcp封包详细过程 数据包传输情况 在TCP/IP协议栈中的每一层为了能够正确解析出上层的数据包,从而使用一些“协议类型”来标记,详…

java桌面程序

目标之一是把打印导出的功能最终用java实现一套,首先选定javafx,因为idea默认创建工程就带的javafx,没找到swing。 创建工程,这里要选1.8,高版本jdk默认不带fx 实现主界面的代码 package sample;import javafx.app…

RT-DETR手把手教程,注意力机制如何添加在网络的不同位置进行创新优化

💡💡💡本文独家改进:本文首先复现了将EMA引入到RT-DETR中,并跟不同模块进行结合创新;1)Rep C3结合;2)直接作为注意力机制放在网络不同位置;3)高效…

十六、RabbitMQ快速入门

目录 一、在centos上下载MQ镜像 二、安装运行容器 三、登录进入MQ 1、添加一个新的用户 2、新建虚拟机 3、 为用户分配权限 四、RabbitMQ的基本概念 RabbitMQ中的几个概念: 五、常见消息模型 六、简单的消息生产与消费 1、消费者类 2、生产者类 3、基本消息队列的消…

为什么 ConcurrentHashMap 中 key 不允许为null

考察目标 这是一个基础问题,主要考察 1 到 3 年经验的开发人员 ConcurrentHashMap 在实际应用中使用频率较高 考察这个问题的目的,是了解求职者的基本功。 所以为了表现更好,可以从 ConcurrentHashMap 的设计角度去回答。 问题解析 打开…

springcloud学生选课系统源码

开发技术: jdk1.8,mysql5.7,idea,nodejs,vscode springcloud springboot mybatis vue elementui 功能介绍: 学生: 登录,统计分析,选课(查看课程及选择&a…

Kubernetes Gateway API 攻略:解锁集群流量服务新维度!

Kubernetes Gateway API 刚刚 GA,旨在改进将集群服务暴露给外部的过程。这其中包括一套更标准、更强大的 API资源,用于管理已暴露的服务。在这篇文章中,我将介绍 Gateway API 资源,并以 Istio 为例来展示这些资源是如何关联的。通…