Servlet深入解读,有你想知道的! servletdemo
yuyutoo 2024-11-05 13:26 5 浏览 0 评论
什么是servlet?
Servlet是基于Java技术的web组件,容器托管的,用于生成动态内容。像其他基于Java的组件技术一样,
Servlet也是基于平台无关的Java类格式,被编译为平台无关的字节码,可以被基于Java技术的webserver
动态加载并运行。容器(平时我们所使用的tomcat就是其中一种servlet容器),有时候也叫做servlet引擎,是webserver为支持servlet功能扩展的部分。客户端
通过Servlet容器实现的请求/应答模型与Servlet交互。
servlet如何处理一个客户端请求?
servlet的生命周期?
servlet按照一个严格定义的生命周期被管理,该生命周期包括:如何被加载?实例化?初始化?处理客户端请求?何时结束服务?
该生命周期可以通过Servlet接口中的API来表示:init、service、destroy
加载和实例化阶段
servlet容器负责加载和实例化servlet,加载和实例化可以发生在容器启动时,或者延迟初始化直到容器有请求需要处理时。(通过开发者配置来确定)
初始化阶段
servlet容器必须在处理客户端请求之前,对servlet实例进行初始化(即调用Servlet.init接口)。可以完成一些读取持久化配置数据、初始化资源等一次性的动作。
处理客户端请求
完成初始化之后,servlet容器可以使用该servlet来处理客户端请求。(容器通过开发者的配置,即servlet-mapping来寻 找适合当前请求的servlet)客户端请求由ServletRequest类型来封装表示、Servlet响应由ServletResponse类型来 封装表示。这两个类型的对象都由容器进行实例化,在调用Servlet处理客户端请求时传递给Servlet的service方法。在Http请求的场景 下,容器提供的实现对应为HttpServletRequest、HttpServletResponse。一个servlet实例应对多个客户端请求的 情况,导致了我们需要在处理请求时保证线程安全。
servlet技术中的其他组件?
在servlet技术中,除了Servlet接口用于处理请求这个组件接口外,还存在Filter、Listener这两个重要的组件接口。
其中Filter是一种代码重用的技术,运行运行过程中改变进入资源的请求和资源返回的响应中的有效负载和header信息。即可以在分发请求给 servlet处理之前对请求进行拦截,之后再servlet完成处理,返回响应后对响应进行拦截。可以用于日志记录、验证等需求。
和servlet生命周期一样,应用同样存在生命周期。监听应用生命周期事件可以让开发人员更好的控制ServletContext、 HTTPSession和ServletRequest的生命周期,可以更好的进行代码分解。Servlet事件监听器支持在 ServletContext、HTTPSession和ServletRequest状态改变时进行事件通知。
Filter
实现自己的Filter可以通过实现接口javax.servlet.Filter来完成,之后通过web.xml或者注解配置到Servlet容器中,让容器在处理请求时应用此时配置的Filter
Listener
Listener的种类可以分为:
ServletContext相关
- ServletContextListener,spring中利用该监听器初始化web应用
- ServletContextAttributeListener
HttpSession相关
- HttpSessionListener
- HttpSessionAttributeListener
- HttpSessionIdListener
- HttpSessionActivationListener
- HttpSessionBindingListener,这个监听器跟HttpSessionAttributeListener有点类似, 但是HttpSessionAttributeListener是针对所有 HttpSession#setAttribute.setAttribute(key, value)而言的,value可以是任意值,并且通过@WebListener注册到容器。而HttpSessionBindingListener是 针对HttpSession#setAttribute.setAttribute(key, value),当value为HttpSessionBindingListener的实现类实例才会调用事件方法,无需通过@WebListener配 置到容器
ServletRequest相关
- ServletRequestListener
- ServletRequestAttributeListener
- AsyncListener,监听异步事件,超时、连接终止、完成异步处理
如何映射请求到servlet?
URL路径映射优先级
在收到客户端请求时,web容器确定转发到哪个web应用(获取servlet上下文路径),之后用于映射到servlet的路径是请求对象的请 求URL减去上下文和路径参数部分,之后应用以下步骤来找出servlet来处理请求,短路原则,一旦找到匹配的servlet,之后的步骤直接跳过
- 精确匹配
- 容器递归地尝试匹配最长路径前缀,用”/“字符作为路径分隔符,最长匹配确定选择的servlet
- 如果URL最后一部分包含一个扩展名,servlet容器将试图匹配为扩展名处理请求的servlet。
- 如果前三个原则都无法找出一个servlet来处理请求,则交给”default”servlet来处理,即servlet-mapping为”/“的servlet。
配置Listener、Filter、Servlet
使用注解的方式来配置容器,下面看看如果使用:
- @WebListener来配置Listener
- @WebServlet配置Servlet
- @WebFilter配置Filter
通过注解@WebListener,结合ServletContext编程式API来注册Servlet、Filter、Listener
通过@WebListener注解配置ServletContextListener实现类,在容器初始化servlet上下文时,调用ServletContext的API来注册
利用基于SPI机制的ServletContainerInitializer来初始化容器
- 实现接口ServletContainerInitializer,用@HandlesTypes注解在类级别上指定初始化类
- 在META-INF/services/javax.servlet.ServletContainerInitializer文件中指定实现类
- 完成以上两步之后,容器在启动时,将回调实现类的public void onStartup(Set<Class<?>> c, ServletContext ctx)方法,参数是容器为我们收集的在classpath下所有HandlesTypes注解指定的类。具备了这些条件,我们就可以在该方法中,调用这 些类来初始化容器了(映射servlet、配置filter、配置Listener等等)
为什么可以使用注解直接来配置Listener、Filter、Servlet,又提供了ServletContainerInitializer这种初始化容器的机制?
- 使用注解的方式,不可避免的需要扫描所有classpath下的所有类,为了提高启动速度采用ServletContainerInitializer机制
- 如果部署的应用中,存在web.xml(部署描述文件,在servlet2.5之前必须存在)。如果web.xml文件中指定了 metadata-complete=”true”时,将不会启用注解扫描的配置方式。为了兼容性,提倡使用 ServletContainerInitializer机制来初始化容器。(这也是spring的做法)
springMVC是如何应用servlet技术的
在spring中利用基于SPI机制的ServletContainerInitializer来初始化容器,具体实现方式是:
1.类SpringServletContainerInitializer实现了接口 ServletContainerInitializer,并指定了WebApplicationInitializer作为初始化类 (AbstractAnnotationConfigDispatcherServletInitializer作为其便利的抽象类,开发者可以继承该类 作为初始化容器的配置类)。如:
2.spring中利用监听器ServletContextListener初始化web应用的父ApplicationContext
总结
这篇文章中梳理了Servlet中的常用技术,主要涉及Servlet、Filter、Listener的知识点和配置细节。之后引申出 springMVC是如何利用这些知识点来构建一个web框架的。servlet作为java web开发中的基石是每个开发者都必须掌握的技能。
喜欢的小伙伴,点个关注吧!
相关推荐
- 全局和隐式 using 指令详解(全局命令)
-
1.什么是全局和隐式using?在.NET6及更高版本中,Microsoft引入了...
- 请停止微服务,做好单体的模块化才是王道:Spring Modulith介绍
-
1、介绍模块化单体是一种架构风格,代码是根据模块的概念构成的。对于许多组织而言,模块化单体可能是一个很好的选择。它有助于保持一定程度的独立性,这有助于我们在需要的时候轻松过渡到微服务架构。Spri...
- ASP.NET程序集引用之痛:版本冲突、依赖地狱等解析与实战
-
我是一位多年后端经验的工程师,其中前几年用ASP.NET...
- .NET AOT 详解(.net 6 aot)
-
简介AOT(Ahead-Of-TimeCompilation)是一种将代码直接编译为机器码的技术,与传统的...
- 一款基于Yii2开发的免费商城系统(一款基于yii2开发的免费商城系统是什么)
-
哈喽,我是老鱼,一名致力于在技术道路上的终身学习者、实践者、分享者!...
- asar归档解包(游戏arc文件解包)
-
要学习Electron逆向,首先要有一个Electron开发的程序的发布的包,这里就以其官方的electron-quick-start作为例子来进行一下逆向的过程。...
- 在PyCharm 中免费集成Amazon CodeWhisperer
-
CodeWhisperer是Amazon发布的一款免费的AI编程辅助小工具,可在你的集成开发环境(IDE)中生成实时单行或全函数代码建议,帮助你快速构建软件。简单来说,AmazonCodeWhi...
- 2014年最优秀JavaScript编辑器大盘点
-
1.WebstormWebStorm是一种轻量级的、功能强大的IDE,为Node.js复杂的客户端开发和服务器端开发提供完美的解决方案。WebStorm的智能代码编辑器支持JavaScript,...
- 基于springboot、tio、oauth2.0前端vuede 超轻量级聊天软件分享
-
项目简介:基于JS的超轻量级聊天软件。前端:vue、iview、electron实现的PC桌面版聊天程序,主要适用于私有云项目内部聊天,企业内部管理通讯等功能,主要通讯协议websocket。支持...
- JetBrains Toolbox推出全新产品订阅授权模式
-
捷克知名软件开发公司JetBrains最为人所熟知的产品是Java编程语言开发撰写时所用的集成开发环境IntelliJIDEA,相信很多开发者都有所了解。而近期自2015年11月2日起,JetBr...
- idea最新激活jetbrains-agent.jar包,亲测有效
-
这里分享一个2019.3.3版本的jetbrains-agent.jar,亲测有效,在网上找了很多都不能使用,终于找到一个可以使用的了,这里分享一下具体激活步骤,此方法适用于Jebrains家所有产品...
- CountDownTimer的理解(countdowntomars)
-
CountDownTimer是android开发常用的计时类,按照注释中的说明使用方法如下:kotlin:object:CountDownTimer(30000,1000){...
- 反射为什么性能会很慢?(反射时为什么会越来越长)
-
1.背景前段时间维护一个5、6年前的项目,项目总是在某些功能使用上不尽人意,性能上总是差一些,仔细过了一下代码发现使用了不少封装好的工具类,工具类里面用了好多的反射,反射会影响到执行效率吗?盲猜了一...
- btrace 开源!基于 Systrace 高性能 Trace 工具
-
介绍btrace(又名RheaTrace)是抖音基础技术团队自研的一款高性能AndroidTrace工具,它基于Systrace实现,并针对Systrace不足之处加以改进,核心改进...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- .NET 奇葩问题调试经历之3——使用了grpc通讯类库后,内存一直增长......
- 全局和隐式 using 指令详解(全局命令)
- 请停止微服务,做好单体的模块化才是王道:Spring Modulith介绍
- ASP.NET程序集引用之痛:版本冲突、依赖地狱等解析与实战
- .NET AOT 详解(.net 6 aot)
- 一款基于Yii2开发的免费商城系统(一款基于yii2开发的免费商城系统是什么)
- asar归档解包(游戏arc文件解包)
- 在PyCharm 中免费集成Amazon CodeWhisperer
- 2014年最优秀JavaScript编辑器大盘点
- 基于springboot、tio、oauth2.0前端vuede 超轻量级聊天软件分享
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)