Servlet常用API

news2024/12/23 18:39:03

目录

一、HttpServlet

1、HttpServlet核心方法

2、Servlet的生命周期

二、HttpRequest

1、HttpRequest核心方法

2、代码示例

示例1:打印请求信息

示例2:获取GET请求中的query string

示例3:获取POST请求中的query string(form表单形式)

示例4:获取POST请求中的query string(json格式)

三、HttpResponse

1、HttpResponse核心方法

2、代码示例

示例1:自动刷新

示例2:重定向


一、HttpServlet

HttpServlet是我们写Servlet代码创建类时需要继承的父类。

1、HttpServlet核心方法

方法名称调用时机
initHttpServlet被实例化时调用一次
destroyHttpServlet对象被销毁前调用一次
service每收到一个HTTP请求时调用一次
doGet收到GET请求时调用(由service方法调用)
doPost收到POST请求时调用(由service方法调用)
doPut/doDelete/doOptions……收到其他对应请求时调用(由service方法调用)

2、Servlet的生命周期

Servley的声明周期指的是Servlet从创建到销毁的过程:

(1) 当一个请求从HTTP服务器转发给Servlet容器时,容器会检查对应的Servley是否创建,如果没有创建就实例化该Servlet,并调用init()方法,inint()方法只调用一次,后续的请求都从第二步开始;

(2) Servlet每收到一个请求,就会调用一次service()方法,根据请求类型调用对应的方法,doGet、doPost等;

(3) Servlet销毁前调用一次destroy()方法进行清理操作,该方法只调用一次,随后JVM回收资源。

二、HttpRequest

Tomcat会把收到的HTTP请求按照HTTP协议的格式解析成一个HttpRequest对象。

1、HttpRequest核心方法

方法描述
String getProtocol()返回请求协议的名称和版本
String getMethod()返回请求的HTTP方法名称
String getURI()返回URL中端口之后的部分
String getContextPath()返回请求的ContextPath
String getQueryString()返回请求中的查询字符串(query string)
Enumeration getParameterNames()

返回query string中所有key的名称,

返回值类型是一个String对象的枚举

String getParameter(String name)

返回query string中指定的key所对应的一个value,

如果key不存在则返回null

String[] getParameterValues(String name)

返回query string中指定的key所对应的所有value,

如果key不存在则返回null

Enumeration getHeaderNames()

返回HTTP请求头中所有的key,

返回值类型是一个String对象的枚举

String getHeader(String name)返回请求头中指定的key所对应的value
String getCharacterEncoding()返回请求主体中使用的字符编码名称
String getContentType()

返回请求主体中使用的数据类型,

如果不知道类型则返回null

int getContentLength()

以字节为单位返回请求主体的长度,

如果长度未知则返回-1

InputStream getInputStream()

返回一个InputStream对象,用于读取请求的body内容

2、代码示例

示例1:打印请求信息

@WebServlet("/request")
public class RequestDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //指定响应的数据格式以及使用的字符集
        resp.setContentType("text/html;charset=utf8");
        StringBuilder sb = new StringBuilder();
        //获取请求协议的名称和版本号
        sb.append(req.getProtocol());
        sb.append("<br>");//html的换行
        //获取请求的方法名称
        sb.append(req.getMethod());
        sb.append("<br>");
        //获取请求的URI和ContextPath
        sb.append(req.getRequestURI());
        sb.append("<br>");
        sb.append(req.getContextPath());
        sb.append("<br>");
        //获取query string
        sb.append(req.getQueryString());
        sb.append("<br>");
        //获取请求头中的键值对
        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()){
            //获取请求头中的key
            String name = headerNames.nextElement();
            //获取请求头中的value
            String value = req.getHeader(name);
            sb.append(name+": "+value);
            sb.append("<br>");
        }
        resp.getWriter().write(sb.toString());
    }
}

代码运行结果:

示例2:获取GET请求中的query string

@WebServlet("/getParameter")
public class GetParameterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //假设请求中有两个参数:id和name
        String id = req.getParameter("id");
        String name = req.getParameter("name");
        System.out.println(id);
        System.out.println(name);
        resp.getWriter().write(id + ", " + name);
    }
}

代码运行结果:

注意:要在服务器中显示指定响应的数据格式和字符集,否则浏览器可能无法正确识别响应内容。

        resp.setContentType("text/html;charset=utf8");

设置好响应的数据格式和字符集后,再次查看代码运行结果:

示例3:获取POST请求中的query string(form表单形式)

@WebServlet("/getParameter")
public class GetParameterServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //假设请求中有两个参数:id和name
        String id = req.getParameter("id");
        String name = req.getParameter("name");
        System.out.println(id);
        System.out.println(name);
        resp.setContentType("text/html;charset=utf8");
        resp.getWriter().write(id + ", " + name);
    }
}

通过form表单构造一个POST请求:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="getParameter" method="post">
        <input type="text" name="id">
        <input type="text" name="name">
        <input type="submit" value="提交">
    </form>
</body>
</html>

代码运行结果: 

可以看到,服务器这里打印的响应数据已经乱码了,说明服务器对请求的解析方式不正确,所以我们要给请求也设置字符集,告诉Servlet按照哪种编码来解析请求的body:

        req.setCharacterEncoding("utf8");

再次查看代码运行结果:

示例4:获取POST请求中的query string(json格式)

为了能够解析JSON格式的数据,我们需要借助第三方库:jackson。

(1) 在Java中央仓库搜索jackson:

(2) 任意选择一个版本:

(3) 复制maven中的内容到pom.xml文件中的<dependencies>标签中:

jackson中最核心的类:ObjectMapper

ObjectMapper中的核心方法:

方法说明
readValue()把json格式数据转换为Java的对象
writeVauleAsString()把Java对象转换为json格式的字符串

获取json格式的数据:

class Parameter{
    //1.用来接收json格式数据的类中的属性必须是public修饰的
    //  或者必须提供public修饰的getter和setter方法
    //  否则jackson无法访问这个类的属性
    //2.必须要有一个无参版本的构造方法
    //3.属性的类型和名称必须要和json中key的类型和名称一致
    public int id;
    public String name;
}
@WebServlet("/json")
public class GetJsonParameter extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //假设请求的body为:{"id": 10,"name": 张三}

        //1.创建一个ObjectMapper对象
        ObjectMapper objectMapper = new ObjectMapper();
        //2.读取json格式的数据并转换为要解析的类的对象
        //readValue第一个参数可以是字符串,也可以是输入流
        //第二个参数是要解析的类的类对象
        Parameter parameter = objectMapper.readValue(req.getInputStream(),Parameter.class);
        System.out.println(parameter.id);
        System.out.println(parameter.name);
        //以json格式返回
        resp.setContentType("application/json;charset=utf8");
        resp.getWriter().write(objectMapper.writeValueAsString(parameter));
    }
}

readValue的工作过程:

(1) 读取输入流,获取到要解析的字符串;

(2) 把字符串按照json格式解析为一组键值对;

(3) 根据类对象创建一个对应的实例;

(4) 遍历类对象的属性名,根据属性名(key)在刚才解析的键值对中寻找对应的值(value),并赋值给对应的属性;

(5) 返回构造完成的对象。

通过postman构造一个POST请求查看代码运行结果:

三、HttpResponse

        Servlet中的doXXX方法会根据请求计算响应,并把响应的数据设置到HttpResponse对象中,然后Tomcat就会把这个HttpResponse对象按照HTTP协议的格式,转成一个字符串,并通过Socket写回给浏览器。

1、HttpResponse核心方法

方法描述
void setStatus(int sc)设置响应的状态码
void setHeader(String name,String value)

设置一个指定名称和值的响应头,如果name已存在,

则覆盖旧的值

void addHeader(String name,String value)

设置一个指定名称和值的响应头,如果name已存在,

不会覆盖旧的值,添加新的键值对

void setContentType(String type)设置被发送的客户端的响应的数据格式
void setCharacterEncoding(String charset)设置被发送到客户端的响应的字符编码
void sendRedirect(String location)使用指定的重定向位置URL发送临时重定向响应到客户端
PrintWriter getWriter()用于往body中写入文本格式数据
OutPutStream getOutPutStream()用于往body中写入二进制格式数据

2、代码示例

示例1:自动刷新

实现一个程序,让浏览器每2s自动刷新一次,并显示时间戳:

@WebServlet("/autoRefresh")
public class AutoRefreshServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //通过设置HTTP响应报头中的refresh字段,可以控制浏览器自动刷新的时机
        resp.setHeader("refresh","2");
        //返回当前的时间戳
        resp.getWriter().write(System.currentTimeMillis()+"");
    }
}

 抓包结果:

示例2:重定向

实现一个程序,返回一个重定向HTTP响应,自动跳转到搜狗主页:

方式一:通过设置状态码和响应头中的Location字段:

@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://www.sogou.com");
    }
}

抓包结果:

方式二:通过调用sendRedict方法重定向

@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://www.sogou.com");
        resp.sendRedirect("https://www.sogou.com");
    }
}

抓包结果:

 

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

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

相关文章

功率谱分析笔记-------脑电相关

1&#xff1a;功率谱分析的方法介绍 功率谱分析的方法大致可以分为两大类&#xff1a;第一类是经典的功率谱计算方法&#xff0c;第二类是现代功率谱计算方法&#xff0c;如图1所示。其中第一类经典功率谱分析方法&#xff0c;又可以分为直接法、间接法和改进的直接法。直接法…

常见移动端导航类型

手机导航设计是人机交互最重要的桥梁和平台&#xff0c;旨在引导用户正确的方向&#xff0c;不迷路。 好的菜单设计不仅能提升整个产品的用户体验&#xff0c;还能让用户耳目一新。 一、导航菜单的作用是什么 &#xff1f; 1.提升产品内容和功能结构和层次 2.重点展示核心功能…

windows cmd 常用操作命令

文章目录进程端口相关打开面板快捷键防火墙相关进程端口相关 可以查看本机开放的全部端口. netstat -ano 协议&#xff1a;分为TCP和UDP 本地地址&#xff08;Local Address&#xff09;&#xff1a;代表本机IP地址和打开的端口号 外部地址&#xff08;Foreign Address&#…

字节8年测试开发工程师感悟,说说我们自动化测试平台的进阶之路

前言 自2015年10月底加入Pactera Edge以来&#xff0c;我一直服务于客户的Quality Engineering项目。这之间经历了很多的技术变革&#xff0c;包括探索&#xff0c;实施&#xff0c;维护&#xff0c;淘汰等一整个流程。下面就写一下项目中 UTAP(unified testing automation pl…

Java多线程(三)

目录 一、线程的同步&#xff08;二&#xff09; 同步机制释放锁的操作 不会释放锁的操作 线程的死锁问题 死锁 解决方法 Lock(锁) 使用Lock(锁)创建多线程步骤&#xff1a; 使用Lock解决窗口售票问题 synchronized与Lock的对比 练习 二、线程的通信 通过例题说明线…

优化器-SQL语句分析与优化

一、连接-配置优化 1.1 连接数过多问题 有时会碰到Mysql&#xff1a;error 1040&#xff1a;Too many connection的错误。原因&#xff1a;超过了服务端设置的最大并发连接数。 1.2 从两个方面解决问题 服务端&#xff0c;增加服务端可用连接数&#xff1b;客户端&#xff0…

如何在视频上添加水印?建议收藏这些方法

小伙伴们平时会刷短视频吗&#xff1f;那你们会不会自己也在平台上&#xff0c;发布一些自己剪辑的短视频呢&#xff1f;在网上发布的视频&#xff0c;很容易被一些不安好心的人&#xff0c;直接窃取&#xff0c;所以为视频添加自己的水印显得尤为重要。那你们知道如何给视频加…

sqli-labs/Less-49

欢迎界面还是以sort作为注入点 首先判断属于数字型还是字符型 输入如下 sortrand() 页面从没有变化 说明属于字符型 然后输入1 发现没有报错信息 不能使用报错注入 只能通过结果去反映处你的注入是对是错 首先输入1-- 成功回显 说明注入类型就是属于单引号字符型 然后接…

Towards Class-Oriented Poisoning Attacks Against Neural Networks 论文笔记

#论文笔记# 1. 论文信息 论文名称Towards Class-Oriented Poisoning Attacks Against Neural Networks作者Bingyin Zhao会议/出版社WACV 2022pdf&#x1f4c4;在线pdf代码无 基于类别的 availability attacks&#xff0c;不同于原本的 availability attacks 只考虑降低模型的…

VMware虚拟机中的Linux通过NAT模式共享主机网卡实现与外部设备通信

目前遇到的使用场景&#xff1a; 需要VMware虚拟机中linux通过PC端的物理网卡与外界其他设备或PC进行通信&#xff0c;因此需要配置虚拟机中linux的通信链路。 1.设置PC端IP网络 如果要实现虚拟机被局域网其它机子访问到&#xff0c;那么这里我们要选择桥架模式&#xff0c;具…

Oracle实验五Sql语句

每一句插入都要带commit提交&#xff0c;不然会出现很多报错 直接从WPS实验报告里复制过来的&#xff0c;可能有中英文标点问题 实验目的 &#xff08;1&#xff09; 掌握数据的插入&#xff08;INSERT&#xff09;、 修改&#xff08;UPDATE&#xff09; 和删除&#xff08;D…

现代密码学导论-1-导论

目录 1.1 密码学和现代密码学 1.2 私钥加密 1.2.1 私钥加密的两个广泛应用 1.2.2 加密的语法 1.2.3 柯克霍夫原则 1.1 密码学和现代密码学 经典密码学(20世纪80年代以前)和现代密码学之间的另一个非常重要的区别与它的采用有关。历史上&#xff0c;密码学的主要消费者是军…

Android App开发实战项目之电子书架的实现(附源码 简单易懂 可直接使用)

需要图片集和源码请点赞关注收藏后评论区留言~~~ 一、需求描述 在手机上浏览电子书的浏览体验跟阅读纸质书差不多&#xff0c;翻页过程仍旧呈现纸张翻转的视觉特效&#xff0c;让读者看起来赏心悦目。总结一下&#xff0c;手机阅读无非是要具有两大功能点&#xff1a;其一为书…

【GlobalMapper精品教程】025:影像数据集的建立与巧妙使用

GlobalMapper影像数据集类似于金字塔,作用是提高大量影像的加载与显示速度,还可批量进行一系列设置。本文的配套数据为data025.rar。 文章目录 1. 建立影像数据集2. 影像数据集的使用1. 建立影像数据集 (1)点击【文件】→【创建新地图目录】。 (2)选择影像数据集存放路径…

Doker学习笔记1(狂神)

虚拟机技术缺点&#xff1a; 1.资源占用十分多 2.冗余步骤多 3.启动很慢&#xff01; 容器化技术 我们去安装docker&#xff1a; 我们先保证我们的虚拟机是可以使用的。 环境查看&#xff1a; 系统内核是3.10以上的 系统版本&#xff1a; 我们用的是centOS7虚拟机。 然后…

微服务学习笔记(二)

文章目录Spring Cloud Eureka1.Spring Cloud Eureka 简介2.Spring Cloud Eureka 和 Zookeeper 的区别2.1 什么是 CAP 原则&#xff08;面试&#xff09;2.2 分布式特征3.Spring Cloud 其他注册中心3.1 Consul3.2 Nacos4.Spring Cloud Eureka 快速入门4.1 搭建 Eureka-server4.1…

【ELM回归预测】探路者优化极限学习机回归预测【含Matlab源码 2231期】

⛄一、探路者算法简介 提出的一种新兴的智能优化算法&#xff0c;该算法的思想起源于群体动物的狩猎行为&#xff0c;种群中的个体分为探路者和跟随者两种角色。算法的寻优过程模拟了种群寻找食物的探索过程&#xff0c;利用探路者、跟随者两种角色不同的位置更新方式以及角色…

蓝牙血压计PCBA硬件解决方案

蓝牙血压计是利用现代电子技术与血压间接测量原理进行血压测量的医疗设备。家庭医疗保健已成为现代人的医疗保健时尚。过去人们测量血压必须到医院才行&#xff0c;而今只要拥有了蓝牙血压计&#xff0c;坐在家里便可随时监测血压的变化&#xff0c;如发现血压异常便可及时去医…

odoo14 | odoo中domain的复杂写法

本片文章主要讲述domain中复杂业务需求的逻辑构思&#xff0c;关于doamin的使用位置会在另一篇文章中体现。 二叉树与波兰式 在讲述domain的使用前先讲解一下科班生必学的《数据结构与算法》中二叉树遍历与波兰式的内容&#xff0c;如果你会二叉树先序遍历与波兰式转换请直接…

从零开始的深度学习之旅(2)

目录深层神经网络1. 异或门问题1.1 异或代码实现2.神经网络的层2.1 去除激活函数的异或门2.2 使用sigmoid函数的异或门3.从0实现深度神经网络的正向传播深层神经网络 1. 异或门问题 在第一篇的博客中,我们使用代码实现了与门 import torch X torch.tensor([[1,0,0],[1,1,0]…