javaweb的容器 |
您所在的位置:网站首页 › java什么是容器组件 › javaweb的容器 |
javaweb里有各种容器的概念,查了很多资料,发现有几个大神讲的很好,现在摘抄,做个记录,方便以后回顾。 常见的各种容器 一、Tomcat 容器模型
二、Tomcat 下的Servlet容器 一个 Web 应用对应一个 Context 容器,也就是 Servlet 运行时的 Servlet 容器。 在一个应用中只有一个ServletContext, 换句话说,容器中所有的servlet都共享同一个ServletContext。 Servlet规范把能够与发布和运行Java Web应用容器的Web服务器称为Servlet容器。 可以直接说tomcat是servlet容器。 Servlet规定的,相应客户请求访问特定Servlet流程如下: 1.客户端发出请求。 2.Servlet容器接收客户请求解析。 3.Servlet容器创建一个ServletRequest对象。 其中包含客户请求信息及其他关于客户的信息如请求头,请求正文,客户机的IP等。 4.容器创建一个ServletResponse对象。 5.容器调用客户请求的Servlet的service方法,并且把ServletRequest和ServletResponse作为参数传入。 6.Servlet从客户参数中获得客户请求信息。 7.Servlet利用ServletResponse对象来生产相应结果。 8.Servlet容器把Servlet生成的结果发给客户。 三、Servlet容器种类: 1)独立的Servlet容器 当我们使用基于Java技术的Web服务器时,Servlet容器作为构成Web服务器的一部分而存在。然而大多数的Web服务器并非基于Java,因此,就有了下面两种Servlet容器的工作模式。 2)进程内的Servlet容器 Servlet容器由Web服务器插件和Java容器两部分的实现组成。Web服务器插件在某个Web服务器内部地址空间中打开一个 JVM(Java虚拟机),使得Java容器可以在此JVM中加载并运行Servlet。如有客户端调用Servlet的请求到来,插件取得对此请求的控 制并将它传递(使用JNI技术)给Java容器,然后由Java容器将此请求交由Servlet进行处理。进程内的Servlet容器对于单进程、多线程 的服务器非常适合,提供了较高的运行速度,但伸缩性有所不足。 3)进程外的Servlet容器 Servlet容器运行于Web服务器之外的地址空间,它也是由Web服务器插件和Java容器两部分的实现组成的。Web服务器插件和Java容 器(在外部JVM中运行)使用IPC机制(通常是TCP/IP)进行通信。当一个调用Servlet的请求到达时,插件取得对此请求的控制并将其传递(使 用IPC机制)给Java容器。进程外Servlet容器对客户请求的响应速度不如进程内的Servlet容器,但进程外容器具有更好的伸缩性和稳定性。 四、Spring和SpringMVC容器 springmvc和spring它们都是容器,是管理bean对象的地方。springmvc是管理controller对象的容器,spring是管理service和dao的容器。在springmvc的配置文件里配置的扫描路径就是controller的路径,而spring的配置文件里自然配的就是service和dao的路径。 spring容器和springmvc容器的关系是父子容器的关系。spring容器是父容器,springmvc是子容器。在子容器里可以访问父容器里的对象,但是在父容器里不可以访问子容器的对象。 通俗点就是,在controller里可以访问service对象,但是在service里不可以访问controller对象。web容器是管理servlet,以及监听器(Listener)和过滤器(Filter)的。 这些都是在web容器的掌控范围里。但他们不在spring和springmvc的掌控范围里 。因此,我们无法在这些类中直接使用Spring注解的方式来注入我们需要的对象,是无效的,web容器是无法识别的。servlet容器在实例化ConfigListener并调用其方法之前,要确保spring容器已经初始化完毕 !而spring容器的初始化也是由Listener(ContextLoaderListener)完成,因此只需在web.xml中先配置初始化spring容器的Listener,然后在配置自己的Listener。 五、spring、springmvc容器启动 1、容器启动,为应用创建一个“全局上下文环境”:ServletContext 2、Spring ioc容器: 在web.xml 中会提供 contextLoaderListener。在web 容器启动时,会触发容器初始化事件,此时contextLoaderListener 会监听到这个事件,其 contextInitialized 方法会被调用,在这个方法中,spring 会初始化一个启动上下文,这个上下文就被称为根上下文,即 WebApplicationContext ,这是一个接口类,确切的说,其实际实现类是 XmlWebApplicaitonContext 。这个就是Spring 的Ioc 容器,其对应的Bean配置由web.xml中的context-param标签指定.在Ioc 容器初始化完毕后,spring 以WebApplicationContext.ROOTWEBAPPLICATIONEXTATTRIBUTE 为属性key,将其存储到servletContext 中,便于获取 3、spring mvc容器: contextLoaderListener 监听器初始化完毕后(spring IOC 容器初始化完毕后),开始初始化web.xml 中配置的servlet ,这个servlet 可以配置多个,以最常见的DispatcherServlet 为例,这个servlet 实际上是一个标准的前端控制器,用以转发、匹配、处理每个servlet 请求。DispatcherServlet 上下文在初始化的时候会建立自己的Ioc 上下文,用以持有springmvc 相关的bean。在建立DispatherSrvlet 自己的Ioc 上下文时,会利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE 先从ServletContext 中获取之前的根上下文(即WebApplicationContext)作为自己上下文的parent 上下文,有了这个parent 上下文之后,再初始化自己持有的上下文。这个DispatcherServlet 初始化自己上下文的工作在其 initStrategies 方法中可以看到,大概的工作就是初始化处理器映射、视图解析等,这个servlet 自己持有的上下文默认实现类也是 XmlWebApplicationContext。 初始化完毕后,spring以与Servlet 的名字相关的属性为key,将其存到servletcontext 中,以便后续使用。这样每个Servlet 都持有自己的上下文,即拥有自己独立的bean 空间,同时各个servlet 共享相同的bean,即根上下文定义的那些bean 4、此后的所有servlet的初始化都按照3步中方式创建,初始化自己的上下文环境,将WebApplicationContext设置为自己的父上下文环境。
5、上图分析: 对于作用范围而言,在DispatcherServlet中可以引用由ContextLoaderListener所创建的ApplicationContext中的内容,而反过来不行。当Spring在执行ApplicationContext的getBean时,如果在自己context中找不到对应的bean,则会在父ApplicationContext中去找。这也解释了为什么我们可以在DispatcherServlet中获取到由ContextLoaderListener对应的ApplicationContext中的bean。
|
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |