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/*
  • 后缀匹配:*/.后缀名
相关推荐
kiddkid27 分钟前
RabbitMQ高级
java·rabbitmq·java-rabbitmq
爱编程的小生2 小时前
Easyexcel(7-自定义样式)
java·excel
AI人H哥会Java2 小时前
【JAVA】Java基础—面向对象编程:常用API与数据结构—集合框架(List、Set、Map等)
java·开发语言
神仙别闹3 小时前
基于C语言实现的(控制台)校园导航系统
java·服务器·c语言
路在脚下@3 小时前
Spring MVC
java·spring
J不A秃V头A3 小时前
IntelliJ IDEA 中,自动删除无用导包
java·intellij-idea
小_太_阳3 小时前
idea_卸载与安装
java·ide·intellij-idea
旧故新长3 小时前
版本控制和idea简体中文教程
java·开发语言·intellij-idea
疯一样的码农3 小时前
使用 Maven 构建一个简单的 Java 项目
java·开发语言·maven
小_太_阳3 小时前
idea_常用设置
java·ide·intellij-idea