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/*
  • 后缀匹配:*/.后缀名
相关推荐
shuair1 小时前
idea 2023.3.7常用插件
java·ide·intellij-idea
小安同学iter1 小时前
使用Maven将Web应用打包并部署到Tomcat服务器运行
java·tomcat·maven
Yvonne9782 小时前
创建三个节点
java·大数据
不会飞的小龙人3 小时前
Kafka消息服务之Java工具类
java·kafka·消息队列·mq
是小崔啊3 小时前
java网络编程02 - HTTP、HTTPS详解
java·网络·http
brevity_souls4 小时前
Spring Boot 内置工具类
java·spring boot
小钊(求职中)4 小时前
Java开发实习面试笔试题(含答案)
java·开发语言·spring boot·spring·面试·tomcat·maven
shix .4 小时前
什么是tomcat
java·tomcat
java技术小馆4 小时前
Deepseek整合SpringAI
java·spring cloud
天荒地老笑话么4 小时前
Mac安装配置Tomcat 8
java·macos·tomcat