http容器2

  • 来源:
  • 更新日期:2018-05-09

摘要:MIME最初是邮件系统的一部分,用来文件扩展名来描述不同的文件,后来被用到HTTP协议中和浏览器中,浏览器根据不同的MIME类型,去自身的插件系统里查找,来打开相应的文件。 Web-fragment: 产生目的:为了给开发人员更好的可插拔性和更少的配置,在Servlet 3.0的规范中,引入了web模块部署描述符片段(web fragment)的概念。 概念:web fragment是web

MIME最初是邮件系统的一部分,用来文件扩展名来描述不同的文件,后来被用到HTTP协议中和浏览器中,浏览器根据不同的MIME类型,去自身的插件系统里查找,来打开相应的文件。

Web-fragment:

002UASMrzy7605pjKJv15&690.jpg

产生目的:为了给开发人员更好的可插拔性和更少的配置,在Servlet 3.0的规范中,引入了web模块部署描述符片段(web fragment)的概念。

概念:web fragment是web.xml的部分或全部,web fragment是web应用的一个逻辑分区,相当于对web.xml进行扩展。

作用:以前一个web应用的任何配置都需要在web.xml中进行,因此会使得web.xml变得很混乱,而且灵活性差,因此Servlet 3.0可以将每个Servlet、Filter、Listener打成jar包,各自带自己的配置文件,即web-fragment.xml ;。也就是说web-fragment.xml有助于将Servlet、Filter、Listener更好地封装,有助于模块化。

生效条件:metadata-complete属性没有指定或设置为“false”,此时Servlet容器会负责将各个jar中的web fragment合并到主web.xml。合并发生在相关fragment的注解处理之后。

如果设置metadata-complete="true",会在启动时不扫描注解(annotation)。如果不扫描注解的话,用注解进行的配置就无法生效,例如:@WebServlet

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1" metadata-complete="true"> </web-app>

 

Servlet容器负责加载和实例化Servlet,容器可以在启动的时候实例化,也可以在有请求的时候决定进行实例化。当Servlet容器启动后,Servlet容器必须定位所需要的Servlet类。Servlet类使用普通的java类加载设施加载Servlet类。可以从本地文件系统或远程文件系统或其他网络服务加载,加载完Servlet类后,容器就可以实例化它并使用了。

容器在创建完Servlet实例之后,必须在处理客户端请求之前初始化Servlet实例。这里需要注意,实例已经创建完成,这里做的是初始化。实例化!= 初始化。初始化的作用是初始化一些代价高的资源(比如JDBC连接)或执行一些一次性动作。容器通过调用init方法,并提供一个唯一的ServletConfig对象作为参数,该对象每个Servlet实例一个。ServletConfig允许访问Web应用配置信息提供的键值对的初始化参数,以及对ServletContext对象的访问,该对象描述了Servlet运行时环境。当一个工具加载并內省某个某个Web应用程序时触发的静态初始化,这种用法与调用init初始化是有区别的,Servlet的init方法没有被调用时,不应当假定其处于活动的容器环境内,当某个Servlet仅有静态方法被调用时,不应该与数据库建立连接。

线程饥饿: 如果一个线程因为 CPU 时间全部被其他线程抢走而得不到 CPU 运行时间,这种状态被称之为“饥饿”;

AsyncContext Servlet3.0中队异步调用的支持

ServletContext是Web服务器中已知路径的根。用户在找到主机和端口应用,并访问catalog目录下的资源,catalog就是已知路径的根,这个根目录中的内容就被称为环境或者上下文。该目录描述了使用目录内资源文件的方式。ServletContext允许Servlet访问由应用开发人员在Web.xml指定的初始化参数。

public interface ServletContainerInitializer { void onStartup(Set<Class<?>> var1, ServletContext var2) throws ServletException; } public interface ServletContextListener extends EventListener { void contextInitialized(ServletContextEvent var1); void contextDestroyed(ServletContextEvent var1); }

上面两个方法用于描述当程序运行到此步时,这两个方法支持当以变成的方式定义Servlet/Filter和它们映射到的url模式。Listerner相当于Observer模式,而ServletContext相当于Observerable,当ServletContext发生某个事件时,也就是执行到某个步骤时,会nofifyObservers(EventListener event),所有的Listerner都扩展自java.util包中EventListener,而被通知的Listener,则会按照添加的顺序依次执行Listener中的代码。

Web服务器可以支持多个逻辑主机共享一个服务器IP地址,有时,这种能力被称为“虚拟主机”。这种情况下,每一个逻辑主机必须有它自己的上下文或一组上下问。Servlet上下文不会在虚拟主机之间共享。其原理应该类似于Linux中的chroot命令的效果

每一个servlet上下文都需要一个临时存储目录, TEMPDIR 对应的属性值是个java.io.File对象,表示该ServletContext对应的临时目录。拿tomcat来说,比如有个应用叫demo,那么 demo对应的ServletContext临时目录就是{Tomcat目录}workCatalinalocalhostdemo。 规范中规定这个临时目录在容器重启时,不需要保持改目录的内容,但需要对容器中的其他应用不可见,即在workCatalinalocalhost中一个catalog上下文,一个目录。