Servlet细节

目录

[1 Servlet 是否符合线程安全?](#1 Servlet 是否符合线程安全?)

[2 Servlet对象的创建时间?](#2 Servlet对象的创建时间?)

[3 Servlet 绑定url 的写法](#3 Servlet 绑定url 的写法)

[3.1 一个Servlet 可以绑定多个url](#3.1 一个Servlet 可以绑定多个url)

[3.2 在web.xml 配置文件中 url-pattern写法](#3.2 在web.xml 配置文件中 url-pattern写法)


1 Servlet 是否符合线程安全?

答案:不安全

判断一个线程是否安全?条件是 是否存在共享元素【全局变量】

举例

因为一个类型的Servlet只有一个实例对象,那么就有可能会现时出一个Servlet同时处理多个请求,那么Servlet是否为线程安全的呢?答案是:" 不是线程安全的 "。这说明Servlet的工作效率很高,但也存在线程安全问题!

所以我们不应该在Servlet中便宜创建成员变量,因为可能会存在一个线程对这个成员变量进行写操作,另一个线程对这个成员变量进行读操作。

2 Servlet对象的创建时间?

通过之前的学习,我们知道想要创建Servlet 对象,必须要满足两个条件

  • 首先要启动tomcat服务器
  • 其次要使用浏览器通过url访问Servlet,服务器创建Servlet 对象

在之前的博客中,有提到使用注解@WebServlet("url") 【一般来说 :url: /.... 的方式】 形式关联我们创建的Servlet 比在xml配置文件中添加,更加方便 。

但当浏览器访问时,通过url直接或间接 找到Servlet ,这里有个问题。第一次访问Servlet 时,等待时间比较长!在这里我称这种行为是:第一次惩罚。

注意

1 Servlet 和url 路径,本质上是映射的关系。我们可以通过url 找到与它匹配的Servlet

  • 我们可以理解成map集合中的key-value 键值对的

2 这里的"直接"的意思是:我们指定启动服务器的首页,刚好是要访问的Servlet 的前端页面

3 这里的"间接"的意思是:我们没有指定,而是手动在浏览器的搜索栏中输入和Servlet 匹配的路径,去访问

有什么方式,可以加快Servlet的创建速度,节省创建所需要的时间?

答案: 让服务器在启动时就创建Servlet

假设这里我是AServlet 操作

应该怎么做呢?

解决办法

  • 在xml配置文件中添加 <load-on-startup> 数字</load-on-startup>
  • @WebServlet 注解上添加

1 在xml配置文件中添加 <load-on-startup> 数字</load-on-startup>

XML 复制代码
   <load-on-startup>数字</load-on-startup>	
XML 复制代码
<servlet>
        <servlet-name>AServlet</servlet-name>
<!--        对应在AServle中的路径:包名.类名-->
        <servlet-class>fs.AServlet</servlet-class>
        <init-param>
<!--            初始化参数-->
        <param-name>key</param-name>
        <param-value>value</param-value>
    </init-param>
        <load-on-startup>1</load-on-startup>

    </servlet>

这样我就把Servlet的创建提前到服务器启动的时候。

启动服务器:

2@WebServlet 注解上添加

注意:使用注解时,要把之前在xml配置文件上的添加url 的标签,要注释掉,否则会报错

原因:问题出在 @WebServlet 注解的使用上。具体来说,错误提示表明存在两个不同的 Servlet 类都尝试映射到同一个 URL 模式 /a

java 复制代码
@WebServlet(value = "/a", loadOnStartup = 1)

注意

在这里value ,是不能被省略的。原因是只有一个参数时,value可以被省略,其余的不能被省略

3 Servlet 绑定url 的写法

3.1 一个Servlet 可以绑定多个url

注意:但这种方式不推荐

我们一般在@WebServlet 注解的使用

java 复制代码
@WebServlet({"/a", "/aa"})

运行

使用/a

使用/aa

注意:我们第一次访问时创建了AServlet对象,因此之后的访问中,不会再创建该对象,之后调用service()方法

3.2 在web.xml 配置文件中 url-pattern写法

  • 精确匹配:/字符串
  • 借助通配符 *
  • 匹配所有:/*
  • 前缀匹配:/abc/*
  • 后缀匹配:*/.后缀名
相关推荐
給妳一生緈諨3 分钟前
11.AOP开发
java·spring boot·spring·springboot3
_修铁路的3 分钟前
解决 EasyExcel 填充图片占满单元格问题
java·easyexcel
HanhahnaH19 分钟前
Spring集合注入Bean
java·spring
未定义.22125 分钟前
电子削铅笔刀顺序图详解:从UML设计到PlantUML实现
java·软件工程·uml
雾月5542 分钟前
LeetCode 1292 元素和小于等于阈值的正方形的最大边长
java·数据结构·算法·leetcode·职场和发展
24k小善2 小时前
Flink TaskManager详解
java·大数据·flink·云计算
想不明白的过度思考者2 小时前
Java从入门到“放弃”(精通)之旅——JavaSE终篇(异常)
java·开发语言
.生产的驴2 小时前
SpringBoot 封装统一API返回格式对象 标准化开发 请求封装 统一格式处理
java·数据库·spring boot·后端·spring·eclipse·maven
猿周LV2 小时前
JMeter 安装及使用 [软件测试工具]
java·测试工具·jmeter·单元测试·压力测试
晨集2 小时前
Uni-App 多端电子合同开源项目介绍
java·spring boot·uni-app·电子合同