Servlet API

Servlet的API就是一组类和方法
其中主要的三个类有
HttpServlet
HttpServletRequest
HttpServletResponse

HttpServlet

这是编写Servlet代码用到的核心类
通过继承这个类 并重新写其中的方法 让tomcat去调用到这里的逻辑

方法名称调用时机
init在HttpServlet实例化之后被调用一次
destroy在HttpServlet示例不再使用的时候调用一次
service收到HTTP请求的时候调用
doGet收到GET请求的时候调用(由service方法调用)
doPost收到POST请求的时候调用(由service方法调用)
doPut/doDelete/doOptions收到其他请求的时候调用(由service方法调用)

webapp被加载的时候 执行init 使用这个方法进行一些初始化操作
webapp在被销毁的时候(tomcat结束) 执行destroy 使用这个方法进行一些收尾工作 但是这个方法不保证能够调用到 所以关闭tomcat还可以通过 8005端口给tomcat发起特殊请求(可以执行destroy) tomcat就关闭了 或者直接杀死tomcat进程(无法执行destroy)
每次收到请求都会执行service 处理每个请求

Servlet的生命周期(什么阶段 做什么事)

  1. webapp刚被加载的时候 调用servlet的init方法
  2. 每次收到请求的时候 调用service方法
  3. webapp要结束的时候 调用destroy方法

对于上述的方法 浏览器只能方便构造get请求 不方便构造其他的方法 所以可以使用postman

创建一个MethodServlet类

public class MethodServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("doGet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("doPost");
    }

    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("doPut");
    }

    @Override
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("doDelete");
    }
}

启动tomcat
在这里插入图片描述
然后我们使用postman软件使用上述的各种方法发出请求
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

HttpServletRequest

Tomcat收到HTTP请求 就会被解析成下面对象

方法描述
String getProtocol()返回请求协议的名称和版本
String getMethod()返回请求的HTTP方法的名称 例如GET POST 或者 PUT
String getRequestURI()从协议名称直到HTTP请求的第一行的查询字符串中 返回该请求的URL的一部分
String getContextPath()返回指示请求上下文的请求URI部分
String getQueryString()返回包含在路径后的请求URL中的查询字符串
Enumeration getParameterNames()返回一个String对象的枚举 包含在该请求中包含的参数的名称
String getParameter(String name)以字符串形式返回请求参数的值 或者如果参数不存在则返回null
String[] getParameterValues(String name)返回一个字符串对象的数组 包含所有给定的请求参数的值 如果参数不存在则返回null
Enumeration getHeaderNames(String name)返回一个枚举 包含该请求中包含的所有头名
String getHeader(String name)以字符串形式返回指定请求头的值
String getCharacterEncoding()返回请求主体中使用的字符编码的名称
String getContentType()返回请求主体的MIME类型 如果不知道类型则返回null
int getContentLength()以字节为单位返回请求主体的长度 并提供输入流 或者如果长度未知则返回-1
InputStream getInputStream()用于读取请求的body内容 返回一个InputStream对象

注意:URI 唯一资源标识符 URL 唯一资源定位符

Enumeration getParameterNames()
String getParameter(String name)
可以通过一些方式 给服务器传递自定义的数据(query string、body(键值对格式))

Enumeration getHeaderNames(String name)
String getHeader(String name)
获取到请求头里的键值对Tomcat收到请求之后也会把请求头解析成Map

示例:

@WebServlet("/Reques")
public class RequesServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //将调用req的各种方法汇总到一个字符串中
        StringBuilder respBody = new StringBuilder();
        respBody.append(req.getProtocol());
        respBody.append(req.getMethod());
        respBody.append(req.getRequestURI());
        respBody.append(req.getContextPath());
        respBody.append(req.getQueryString());

        //拼接header
        Enumeration<String> headers = req.getHeaderNames();
        while (headers.hasMoreElements()){
            String header = headers.nextElement();
            respBody.append(header+":"+req.getHeader(header));
        }
        //统一返回结果
        resp.getWriter().write(respBody.toString());
    }
}

在这里插入图片描述
让网页换行显示

@WebServlet("/Reques")
public class RequesServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        //将调用req的各种方法汇总到一个字符串中
        StringBuilder respBody = new StringBuilder();
        respBody.append(req.getProtocol());
        respBody.append("<br>");
        respBody.append(req.getMethod());
        respBody.append("<br>");
        respBody.append(req.getRequestURI());
        respBody.append("<br>");
        respBody.append(req.getContextPath());
        respBody.append("<br>");
        respBody.append(req.getQueryString());
        respBody.append("<br>");

        //拼接header
        Enumeration<String> headers = req.getHeaderNames();
        while (headers.hasMoreElements()){
            String header = headers.nextElement();
            respBody.append(header+":"+req.getHeader(header));
            respBody.append("<br>");
        }
        //统一返回结果
        resp.getWriter().write(respBody.toString());
    }
}

在这里插入图片描述
相当于把http请求详情打印出来

String getParameter(String name)
如何获取到query string 和 body的数据?
示例:
获取query string

@WebServlet("/Pameter")
public class PameterServlet extends HttpServlet {
    //约定 客户端使用query string传递数据
    //例如 username=zhangsan&password=123456
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("username=" + username);
        System.out.println("password=" + password);
        resp.getWriter().write("ok!");
    }
}

在这里插入图片描述

在这里插入图片描述
获取body(只考虑form表单格式)

@WebServlet("/Pameter2")
public class Pameter2Servlet extends HttpServlet {
    //预期让客户端发出一个POST请求 同时使用form格式的数据 在body中把数据传递过来
    //body 形如:
    //username=张三&password=123
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username =req.getParameter("username");
        String password =req.getParameter("password");
        System.out.println("username="+username);
        System.out.println("password="+password);
        resp.getWriter().write("ok!");
    }
}

在这里插入图片描述
在这里插入图片描述
body为json的格式
我们要使用这种格式要用jackson jackson也是第三方库需要通过maven从中央仓库把这个库下载并导入到项目中
maven地址: https://mvnrepository.com/
在这里插入图片描述
我们在2.14版本之中选择一个

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.14.2</version>
</dependency>

添加到pom.xml文件后下载依赖
在这里插入图片描述
如果报红可以点击右侧的maven然后重新下载
在这里插入图片描述
然后我们可以使用一个ObiectMapper类的方法
把一个对象映射到JSON字符串 也可以把JSON字符串映射到对象
创建一个JsonServlet类
在这里插入图片描述

我们使用了objectMapper.readValue()这个方法将json字符串给解析成了Java对象
其中第一个参数是一个对象流 表示了json是从请求的body使用通过getInputStream得到对象 进一步的读取出来的
第二个参数 则是指定的类型 当前得到的json字符串需要转换成一个Java对象需要指定对象的类型就和上面的User类一个类型(定义一个类 让这个类里的属性的名字和类型和json字符串相匹配)
通过上面的方法就把json字符串映射成一个Java对象的过程
我们打开psotman测试

可以看到我们可以将一个json格式的body请求转换成了一个java对象
在这里插入图片描述
服务器已经顺利的把客户端发来的json格式数据给进行解析
在这里插入图片描述
readValue就把req的body的字符串给解析 然后构造了User对象

HttpServletResponse

同样也是和HTTP响应数据相匹配(状态码 各种header body)针对这些属性就可以进行"设置"
请求对象 拿到之后的目的 是为了获取里面的属性(读)
响应对象 拿到之后的目的 是为了设置里面的属性(写)
对于doXXX这样的方法 就是要根据请求计算响应
请求对象 是Tomcat收到请求之后 对http协议解析得到的对象
响应对象 是Tomcat创建空的对象 我们在代码中把响应对象的属性设置好返回给客户端

方法描述
void setStatus(int sc)设置状态码
void setHeader(String name,String value)设置一个带有给定名称的值的header 如果name已存在 则覆盖旧的值
void addHeader(String name,String value)添加一个带有给定名称和值的header 如果name已存在 不覆盖旧的值 并添加新的键值对
void setContentType(String type)设置被发送到客户端的响应的内容类型
void setCharacterEncoding(String charset)设置被发送到客户端的字符编码(MIME字符集)例如 UTF-8
void sendRedirect(String location)使用指定的重定向位置URL 发送临时响应到客户端
PrintWriter()用于往body中写入文本格式数据
OutputStream getOutputStream()用于往body中写入二进制格式数据

注意:
使用了addHeader haeder中就可能出现key相同的两个键值对

设置状态码示例:
将状态码设置成200
在这里插入图片描述
在这里插入图片描述
设置成500
在这里插入图片描述
在这里插入图片描述
设置成404
在这里插入图片描述
在这里插入图片描述

设置响应报头示例:
此处通过refresh属性设置浏览器自动刷新(每隔两秒返回一个时间戳)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
让页面重定义到百度主页

在这里插入图片描述

我们打开抓包工具八爪鱼
然后浏览器输入
在这里插入图片描述
就会自动跳转到百度网页
在这里插入图片描述
从八爪鱼可以看出我们的浏览器先访问了这一个url然后才跳转百度网页
在这里插入图片描述
浏览器看到开头请求的两个字段就知道要跳转到百度了
在这里插入图片描述
301是永久重定向
302是临时重定向
或者使用 resp.sendRedirect(“https://www.baidu.com”);一次性把两个步骤合到一起

在这里插入图片描述

让服务器返回一个html数据
在这里插入图片描述
浏览器看到的是
在这里插入图片描述
这是因为在IDEA里的中文字符串一般都是utf8的编码
浏览器会跟随系统的编码windows简体中文版本默认的编码是gbk 使用要按照gbk的方式匹配
我们就可以使用

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

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

攻防世界WEB新手训练区

view_source 此题我愿称之为网安领域的hello world 查看网页源代码的方式一般有—— 右键->查看网页源代码F12->源代码/来源Ctrlu 随后可以再代码第17行处找到flag&#xff0c;至此迈入网安第一步。可喜可贺&#xff0c;可喜可贺... get_post 考察http的两种请求方式&…

【大数据面试题】HBase面试题附答案

目录 1.介绍下HBase 2.HBase优缺点 3.介绍下的HBase的架构 4.HBase的读写缓存 5.在删除HBase中的一个数据的时候&#xff0c;它是立马就把数据删除掉了吗? 6.HBase中的二级索引 7.HBase的RegionServer宕机以后怎么恢复的? 8.HBase的一个region由哪些东西组成? 9.…

论述Python中列表、元组、字典和集合的概念

Python列表是用于存储任意数目、任意类型的数据集合&#xff0c;包含多个元素的有序连续的内存空间&#xff0c;是内置可变序列&#xff0c;或者说可以任意修改。在Python中&#xff0c;列表以方括号&#xff08;[ ]&#xff09;形式编写。 Python元组与Python列表类似&#x…

oak-d-lite摄像头 去噪处理

前言 试过了各种滤波才知道&#xff0c;为啥oak在示例算法只是使用5X5滤波而不使用更好的滤波的原因了。 实验内容 oak-d-lite使用的工业相机噪声主要表现为随机的亮度变化&#xff0c;使用Non-Local Means Denoising算法后去噪效果很好&#xff08;左为原图&#xff09;&…

3D建模素材网站的特点有哪些?

3D建模素材网站的特点主要包括丰富多样的模型种类、高质量的模型、实时预览功能、易于使用、价格合理以及社区互动等。这些特点使得3D建模素材网站成为设计师们不可或缺的资源之一&#xff0c;帮助他们快速高效地完成设计工作。 那么3D建模素材网站的特点有哪些? 1、模型种类丰…

【复现】Laykefu客服系统后台漏洞合集_29

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 2. 漏洞二&#xff1a; 3. 漏洞三&#xff1a; 4. 漏洞四&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Laykefu客服系统是thinkphp5Gatewayworker搭建的web客服…

「QT」QString类的详细说明

✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「

契约锁高校行业电子签应用报告

高校数字化建设起步早&#xff0c;也是电子签章应用最为广泛的行业之一。为了及时为高校组织提供服务参考&#xff0c;契约锁整合了近年在高校行业的方案、场景、案例等资源生成“高校电子签应用报告”&#xff0c;随时为数字化校园建设助力。 高校电子签建设所需资料都在这 整…

ps---1.使用置入嵌入的智能化对象命令制作拼贴画

ps—使用置入嵌入的智能化对象命令制作拼贴画 素材 步骤 打开背景图 置入嵌入对象&#xff08;置入完&#xff0c;移动到正确的位置&#xff0c;回车或双击&#xff09; 栅格化图层 重复上述步骤制作拼贴画

图像读写(imgcodecs 模块)与视频读写

内置格式 OpenCV 可以在没有任何第三方库帮助的情况下读取以下格式&#xff1a; BMP的 高动态范围 (WITH_IMGCODEC_HDR) 太阳栅格 (WITH_IMGCODEC_SUNRASTER) PPM、PGM、PBM、PFM&#xff08;、WITH_IMGCODEC_PXMWITH_IMGCODEC_PFM) PNG、JPEG、TIFF、WEBP 支持 格式选择…

[SUCTF 2019]CheckIn1

黑名单过滤后缀’ph&#xff0c;并且白名单image类型要有对应文件头 对<?过滤&#xff0c;改用GIF89a<script languagephp>eval($_POST[cmd]);</script>&#xff0c;成功把getshell.gif上传上去了 尝试用.htaccess将上传的gif当作php解析&#xff0c;但是失败…

Flask 之旅 (二):表单

背景 上一篇帖子我们使用 Flask 创建了最基本的 web 服务。使用 bootstrap 对页面进行装点&#xff0c;使用 JQuery Ajax 实现了在页面上实时显示 log 的功能。趁着周末&#xff0c;我继续开始学习更多的东西以满足这个 web 服务的需求。 模板继承 之前我们有了首页&#xf…

多线程-单例模式

目录 1.单例模式 举例&#xff1a; 1.1单例模式的实现 饿汉模式&#xff1a; 懒汉模式&#xff1a; 1.单例模式 单例模式是一种设计模式。单例模式能保证某个类在程序中只存在唯⼀⼀份实例, ⽽不会创建出多个实例. 举例&#xff1a; package 多线程;import javax.manage…

Django从入门到精通(三)

目录 七、ORM操作 7.1、表结构 常见字段 参数 示例 7.2、表关系 一对多 多对多 第一种方式 第二种方式 7.3、连接MYSQL 7.4、数据库连接池 7.5、多数据库 读写分离 分库&#xff08;多个app ->多数据库&#xff09; 分库&#xff08;单app&#xff09; 注意…

微服务入门篇:Eureka注册中心(作用,搭建Eureka客户端和服务端)

目录 1.提供者与消费者2.Eureka的作用3.搭建EurekaServer1.配置服务端2.配置客户端3.复制实例操作4.服务拉取 1.提供者与消费者 ①服务提供者:一次业务中&#xff0c;被其它微服务调用的服务。&#xff08;提供接口给其它微服务) ②服务消费者:一次业务中&#xff0c;调用其它微…

【机器学习】全网最全模型评价指标(性能指标、YOLOv5训练结果分析、轻量化指标、混淆矩阵详解)【基础收藏】

&#x1f951; Welcome to Aedream同学 s blog! &#x1f951; 文章目录 模型性能指标常见指标ROC/AUCROC & PRC多分类问题——混淆矩阵 计算结果分析——以YOLO v5为例1. confusion_matrix.png(混淆矩阵)2. F1_curve&#xff1a;3. labels.jpg4. labels_corrrelogram.jpg5…

【unity实战】实现蓄力丢手榴弹、烟雾弹、燃烧弹的效果

文章目录 爆炸燃烧烟雾效果资产手榴弹丢手雷烟雾弹、燃烧弹实现手雷每次撞墙弹发出音效&#xff08;补充&#xff09;完结 爆炸燃烧烟雾效果资产 https://assetstore.unity.com/packages/vfx/particles/war-fx-5669 手榴弹 手榴弹配置好刚体&#xff0c;碰撞体 新增脚本Th…

Dify学习笔记-工具(七)

1、工具 工具定义 工具可以扩展 LLM 的能力&#xff0c;比如联网搜索、科学计算或绘制图片&#xff0c;赋予并增强了 LLM 连接外部世界的能力。Dify 提供了两种工具类型&#xff1a;第一方工具和自定义工具。 你可以直接使用 Dify 生态提供的第一方内置工具&#xff0c;或者轻…

Likeshop多商户商城源码系统,支持二开

在电商行业高速发展的当下&#xff0c;拥有一套功能强大、易于操作的开源商城系统至关重要。Likeshop多商户商城系统正是这样一款集H5、小程序、独立APP于一体的开源电商解决方案&#xff0c;助力商家实现智能营销。 一、产品简介 Likeshop多商户商城系统为商家提供了丰富的营…

广州市荔湾区区长谭明鹤、广州工控副总经理张劲泉一行莅临上海毅速考察交流

2024年1月23日&#xff0c;广州市荔湾区区长谭明鹤、副区长阮伟致、广州工业投资控股集团有限公司&#xff08;简称&#xff1a;广州工控&#xff09;副总经理张劲泉等一行来到毅速公司上海总部考察交流。毅速公司董事长张占波、总经理陈烨、常务副总经理王利军等亲切接待了考察…
最新文章