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/*
  • 后缀匹配:*/.后缀名
相关推荐
毕设源码-朱学姐2 小时前
【开题答辩全过程】以 爱心捐赠网站为例,包含答辩的问题和答案
java·eclipse
尘觉4 小时前
中秋节与 Spring Boot 的思考:一场开箱即用的团圆盛宴
java·spring boot·后端
Le1Yu5 小时前
2025-10-7学习笔记
java·笔记·学习
popoxf5 小时前
spring容器启动流程(反射视角)
java·后端·spring
AAA修煤气灶刘哥6 小时前
监控摄像头?不,我们管这个叫优雅的埋点艺术!
java·后端·spring cloud
寻星探路6 小时前
Java EE初阶启程记09---多线程案例(2)
java·开发语言·java-ee
武子康6 小时前
Java-141 深入浅出 MySQL Spring事务失效的常见场景与解决方案详解(3)
java·数据库·mysql·spring·性能优化·系统架构·事务
珹洺7 小时前
Java-Spring入门指南(十五)SpringMVC注解开发
java·spring·microsoft
小满、7 小时前
什么是Maven?关于 Maven 的坐标、依赖管理与 Web 项目构建
java·maven
半旧夜夏7 小时前
【设计模式】核心设计模式实战
java·spring boot·设计模式