【JavaEE】【Servlet API详解】重点!!!

news2024/11/19 19:39:06

努力经营当下,直至未来明朗!

文章目录

  • 【Servlet API概述】
  • 【HttpServlet】
  • 【HttpServletRequest】
  • 【HttpServletResponse】
  • 写例子:表白墙
    • 表白墙参考代码
  • 小结


坚持一定很酷!

【Servlet API概述】

  1. API其实就是一组类/方法
  2. Servlet提供的类和方法很多,但是最主要就使用三个:
    ① HttpServlet: (继承)1

② HttpServletRequest:(方法参数)
③ HttpServletResponse:(方法参数)
2
(HttpServletRequest、HttpServletResponse中的方法都是和http报文格式有关的)


【HttpServlet】

  1. 核心方法
    3
    1)init:创建出HttpServlet实例会调用一次,其作用其实就是用来初始化。一般就是首次访问的时候会被实例化。
    2)destroy:不一定能够调用到。因为HttpServlet不再调用其实就是在tomcat关闭时,关闭tomcat有两种方法:
    ① 直接杀进程:如点击idea中的红色方框、cmd直接点击x、通过任务管理器结束进程等,此时destroy无法被调用。
    8005端口是用来控制tomcat的,通过该端口给tomcat发送一个关闭操作,此时tomcat就可以正常关闭,也就能够调用destroy了。

(工作中最常用的其实就是直接杀进程方式关闭,所以不太会调用到destroy方法)

3) service:tomcat收到请求之后实际上是先调用service方法,在service中根据方法来调用不同的doXXX方法。(实际开发中其实很少会重写service,重写doXXX方法就够了)

  1. 面试题】谈谈Servlet的生命周期?
    生命周期:其实就是正确的时间干正确的事儿。
    也就是回答:Servlet中有三个主要的方法:init、destroy、service,以及何时被调用:init在servlet被实例化的时候调用一次,destroy是在servlet销毁之前调用一次,service是每次收到请求调用(两次)。
    (调用两次service原因:两次service)

【HttpServletRequest】

  1. 核心方法:
    30

  2. 写一个测试代码:
    10
    11
    (枚举类型是不可以通过下标访问和修改的)

  3. 如果不写content type,此时浏览器就不知道body是啥格式,就会去猜;但是一般不要让浏览器去猜,而是直接setContentType

body格式如:
tect/plain(纯文本)、text/html、 text/css、 application/js、 application/json、 image/png 等

  1. 还有一个重要场景就是:使用api获取到请求中的重要参数(query string中的值 以及 body中的值)
    对于query string来说,核心方法就是 getqueryString

1)实例:
31

(在服务器中打印)
32

(在浏览器中打印)
33

此时:浏览器没有正确识别出中文,当前不是没有urlencode的缘故(因为服务器这里的打印结果是正确的);但是返回的响应页面浏览器没能正确识别,为了让浏览器能够识别,需要显式在响应上加上content type。
35

注意:即使在地址栏输入的是encode的内容,但是servlet getParameter会自动的针对urlencode的结果进行decode,不需要我们手动处理

  • getParameter获取键值对的时候,如果是键key不存在,得到的就是null;如果是键存在、值不存在,得到的就是” ”;如果key、value都不存在,得到的也是null。

2)POST实例:
如果请求是post,如何获取到body中的参数?

A. 请求的body是x-www-form-urlencode 的 form表单形式:
这里也是使用getParameter来获取的。
但是post请求不是直接在地址栏输入就可以的,需要构造请求:
① 这里可以使用第三方工具postman来构造请求:构造完成后直接点send就可以看到结果
(postman也是http客户端,其地位和浏览器是对等的)
36

② 还可以搞个html页面,通过form表单发送请求。
(注:html创建是在webapp下,不是WEB-INF下!! new file)
(如果在idea中不好写代码,就切到vscode中写代码)

37
(一定要注意这里的路径:不是webapp,而是servl,之前在idea tomcat上设定的context path!!)

在提交之后可以在fiddler中看到body信息,也就是post请求构造成功。

(body中被form表单自动urlencode了)
38
(post请求路径)
39

(form表单类型)
40

虽然已经显式地告诉了浏览器响应的编码方式,但是响应页面依旧是乱码:
41

查看发现服务器中也是乱码:
42

说明:服务器在针对请求进行解析的时候就已经乱码了。所以:需要显式地告诉servlet应该按照哪种编码来理解请求的body。
所以:给请求也设置编码方式:
43

  • 【请求处设置的utf8是告诉servlet(tomcat)如何解析;响应处设置的utf8是告诉浏览器如何解析】

响应这里设置字符集有两种写法:setContentType 以及 setCharacterEncoding,但是还是建议使用setContentType完整写法;
设置的字符集只是其中一部分,还需要设置格式。

【补充】

“爬虫”:其实就是一个HTTP客户端,是自己写的。能在浏览器中做的一切操作,理论上都是可以用爬虫来实现的。
(90%的爬虫都是违法的。服务器承受的请求压力是有限的,爬虫其实属于无效访问,还白白增大了服务器的压力,容易把别人的服务器搞挂了;另外,可能会涉及别人的隐私信息。(很多网站都是有反爬策略))

【注意】
43
顺序不能颠倒。务必要保证先设置所有的header,最后再设置body(servlet的坑)。
即:先格式 后写入!!

B. 请求的body是json:(使用 {键值对,} 构成的)

① 需要先读取body中的内容,使用getInputStream来读取流对象,然后再进一步来读取流对象。

② 如何解析json格式?
Servlet没有内置json解析,所以我们就使用第三方库。市面上很多第三方库如fastjson、jackson、gson等,但是我们主要使用的是jackson,因为jackson是Spring御用的json库。

③ 使用中央仓库maven(中央仓库)下载安装jackson:选择databind -> 随便选择一个版本(此时我选2.13.4.1)-> 复制如下图maven中内容 -> 拷贝到pom.xml中(依旧是dependecies中)-> 如果标红,就进行刷新操作
45
46

④ 其实使用jackson非常方便,掌握一个类两个方法就行:

ObjectMapper类:
① readValue方法:把JSON格式的数据转为java的对象
②writeValueAsString方法:把java对象转成jjson格式的字符串

【readValue方法:第一个参数可以是字符串,也可以是输入流; 第二个参数是获取类对象(类似于反射),也就是要解析出来的结果的对象的类】
47

【重点理解】

① 读取输入流,获取到要解析的字符串
② 把字符串按照json格式进行解析,得到一组键值对(Map)
③ 根据类对象创建一个实例
④ 遍历类对象中属性的名字,拿着名字去与上述Map中查询匹配,将匹配到的value赋值到对应对象的属性中去
⑤ 返回这个构造完成的对象。
(要求:json键值对中 键 的名字/类型要和类的 属性 一一对应

【注】

① 要实现java对象就要有java类,而类中的属性务必是public或者是带有public的getter/setter ,否则json无法访问该对象的属性。
② 另外,该类必须有无参版本的构造方法,如果不写任何构造方法,编译器能够自动生成无参的构造方法。(但是一旦写了有参的构造方法,就一定要自己手动写无参的构造方法)

在postman中构造post请求时,json格式设置方法如下:

49
50
在postman中写json格式的时候,务必要保证这里的key是带引号的!正常的json中key都是要带引号的! (但是js里的对象是不带的

具体参考代码:JsonServlet


【HttpServletResponse】

  1. 核心方法:
    50

注:HttpServletRequest方法一般是get系列,而HttpServletResponse方法一般是set系列:因为doGet/doPost等这样的方法中的HttpServletResponse对象就是空对象,需要往里面写入数据

  1. 举个例子:
    1) 设置不同的状态码:
    (代码:StatusServlet)
    这些状态码具体怎么处理(前端页面显示啥)都是由程序员自定义的。

2) 设置响应的header:
通过这个实现页面的自动刷新:header设置refresh属性,值是一个秒数。
在进行刷新时,刷新时间总是会比设定的时间稍多一些,理由:

① 进程调度消耗时间
② 网络传输消耗时间
③ 服务器响应消耗时间

(代码:AutoRefreshServlet)

3)构造重定向响应(3开头系列):
(代码:RedirectServlet 没有referer的)


写例子:表白墙

  1. 之前写的表白墙,其内容只是在内存中存在(List保存),一旦刷新之后内容就丢失。
  2. 此时需要让用户留言的数据能够在服务器这儿保存,保证页面即使关闭之后数据也不会丢失!此时就可以保证页面加载数据时是从服务器这儿加载数据的,之前留言的内容不会丢失。

1)准备工作:创建maven项目MessageWall,引入依赖,创建目录结构

2)设计前后端如何交互:前端啥时候给后端发请求,发的请求是啥样的,返回的响应是啥样的。

① 在表白墙中,希望点击提交之后数据能够在服务器中保存(存档);
② 当关闭页面再重新启动/刷新之后,需要从服务器获取到之前保存过的数据并在页面上进行显示(读档)

【客户端和服务器的交互是根据业务需求的】

3)理清请求和响应的细节。
① 发送数据给服务器:
51

接口约定的方式是无穷的,必须要确定一个唯一方案,这样前后端才可以配合开发。

②从服务器获取到已经保存的数据:
52

4)开发后端和前端代码

① 前端代码是在webapp目录底下! 然后使用vscode打开并操作
② 注意:将资源都放到webapp下,包括写Servlet,其实编译之后的.class文件也是在webapp底下的;webapp就描述了当前网站的Context Path。

53

55
(发送请求:前端代码,前面还加了一个script 引入jquery)

③ 页面进行加载的时候就需要进行“读档”操作:直接写在script标签中的代码都是在页面加载的时候执行的

④ 注:smart tomcat 会把一部分内存中的数据保存下来,后续重启服务器的时候数据就会恢复回来。

【注意:请求、响应过程!】

web程序一旦出现问题,起手式就是“抓包”,通过抓包确定是前端问题还是后端问题。


5)需要让数据在数据库中持久化保存:jdbc编程
① 在中央仓库搜索mysql:
58

② 选择5.1.49版本,复制代码并粘贴到pom.xml的dependencies中

③ 设计数据库表结构:几张,表里有哪些

本表白墙中只需要一张表message,列:from、to、message(id可以没有)

在cmd中操作:首先 目录要cd到mysql.exe所在的目录,然后输入mysql -u root -p进入数据库(也可以直接使用mysql client)

59此时建表成功(注意关键字要加上``)

④ 此时重新修改后端代码,直接保存在数据库中。
记忆数据库操作代码


6)DataSource存在多份,这不太合理,所以使用单例模式对DataSource进行封装。
① 单例模式:只创建一个实例!
② 一般由两种模式:懒汉模式和饿汉模式,一般更倾向于使用懒汉模式。
懒汉模式涉及到一个线程安全问题。

③ 所以考虑:Servlet代码中是否涉及到多线程/线程安全问题?

① Servlet写的是一个服务器,同一时刻可能要处理多个客户端的请求。
② 一旦同时有多个客户端都发来请求,服务器就势必要同时处理多个请求。Tomcat内部正是使用了多线程的方式来处理的。
③ 则:Servlet代码中涉及到多线程/线程安全问题。


表白墙参考代码

参考代码:表白墙


小结

  1. HttpServlet
    ① doXXX:处理哪种http请求会调用的对应的方法
    ② init/destroy/service:Servlet的生命周期

  2. HttpServletRequest:HTTP请求,get系列方法
    可以获取到以下信息:
    协议名(版本号)、URL、query string、header、query string/body的键值对等

  3. HttpServletResponse:HTTP响应,set系列方法
    可以设置以下信息:
    状态码、各种header、body等

  4. 表白墙代码:主要注意 mysql +单例模式(线程安全)

yyy

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

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

相关文章

CANoe-VN5000设备的指示灯含义

我们以VN5650为例: Power 当设备通电时,Power灯亮起 Sync 当设备同步时,Sync灯亮起。Vector设备有三种时间同步方式:PTP、HW-SYNC、SW-SYNC ColorSync StateDescriptionOffNot Configured此设备没有激活的主协议或从协议,或者尚未加载配置OrangeConfigured, waiting for …

Redis布隆过滤器

什么是布隆过滤器 布隆过滤器(Bloom Filter)是一个二进制向量和一系列随机映射函数实现,用于判断一个元素是否在集合中。 如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等…

Three JS 调研

0. 结论 three.js是使用WebGL来绘制三维效果的,核心数据是3D对象和三维模型,更多的是关注如何通过webgl更精细而美的渲染数据 three.js相当于封装了webgl,但还是很底层,并不是一个类似于cesium或者mapbox这样的成熟地图框架&…

一文掌握MyBatis的动态SQL使用与原理

摘要:使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。本文分享自华为云社区《MyBatis详解 - 动态SQL使用与原理》,作者:龙哥手记 。 动态 …

Ajax(JavaWeb-Ajax、跨域等)

1.JavaWeb - Ajax 概念:AJAX(Asynchronous Java JavaScript And Xml ):异步的JavaScript和Xml AJAX作用: 与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应的数据。 使用…

笔试训练(6)

笔试题1:将一个字符串转化成整数:把字符串转换成整数__牛客网 将一个字符串转化成整数,要求不能使用字符串转化成整数的库函数,数值为0或者字符串不是一个合法的数值那么返回0 输入描述:输入一个字符串,包含数字字母符号,可以为空…

【八股文大白话整理】

Java 重载和重写的区别 这两个都是多态的一种表现形式。 重载是在编译器通过方法中形参的静态类型确定调用方法版本的过程,是多态在编译期的表现形式。判定只有两个条件:1. 方法名一致 2. 形参列表不同 重写是在方法运行时,通过调用者的实际…

Transforming the Latent Space of StyleGAN for Real Face Editing翻译

点击下载论文 摘要 尽管最近在使用StyleGAN进行语义处理方面取得了进展,但真实人脸的语义编辑仍然具有挑战性。W空间和W空间之间的差距要求在重构质量和编辑质量之间进行权衡。为了解决这个问题,我们建议通过用基于注意力的transformers替换StyleGAN映射…

深入剖析Arthas源码

一. 前言 Arthas 相信大家已经不陌生了,肯定用过太多次了,平时说到 Arthas 的时候都知道是基于Java Agent的,那么他具体是怎么实现呢,今天就一起来看看。 首先 Arthas 是在 GitHub 开源的,我们可以直接去 GitHub 上获…

智能表格软件-FineReport JS实现自定义按钮快速给参数赋指定范围值

1. 概述 1.1 预期效果 周报、月报、季报、年报中有参数查询时,每次都需要手动选择,比较繁琐,所以就需要一种快速筛选的方法,只需点击某个按钮,就能准确定位到合适的时间范围,如下图所示: 1.2 实…

JMeter+Ant+Jenkins接口自动化测试框架

一:简介 大致思路:Jmeter可以做接口测试,也能做压力测试,而且是开源软件;Ant是基于Java的构建工具,完成脚本执行并收集结果生成报告,可以跨平台,Jenkins是持续集成工具。将这三者结合起来可以搭…

Hive+Spark离线数仓工业项目实战--环境构建(3)

项目环境配置 根据需求实现项目环境配置 实施 - 注意:所有软件Docker、Hadoop、Hive、Spark、Sqoop都已经装好,不需要额外安装配置,启动即可 配置网络:如果你的VM Nat网络不是88网段,请按照以下修改 - 修改Linux虚拟…

数据改版 | CnOpenData中国工业企业基本信息扩展数据

CnOpenData中国工业企业基本信息扩展数据 一、数据简介 拉动中国经济的三个产业中,工业企业占有特殊的地位,是推动国内经济发展的重要产业。工业是最主要的物质生产部门,为居民生活、各行业的经济活动提供物质产品,这一重要作用是…

vm虚拟机安装VMware Tools弹出‘安装程序无法自动安装

问题出现原因 这个问题是由于微软从2019年12月3日已将Windows驱动程序签名更改为使用SHA-2算法, 不支持SHA-2代码签名的旧版Windows系统将无法通过驱动程序签名验证。 也就是说你的win7或者Windows Server 2008 系统中缺少使用新算法的签名,原来的SHA-…

数据库如何加密连接

文章目录1. 前言2. 如何加密?3. 使用Druid实现加密4. 生成密文5. 添加加密配置6. 隐藏问题7. 开发环境替换公钥8. 生产环境替换公钥9. 运行原理10. 总结1. 前言 现在无论是公司的项目还是个人的项目,都会选择将源码托管在Git服务器(Gitee&am…

熬不过“冬天”,又一跨境电商平台关停

熬不过“冬天”!又一跨境电商平台关停据相关媒体报道,京东旗下跨境电商服务平台Joybuy于2022年11月4日宣布将进行“业务升级”,而后该平台的所有交易活动已经停止。据Egain News报道,“业务升级”的说法很大可能只是关停的一种“委…

【JavaEE】Cookie 和 Session

努力经营当下,直至未来明朗! 文章目录【Cookie和Session】相关方法1. HttpServletRequest类的相关方法2. HttpServletRespon类的相关方法3. HttpSession类中相关的方法:4. Cookie类中相关的方法:写一个模拟登录的案例上传文件Serv…

开源工具系列1:Cloud Custodian

对云安全的检测中,最重要的一个组成部分就是对配置的验证,今天来介绍一个开源的规则检测引擎项目,Cloud Custodian。 一、Cloud Custodian 是什么 Cloud Custodian 是用于管理公有云帐户和资源的规则引擎。规则策略用简单的 YAML 格式&#x…

【TypeScript】class类型讲解

目录 class类型 构造函数 class类的继承 可见修饰符 只读修饰符 class类型 TypeScript支持ES引入的class关键字,并为其添加了类型注解和其他语法(例如:可见性修饰符)。 class person {// 声明初始值,可省略类型注解(TS类型推论为strin…

艾美捷超氧化物歧化酶检测试剂盒,活性检测说明

细胞和细胞外环境中大量的超氧化物歧化酶(SOD)对于预防与氧化应激相关的疾病至关重要。SOD突变约占家族性肌萎缩侧索硬化症(ALS)病例的20%。SOD在预防其他神经退行性疾病(如阿尔茨海默氏症、帕金森氏症和亨廷顿舞蹈症&…