`
jackyhongvip
  • 浏览: 159218 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jetty_webappcontext

 
阅读更多

1.概述

jetty的web工程主要完成servlet中context的管理,war包中web.xml中文件等的解析和加载,类加载器等一些功能。

 

2. 类图和解释

 

webAppContext是中心,其中包括classloader,configuration和metadata三个主要的内容,classloadee后面再说,configuration主要是对一些配置的应用,比如调用加载器加载jar包,根据web.xml中的配置初始化servlet等等。metadata主要是元数据的定义和处理,展开类图如下:

其中descriptor主要完成xml文件的解析,这里包括web.xml,webdefault.xml,web-fragment.xml等,然后DescriptorProcessor主要是将解析好的文件转换为需要使用的数据结构,或者设置context等的一些相应的值。

 

3.启动过程

server,connector,handler等都继承了abstractLifeCycle(实现LifeCycle接口)。

  1. server的dostart过程包括:启动threadPool,启动handler,启动connector(分别调用它们的doStart方法)
  2. hanlder(webappContext)的doStart方法又包括如下步骤:
    1
    2
    3
    
                preConfigure();
              super.doStart();
              postConfigure();
  3. preConfigure()完成的主要工作包括:初始化所有的Configuration,定义systemClass和serverClass,创建webappClassLoader,调用configuration的preconfigure方法。其中WebInfConfiguration主要完成将war包解压的临时文件夹,根据定义加载一些控制扫描jar包的顺序(比如扫描jar包中的web-fragment.xml), webxmlConfiguration主要完成webdefault.xml,web.xml和web-fragment.xml文件的resource定位和加载。还有几个在此就不详述了。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
             loadConfigurations();
     
            // Setup system classes
            loadSystemClasses();
     
            // Setup server classes
            loadServerClasses();
     
            // Configure classloader
            _ownClassLoader=false;
            if (getClassLoader()==null)
            {
                WebAppClassLoader classLoader = new WebAppClassLoader(this);
                setClassLoader(classLoader);
                _ownClassLoader=true;
            }
     
            if (Log.isDebugEnabled())
            {
                ClassLoader loader = getClassLoader();
                Log.debug("Thread Context class loader is: " + loader);
                loader=loader.getParent();
                while(loader!=null)
                {
                    Log.debug("Parent class loader is: " + loader);
                    loader=loader.getParent();
                }
            }
     
            // Prepare for configuration
            for (int i=0;i<_configurations.length;i++)
                _configurations[i].preConfigure(this);
  4. start方法先将classloader设置到线程上下文加载器,然后调用startContext,分为以下3个步骤
1
2
3
4
5
6
7
8
9
10
 protected void startContext()
        throws Exception
    {
        configure();
 
        //resolve the metadata
        _metadata.resolve(this);
 
        super.startContext();
    }
  • configure步骤主要调用各个configuration的configure方法,其中webinfconfiguration主要完成两件事情,吧WEB-INF的class文件夹和lib文件夹下得jar加入到webappClassloader的classpath中,然后读取RESOURCE_URLS,设置BaseResource。webxmlconfiguration主要addDescriptorProcessor。
  • metadata.resolve主要完成web.xml(包括servlet注解)中定义的filter,servlet等得解析和初始化化(比如解析到servelet,就会load这个class等),这里一个stranderProcess可以处理webDefaultDescriptor,WebDescriptor等多个文件,处理过程一样,只是处理内容不同。这里以后再扩展一下。
  • 通知所有的contextlistener发生了contextInitialized(event)事件。初始化servletHandler,securityhandler和sessionHandler,并把他们链接起来,最后调用_servletHandler.initialize();,从而调用各个servletHolder的dostart。

 

4.ClassLoad机制

jetty的classload机制很简单,对于system(系统类)的class,使用jdk的方式(双亲委派)加载,对于server(服务器类,app不可见)的class, ,对于app的class,使用WebAppClassloader来加载,核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 @Override
    protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
    {
        Class<?> c= findLoadedClass(name);
        ClassNotFoundException ex= null;
        boolean tried_parent= false;
 
        boolean system_class=_context.isSystemClass(name);
        boolean server_class=_context.isServerClass(name);
 
        if (system_class && server_class)
        {
            return null;
        }
 
        if (c == null && _parent!=null && (_context.isParentLoaderPriority() || system_class) && !server_class)
        {
            tried_parent= true;
            try
            {
                c= _parent.loadClass(name);
                if (Log.isDebugEnabled())
                    Log.debug("loaded " + c);
            }
            catch (ClassNotFoundException e)
            {
                ex= e;
            }
        }
 
        if (c == null)
        {
            try
            {
                c= this.findClass(name);
            }
            catch (ClassNotFoundException e)
            {
                ex= e;
            }
        }
 
        if (c == null && _parent!=null && !tried_parent && !server_class )
            c= _parent.loadClass(name);
 
        if (c == null)
            throw ex;
 
        if (resolve)
            resolveClass(c);
 
        if (Log.isDebugEnabled())
            Log.debug("loaded " + c+ " from "+c.getClassLoader());
 
        return c;
    }

 

其中=_context.isSystemClass(name)方法是查看是否为systemclass,systemclass都通过正则的方式定义在context中了(通过解析配置systemclass名称的字符串得到)

1
2
3
4
5
6
7
    public boolean isSystemClass(String name)
    {
        if (_systemClasses == null)
            loadSystemClasses();
 
        return _systemClasses.match(name);
    }

这里它没有使用tomcat那样多重的继承关系,哪些class是system的,哪些是server的,都是可以自己定义的

1
 public void addSystemClass(String classname)

也可以通过配置文件来定义。

 

通过上面的代码可以看到,一个类被判断为systemclass时,就会委托给系统类加载器,如果是serverclass,就一定会勇webxppClassLoader加载,由于WEB-INF/lib中并没有org.jetty.类,而且由于以下的代码,保证server类不会委托给系统类加载器,所以如果WEB-INF/lib没有,就会报ClassnotFound,从而达到了容器类对于应用不可见的目的。

(测试时,可以在pom中引入jetty的容器类,但定义为provided,或者直接用class.forname之类的方式来测)

分享到:
评论

相关推荐

    jetty-all.jar

    它包含了解析和加载WAR文件、管理Web应用上下文(WebAppContext)以及处理Web应用部署的相关功能。通过这个组件,Jetty能够支持标准的Java Web应用程序的部署和运行。 总的来说,jetty-all.jar是一个包含各种Jetty...

    jetty9.4.11+jetty在idea上的配置教程

    WebAppContext context = new WebAppContext(); context.setWar("path/to/your/webapp"); // 替换为你的Web应用目录 context.setContextPath(System.getProperty("jetty.contextPath")); // 如果你在start.ini中...

    Jetty内嵌服务器实例

    2. **内嵌Jetty的实现**:学习如何通过Java代码创建并启动一个内嵌的Jetty服务器,这通常涉及导入相关的Jetty库,创建Server对象,配置Connector(如HTTP或HTTPS)和Handler(如WebAppContext)。 3. **Servlet容器...

    Jetty 学习资料汇总

    3. **WebAppContext**:WebAppContext是Jetty中用于部署Web应用程序的核心类,可以配置虚拟主机、类加载器等。 4. **Jetty与WebSocket**:介绍Jetty对WebSocket协议的支持,包括创建WebSocket服务器端点和客户端...

    jetty嵌入项目实战

    - 配置Servlet容器,例如使用`org.eclipse.jetty.webapp.WebAppContext`加载Web应用上下文。 3. **实战项目内容** - 项目中包含的jar包可能包括Jetty服务器核心模块、Servlet支持模块、WebSocket支持模块等。 - ...

    jetty嵌入Web编程多种实现方式案例

    除了上述的WebAppContext,Jetty还提供了Handler集成功能,如HandlerList、HandlerWrapper等,可以灵活地管理和组织多个Web应用或Handler。 五、安全性与性能优化 Jetty提供了安全模块,如JAAS认证、SSL/TLS加密等...

    jetty-6.1.26源码

    7. **部署与启动**:Jetty提供了多种方式部署Web应用,如`WebAppContext`用于加载`war`文件。此外,`jetty-run`脚本展示了如何启动服务器。 8. **插件系统**:Jetty的模块化设计允许通过插件扩展功能,如添加安全...

    jetty嵌入式服务器实例大全

    通过`WebAppContext`或`ResourceHandler`,可以设置静态资源目录,使得Jetty能够自动服务这些文件。这在快速搭建小型Web应用或者测试环境时非常方便。 2. **Servlet处理**: Jetty是Servlet规范的实现者,支持...

    jetty8+ 内嵌式启动运行demo

    import org.eclipse.jetty.webapp.WebAppContext; public class JettyEmbeddedDemo { public static void main(String[] args) throws Exception { // 创建服务器对象 Server server = new Server(8080); // ...

    jetty 源码 2018 zip

    5. **WebAppContext**:这是Jetty中用于部署和管理Web应用的主要组件。它将一个Web应用映射到服务器的一个特定虚拟路径,并负责Web应用的生命周期管理。 6. **Continuation**:Jetty提供了对Servlet 3.0中...

    jetty内嵌实现

    import org.eclipse.jetty.webapp.WebAppContext; public class JettyEmbeddedServer { public static void main(String[] args) throws Exception { Server server = new Server(8080); // 设置监听端口 ...

    tomcate和jetty虚拟目录配置方法

    &lt;New class="org.eclipse.jetty.webapp.WebAppContext"&gt; &lt;Set name="contextPath"&gt;/myapp &lt;Set name="war"&gt;file:///D:/myapp ``` 这里的`contextPath`对应虚拟目录的URL路径,`war`属性则指定Web...

    jetty6.1.4 嵌入样例

    import org.mortbay.jetty.webapp.WebAppContext; public class JettyTest { public static void main(String[] args) throws Exception { // 创建服务器实例 Server server = new Server(); // 设置连接器,...

    在嵌入式jetty环境下运行struts2Annotation项目

    在嵌入式Jetty环境下运行Struts2 Annotation项目是一个常见的任务,特别是在开发和测试阶段,因为这种方式能够快速启动服务,而无需依赖大型服务器容器。本文将深入探讨如何配置和执行这个过程,以及涉及的关键技术...

    Android-I-Jetty服务器部署例子代码

    import org.eclipse.jetty.webapp.WebAppContext; public class JettyServer { private Server server; public void start() throws Exception { int port = 8080; // 设置服务器监听端口 server = new Server...

    Jetty使用总结

    &lt;New class="org.mortbay.jetty.webapp.WebAppContext"&gt; &lt;Set name="contextPath"&gt;/jettytest &lt;Set name="war"&gt;./WebRoot&lt;/Set&gt;&lt;!-- Web应用根目录 --&gt; ``` ##### 2. webdefault.xml 这个文件主要...

    jetty-distribution-9.4.31.v20200723.zip

    也可以使用WebAppContext类进行编程式部署。 - **虚拟主机**:Jetty支持多个虚拟主机,可以在同一服务器上运行不同域名的应用。 4. **安全管理** - **角色与权限**:Jetty支持基于角色的访问控制(RBAC),可以...

    简单jetty配置

    3. `&lt;New id="webAppConfig" class="org.eclipse.jetty.webapp.WebAppContext"&gt;`:这是用来配置Web应用的部分,其中`&lt;Set name="contextPath"&gt;/&lt;/Set&gt;`定义了Web应用的上下文路径,而`&lt;Set name="war"&gt;...&lt;/Set&gt;`则...

    jetty-distribution-7.0.0.v20091005.zip

    8. **强大的部署工具**:Jetty提供了WebAppContext类,可以方便地管理和部署Web应用程序,支持WAR文件和解压后的目录结构。 9. **持续更新与社区支持**:Jetty项目由Eclipse基金会维护,拥有活跃的社区和持续的更新...

    jetty for java

    开发者可以将Web应用部署为WAR文件,或者通过WebAppContext直接加载类路径下的资源。 4. **HTTP/HTTPS支持**: Jetty支持HTTP/1.1和HTTP/2协议,并且可以通过添加SSL配置来启用HTTPS,保障数据传输的安全性。 5. ...

Global site tag (gtag.js) - Google Analytics