导图社区 Servlet
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
编辑于2022-09-26 20:58:14 四川省listener 音标['lisnә] 读音 汉语翻译 n. 收听者, 听众 英语解释: 名词listener: someone who listens attentively 同义词:hearer, auditor, attender
Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。 1、Filter快速入门 1.1、步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方法 d...
会话的解释 [conversation] 指两人以上的对话(多用于学习别种语言或方言时) 详细解释 (1).聚谈;对话。现多用于学习别种语言或方言时
社区模板帮助中心,点此进入>>
listener 音标['lisnә] 读音 汉语翻译 n. 收听者, 听众 英语解释: 名词listener: someone who listens attentively 同义词:hearer, auditor, attender
Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。 1、Filter快速入门 1.1、步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方法 d...
会话的解释 [conversation] 指两人以上的对话(多用于学习别种语言或方言时) 详细解释 (1).聚谈;对话。现多用于学习别种语言或方言时
Servlet
介绍
Servlet 是运行在Java服务器端的程序,用于接收和响应来自客户端基于HTTP协议的请求
如果想实现Servlet的功能,可以通过实现javax.servlet.Servlet接口或者继承它的实现类
核心方法:service(),任何客户端的请求都会经过该方法
默认Servlet
默认Servlet是由服务器提供的一个Servlet。它配置在Tomcat的conf目录中的web.xml中。
它的映射路径是<url-pattern>/<url-pattem>,在发送请求时,首先会在项目中的web.xml中查找映射配置,找到则执行。但是当找不到对应的Servlet路径时,就去找默认的Servlet,由默认Servlet处理。所以,一切都是Servlet。
关系视图
实现方式
实现Servlet接口,实现所有的抽象方法。该方式支持最大程度的自定义
继承GenericServlet 抽象类,必须重写 service 方法,其他方法可选择重写。该方式让开发Servlet变得简单。但是这种方式和HTTP协议无关。
继承 HttpServlet抽象类,需要重写doGet和doPost方法。该方式表示请求和响应都需要和HTTP协议相关。
实际开发用的较多
执行过程
生命周期
介绍
对象的生命周期,就是对象从出生到死亡的过程。即:出生->活着->死亡。官方说法是对象创建到销毁的过程!
出生
请求第一次到达Servlet时,对象就创建出来,并且初始化成功。只出生一次,将对象放到内存中。
init()方法
活着
服务器提供服务的整个过程中,该对象一直存在,每次都是执行service()方法。
死亡
当服务停止时,或者服务器右机时,对象死亡。
destroy()方法
结论
Servlet对象只会创建一次,销毁一次。所以Servlet对象只有一个实例。如果一个对象实例在应用中是唯一的存在,那么我们就称它为单例模式。
创建时机
种类
第一次访问时创建
优势
减少对服务器内存的浪费。提高了服务器启动的效率
弊端
如果有一些要在应用加载时就做的初始化操作,无法完成
服务器加载时创建
优势
提前创建好对象,提高了首次执行的效率。可以完成一些应用加载时要做的初始化操作
弊端
对服务器内存占用较多,影响了服务器启动的效率
配置修改
在<servlet>标签中,添加<load-on-startup>标签。
正整数代表服务器加载时创建,值越小、优先级越高。负整数或不写代表第一次访问时创建
线程安全问题
介绍
由于Servlet采用的是单例模式,也就是整个应用中只有一个实例对象。所以需要分析这个唯一的实例对象中的类成员是否线程安全。
结论
一个浏览器代表一个线程,多个浏览器代表多个线程。按理说我们期望的应该是每个浏览器查看的都应该是自己的用户名。而现在的结果是浏览器中数据混乱。因此,可以认为Servlet是线程不安全的!
解决
定义类成员要谨慎。如果是共用的,并且只会在初始化时赋值,其他时间都是获取的话,那么是没问题的。如果不是共用的,或者每次使用都有可能对其赋值,那就要考虑线程安全问题了,可以将其定义到doGet或doPost方法内或者使用同步功能即可
映射方式
种类
1.具体名称的方式。访问的资源路径必须和映射配置完全相同
2./开头+通配符的方式。只要符合目录结构即可,不用考虑结尾是什么
3.通配符+固定格式结尾的方式。只要符合固定结尾格式即可,不用考虑前面的路径
注意
优先级问题。越是具体的优先级越高,越是模糊通用的优先级越低。第1种>第2种>第3种
多路径映射
介绍
可以给一个Servlet配置多个访问映射,从而根据不同的请求路径来实现不同的功能
案例
场景分析
如果访问的资源路径是/vip商品价格打9折
如果访问的资源路径是/vvip 商品价格打5折
如果访问的资源路径是其他商品价格不打折
代码
功能类业务功能
配置文件配置
ServletConfig
介绍
ServletConfig是Servlet的配置参数对象,在Servlet的规范中,允许为每一个Servlet都提供一些初始化的配置。所以,每个Servlet都有一个自己的ServletConfig
作用
在Servlet的初始化时,把一些配置信息传递给Servlet
配置信息以键值对形式传递
生命周期
和Servlet相同
配置方式
在<servlet>标签中,通过<init-param>标签来配置。有两个子标签
<param-name>:代表初始化参数的key
<param-value>:代表初始化参数的value。
不同键值对通过不同标签实现
常用方法
String
getlnitParameter(String name)
根据参数名称获取参数的值
Enumeration<String>
getlnitParameterNames()
获取所有参数名称的枚举
String
getServletName()
获取Servlet的名称
ServletContext
getServletContext()
获取ServletContext对象
实例
获取ServletCongfig
方法演示
ServletContext
介绍
ServletContext是应用上下文对象(应用域对象)。每一个应用中只有一个ServletContext对象。
作用
可以配置和获得应用的全局初始化参数,可以实现Servlet之间的数据共享
补充
域对象
介绍
域对象指的是对象有作用域。也就是有作用范围。域对象可以实现数据的共享。不同作用范围的域对象,共享数据的能力也不一样。
在Servlet规范中,一共有4个域对象。ServletContext就是其中的一个。它也是web应用中最大的作用域,也叫application域。它可以实现整个应用之间的数据共享!
生命周期
应用一加载则创建,应用被停止则销毁
配置方式
在<web-app>标签中,通过<context-param>标签来配置。有两个子标签
<param-name>:代表全局初始化参数的key
<param-value>:代表全局初始化参数的value
不同键值对通过不同标签实现
常用方法
String
getinitParameter(String name)
根据名称获取全局配置的参数
String
getContextPath()
获取当前应用的访问虚拟目录
String
getRealPath(String path)
根据虚拟目录获取应用部署的磁盘绝对路径
数据共享
void
setAttribute(String name,Object value)
向应用域对象中存储据
Object
getAttribute(String name)
通过名称获取应用域对象中的数据
void
removeAttribute(String name)
通过名称移除应用域对象中的数据
实例
获取ServletContext
方法演示
三种情况下
src文件下
web文件下
WEB-INF文件下
在不同servlet类中数据共享
Servlet3.0规范
介绍
Tomcat9版本。JavaEE规范要求是8。对应的Servlet版本应该是4.x版本。但是,在企业开发中,稳定要远比追求新版本要重要。所以我们会降版本使用,用的是Servlet3.1版本。
之前的操作全都是基于Servlet2.5版本规范的,也就是借助于配置文件的方式。后来随着软件开发逐步的演变,基于注解的配置开始流行。而Servlet3.0版本也就开始支持注解开发了!
Servlet3.0版本既保留了2.5版本的配置方式,同时又支持了全新的注解配置方式。它可以完全不需要web.xml配置文件,就能实现Servlet的配置,同时还有一些其他的新特性
对比
基于配置文件方式
基于注解方式
注解详解
@WebServlet
主题