Servlet---API详解

news2024/10/6 6:01:14

文章目录

  • 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("成功返回一条消息");
    }
}

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

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

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

相关文章

Linux入门必备指令

Linux学习之路起始篇——Linux基本指令 文章目录 Linux学习之路起始篇——Linux基本指令**一、ls指令****二、pwd命令****三、cd命令****四、touch指令****五、mkdir命令****六、rm命令****七、man 命令****八、cp命令****九、mv命令****10、cat 指令****十一、tac命令** 前言&…

基于蜜獾算法优化概率神经网络PNN的分类预测 - 附代码

基于蜜獾算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于蜜獾算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于蜜獾优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…

基于Spring Boot 框架的试卷自动生成系统的设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题,今天给大家介绍…

数据结构:lambda表达式

基本概念 语法 // 1. 不需要参数,返回值为 2 () -> 2 // 2. 接收一个参数(数字类型),返回其2倍的值 x -> 2 * x // 3. 接受2个参数(数字),并返回他们的和 (x, y) -> x y // 4. 接收2个int型整数,返回他们的乘积 (int x, int y) -> x * y // 5. 接受一个 string 对…

【外汇天眼】投资之道:成功背后的频繁交易陷阱

成功的投资需要超越人性的短板,其中之一就是频繁交易。巴菲特曾明言,如果商学院的毕业生在毕业后拿一张卡片,每买一支股票就打一个洞,那么这张卡片最终会被打得最少的人将成为巨富。“钱在这里从活跃的投资者流向有耐心的投资者。…

leetcode——设计循环队列

设计循环队列 这个题目在这里小编只分享一个解题思路,因为还有一个思路小编还在尝试,一直过不了,还在这里不断尝试,等我试出来的时候我在分享给大家,首先我们在这里给出的是数组的形式,后面在分享单链表的思…

Python loglog()函数

常用坐标下的图像显示 import matplotlib.pyplot as plt import numpy as np import mathplt.figure() x_input np.linspace(1, 10, 50) y_input x_input**2plt.plot(x_input, y_input,r-,linewidth2) plt.show()在loglog函数尺度下的曲线 plt.loglog(x_input, y_input,r-,…

筒仓料位监测|敢不敢对“精度”下狠手!您家筒仓料位测得准吗?

您家是不是还在人工敲仓估算? 您能精确知道料位和库存吗? 您能实时看到库存盈亏吗? 筒仓里装了什么?用了多少? 什么时候进料最划算? 您家的筒仓管理方式可靠吗? 上海思伟筒仓料位监测方案 看…

Atlassian发布最新补贴政策,Jira/Confluence迁移上云最低可至零成本

到2024年2月15日,Atlassian将不再提供对Jira、Confluence、Jira Service Management等Server版产品的支持。 近期,Atlassian推出了一项针对云产品的特殊优惠。现在从Server版迁移到云版,您能享受到高额补贴,甚至成本低至零元。立…

计算机网络——数据链路层简解

1. 前言: 数据链路层,即在物理层之上网络层之下,数据链路层的数据交互可以通过mac来确实身份和发送数据。 说到数据链路层这里简单介绍下设备: 网桥(Bridge): 网桥是一种数据链路层设备&#…

C语言——深入理解指针——函数指针

一、函数指针变量 1.1 函数指针变量的创建 什么是函数指针变量呢&#xff1f; 函数指针变量应该是用来存放函数地址的&#xff0c;未来通过地址能够调⽤函数的。 那么函数是否有地址呢&#xff1f; 我们做个测试&#xff1a; #include <stdio.h> void test() {print…

纽扣电池类产品上架亚马逊澳大利站认证标准要求AS/NZS 62368

纽扣电池一般来说常见的有充电的和不充电的两种&#xff0c; 充电的包括3.6V可充锂离子扣式电池(LIR系列)&#xff0c;3V可充锂离子扣式电池(ML或VL系列)&#xff1b;不充电的包括3V锂锰扣式电池(CR系列)及1.5V碱性锌锰扣式电池(LR及SR系列)。 澳大利亚*已经发布了经批准的《消…

重装系统后如何恢复以前的文件?详细教程大揭秘!

在日常生活中&#xff0c;我们可能会遇到各种计算机问题&#xff0c;其中最严重的问题之一就是需要重装系统。在重装系统之前&#xff0c;我们通常需要考虑一个问题&#xff1a;重装系统后还能恢复以前的文件吗&#xff1f; 首先&#xff0c;我们需要明确一点&#xff0c;重装…

为了摆脱 Android ,亚马逊开发基于Linux的操作系统

导读亚马逊一直在开发一种新的操作系统 —— 内部代号为 “Vega”&#xff0c;以便在 Fire TV、智能显示器和其他联网设备上取代 Android 系统。 亚马逊一直在开发一种新的操作系统 —— 内部代号为 “Vega”&#xff0c;以便在 Fire TV、智能显示器和其他联网设备上取代 Andr…

虹科干货丨TWAMP:什么是双向主动测量协议?

来源&#xff1a;虹科网络安全 虹科干货丨TWAMP&#xff1a;什么是双向主动测量协议&#xff1f; 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 导语 TWAMP&#xff08;双向主动测量协议&#xff09;是什么&#xff1f;它在网络性能测量中有什么作用&#xff1f;如…

Java 多线程进阶

1 方法执行与进程执行 GetMapping("/demo1")public void demo1(){//方法调用new ThreadTest1("run1").run();//线程调用new ThreadTest1("run2").start();} 下断点调试信息&#xff0c;可以看到run()方法当前线程是“main1” 继续运行到run里面&…

练习六-使用Questasim来用verilog使用function函数

[TOC](使用Questasim来用verilog使用function函数 1&#xff0c;verilog中使用函数function2&#xff0c;RTL代码3&#xff0c;测试代码4&#xff0c;输出波形 1&#xff0c;verilog中使用函数function 目的&#xff1a; &#xff08;1&#xff09;了解函数的定义和在模块设计中…

问题解决:Ubuntu18.04下nvcc -V指令可用,/usr/local/下却没有cuda文件夹,原因分析及卸载方法

问题描述 今天要运行一个程序&#xff0c;需要CUDA版本高于10.0&#xff0c;我的电脑无法运行&#xff0c;于是开始检查 首先使用nvidia-smi与nvcc -V指令 能够看出来&#xff0c;当前显卡驱动适合的CUDA版本为12.1&#xff0c;而本机安装的版本是9.1.85&#xff0c;那么就需…

使用Navicat将SQL server数据库导入mysql数据库

使用Navicat将SQL server数据库导入mysql数据库 1、使用Navicat Premium打开MySql数据库&#xff0c;然后新建一个数据库名&#xff08;该数据库名称为需要从SqlServer数据库导过来的名称&#xff0c;mysql只有小写&#xff0c;不影响&#xff09; 比如需要将SqlServer数据库…

亚马逊澳大利亚纽扣电池UL4200A认证标准和要求

近来&#xff0c; 与纽扣电池相关的死亡和严重伤害越来越多。 美国消费品安全委员会(CPSC)的工作人员正在参与与消费品电池相关的自愿标准活动&#xff0c;包括UL 4200A -采用锂技术的纽扣或纽扣电池的产品安全标准。 一、适用产品有&#xff1a; 1. 安装有直径 ≤32mm&#x…