Servlet的线程安全

在Servlet的整个生命周期中,构造方法只被执行一次。也就是说,在Servlet的整个生命周期中,只存在一个Servlet实例对象。这说明Servlet是单例多线程的,可能会引起线程安全问题。

所谓线程安全就是一个Servlet实例对象会同时处理多个请求,这样的Servlet工作效率的确很高。但如果Servlet中包含成员变量的话,可能一个线程对该成员变量进行写操作,而另一个线程对该成员变量进行读操作。所以,单例多线程的Servlet不能创建成员变量。

服务器启动创建Servlet

通过之前的测试操作,我们发现Servlet并不是在Tomcat服务器启动时创建实例对象,而是在第一次请求之后才一并创建实例对象、初始化并处理逻辑的。Servlet又是单例的,在整个生命周期中只创建一个Servlet实例对象。如果可以在Tomcat服务器启动时,进行创建实例对象并完成初始化工作,在请求之后只调用service()方法处理请求逻辑即可。

可以在web.xml配置文件增加相关配置即可,具体增加内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><servlet><servlet-name>LifeServlet</servlet-name><servlet-class>app.java.servlet.LifeServlet</servlet-class><!-- load-on-startup标签:配置当前Servlet在启动时创建实例对象* 标签中的数字,表示级别(0-9级),一般设置为0即可.--><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>LifeServlet</servlet-name><url-pattern>/servlet/LifeServlet</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
</web-app>

增加配置信息之后,重新启动Tomcat服务器,查看控制台信息如下:

通过查看控制台打印的信息,可以看出在启动Tomcat服务器时,已经创建并初始化了Servlet实例对象。

url-pattern的三种配置

在web.xml配置文件中配置有关Servlet的时候,标签是用于配置当前Servlet拦截的路径,也就是说,客户端浏览器访问标签配置的路径才能访问对应Servlet内容。

关于拦截路径的配置方式其实有三种方式:

  • 完全路径匹配:是以“/”开始,路径中间不能包含通配符“*”,例如:/firstServclet,表示访问路径为http://localhost:8080/08_servlet/firstServlet。
  • 目录匹配:是以“/”开始,以“/”结尾的,例如:/firstServlet/,表示访问路径为http://localhost:8080/08_servlet/firstServlet路径下任意内容。
  • 扩展名匹配:是以“”开始,不能以“/”开始,以“.xxx”结尾,例如:.do,表示访问路径为所有扩展名为“.do”的路径。

值得注意的问题:

  • 在一个标签中,可以配置多个标签。也就是说,一个Servlet可以拦截多个不同路径的访问。
  • 上述三种配置路径方式具有优先级:完全路径匹配 -> 目录匹配 -> 扩展名匹配。

下面通过一些测试,来看看路径配置的三种方式:

  • 如下有一些映射关系:

    • Servlet1 映射到 /abc/*
    • Servlet2 映射到 /*
    • Servlet3 映射到 /abc
    • Servlet4 映射到 *.do
  • 问题:
    • 当请求URL为“/abc/a.html”,“/abc/”和“/”都匹配,哪个servlet响应?Servlet1
    • 当请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应?Servlet3
    • 当请求URL为“/abc/a.do”时,“/abc/”和“.do”都匹配,哪个servlet响应?Servlet1
    • 当请求URL为“/a.do”时,“/”和“.do”都匹配,哪个servlet响应?Servlet2
    • 当请求URL为“/xxx/yyy/a.do”时,“/”和“.do”都匹配,哪个servlet响应?Servlet2

如果客户端浏览器请求的路径是错误时,页面会显示404错误内容。这是因为所有发布到Tomcat服务器的Web应用程序的web.xml文件都继承了Tomcat服务器安装目录中conf目录中的web.xml文件。当访问路径是错误的,或者对应Servlet没有配置,实际上会执行Tomcat服务器中的web.xml的相关配置,具体内容如下:

<servlet><servlet-name>default</servlet-name><servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class><init-param><param-name>debug</param-name><param-value>0</param-value></init-param><init-param><param-name>listings</param-name><param-value>true</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>default</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>

转载说明:请注明作者及原文链接,谢谢!

转载于:https://www.cnblogs.com/longestory/p/4566970.html

[Servlet]深入掌握Servlet相关推荐

  1. java servlet filter_Java的Servlet、Filter、Interceptor、Listener

    写在前面: 使用Spring-Boot时,嵌入式Servlet容器可以通过扫描注解(@ServletComponentScan)的方式注册Servlet.Filter和Servlet规范的所有监听器( ...

  2. Servlet 2.0 Servlet 3.0 新特性

    概念:透传. Callback 在异步线程中是如何使用的.?? Servlet 2.0 && Servlet 3.0 新特性 Servlet 2.0 && Servle ...

  3. Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】...

    tags: Servlet 什么是Serlvet?# Servlet其实就是一个遵循Servlet开发的java类.Serlvet是由服务器调用的,运行在服务器端. 为什么要用到Serlvet? 我们 ...

  4. Servlet简介与Servlet和HttpServlet运行的流程

    2019独角兽企业重金招聘Python工程师标准>>> 1.Servlet [1] Servlet简介 > Server + let > 意为:运行在服务器端的小程序. ...

  5. Servlet学习笔记 Servlet原理

    Servlet学习笔记 Servlet原理 一.Servlet基础 1.Servlet执行过程 用户请求一个Servlet,Servlet容器自动构建请求和响应对象,然后执行Servlet的servi ...

  6. Servlet的体系结构 || Servlet相关配置

    Servlet的体系结构         Servlet -- 接口         |     GenericServlet -- 抽象类         |     HttpServlet  -- ...

  7. javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/

    今天在启动tomcat的时候,出现了这个错误 javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletC ...

  8. HTTP Status 500 - Servlet.init() for servlet springmvc threw exception

    解决办法: 一:把jdk版本换成1.7 or 1.7以下 二:使用spring 4.0RELEASE及以上版本 三:如果你使用的是eclipse开发,换成myeclipse就可以,这可能是这两个开发工 ...

  9. [javaweb] servlet介绍与servlet的继承关系 和 service 方法 (一)

    Servlet servlet是Server Applet的简称,servlet是运行在服务器上的一个小程序,用来处理服务器请求的.一般的网页程序,是通过浏览器访问来实现的,在这个过程中,浏览器发送访 ...

  10. Java Servlet(三):Servlet中ServletConfig对象和ServletContext对象

    本文将记录ServletConfig/ServletContext中提供了哪些方法,及方法的用法. ServletConfig是一个抽象接口,它是由Servlet容器使用,在一个servlet对象初始 ...

最新文章

  1. Linux kernel futex.c的bug导致JVM不可用
  2. Spring Boot 缓存应用实践
  3. 分布式缓存系统之Memcached
  4. 转贴:BMP格式详解 二 (转载)
  5. 铃木uy125摩托车机油_UY125 新瑞梦UM125发布 济南铃木于湖南株洲吹响国IV集结号...
  6. Yeslab现任明教教主ISE课程前七部分免费发布
  7. 1389. 按既定顺序创建目标数组
  8. linux df命令无反馈,Linux df 命令长时间没有返回
  9. Redis开发与运维教程
  10. 免费随机图片api接口
  11. m3u8批量下载【下载器 xdown - V1.0】
  12. 58-高级路由:双点双向重分发
  13. vue项目改图标_vue 项目全局修改element-ui的样式
  14. 三元组事件抽取与简单代码实现
  15. 当封号成为一种常态,网络营销人该何去何从?
  16. 4399小游戏之三子棋(可联机)
  17. 检查更新时出错:无法启动更新检查(错误代码为 3: 0x80040154)
  18. python人工自动抠图_Python - AI自动抠图
  19. Java之乐观锁和悲观锁
  20. OSChina 周日乱弹 ——你除了顺从,还有别的办法么?

热门文章

  1. PL/SQL 基础( 上 )
  2. HTML5的绝活:巧用Canvas制作会动的时钟
  3. 诺基亚5800WIFI设置教程
  4. what format should you export from matlab?
  5. Bochs调试加载符号文件的问题
  6. linux三剑客之awk (用于个人学习以及回顾)
  7. 为什么我要放弃javaScript数据结构与算法(第二章)—— 数组
  8. git学习------gt;Git 分支管理最佳实践
  9. webpack 使用教程--实时刷新测试
  10. 初学Java对某些问题的理解