<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 19, 文章 - 1, 評論 - 21, 引用 - 0
    數據加載中……

    打造一個基于OSGi的Web Application——使用Tomcat原生API來動態管理Web元素:原理

    Tomcat的org.apache.catalina.Context接口提供了動態管理注入到Catalina Web Container中的Web元素的API。在基于OSGi的Web Application中,可以利用這個接口來實現在OSGi容器中動態管理Web元素的目的。為了達到這個目的,我們還需要做一些額外的配置。請注意,以下方法僅適用于Tomcat,并非通用的實現,而且只針對5.5.28版和6.0.24版的Tomcat做過簡單的測試。


    首先我們要做的事情,就是將Tomcat的org.apache.catalina.Context實現類作為Service注入到OSGi容器中去。在OSGi-Web工程的WebContent/META-INF目錄中,增加一個context.xml文件,內容如下:
    1 <?xml version="1.0" encoding="UTF-8"?>
    2 <Context privileged="true"/>
    這樣我們就可以使用org.apache.catalina.ContainerServlet這個接口類了,通過它可以訪問Catalina的內部功能,它有Catalina被類加載器加載,而不是我們的WebApplication類加載器。它的 Setter方法在這個Servlet的新的實例被放進Service時被執行。
    接下來我們寫一個Servlet,這個Servlet將實現ContainerServlet接口,請注意它是怎么工作的:
     1 package org.dbstar.osgi.web.launcher.tomcat;
     2 
     3 import java.util.Properties;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.UnavailableException;
     7 import javax.servlet.http.HttpServlet;
     8 
     9 import org.apache.catalina.ContainerServlet;
    10 import org.apache.catalina.Context;
    11 import org.apache.catalina.Wrapper;
    12 import org.dbstar.osgi.web.launcher.FrameworkConfigListener;
    13 import org.osgi.framework.BundleContext;
    14 import org.osgi.framework.ServiceRegistration;
    15 import org.osgi.framework.launch.Framework;
    16 
    17 public final class TomcatContextServlet extends HttpServlet implements ContainerServlet {
    18     private static final long serialVersionUID = -3977062987005392657L;
    19 
    20     private Wrapper wrapper;
    21     private Context context;
    22 
    23     private ServiceRegistration registration;
    24 
    25     public Wrapper getWrapper() {
    26         return wrapper;
    27     }
    28 
    29     public void setWrapper(Wrapper wrapper) {
    30         this.wrapper = wrapper;
    31         if (wrapper == null) context = null;
    32         else context = (Context) wrapper.getParent();
    33     }
    34 
    35     @Override
    36     public void init() throws ServletException {
    37         // Ensure that our ContainerServlet properties have been set
    38         if ((wrapper == null|| (context == null)) throw new UnavailableException("Wrapper not set.");
    39 
    40         // Ensure that Framework have been set
    41         Framework framework = FrameworkConfigListener.getFramework();
    42         if (framework == nullthrow new UnavailableException("Framework not set.");
    43 
    44         // 將context注冊為服務
    45         registration = registerContext(framework.getBundleContext(), context);
    46     }
    47 
    48     private static ServiceRegistration registerContext(BundleContext bundleContext, Context context) {
    49         Properties properties = new Properties();
    50         properties.setProperty("DisplayName", context.getDisplayName());
    51         properties.setProperty("ContextPath", context.getPath());
    52         return bundleContext.registerService(Context.class.getName(), context, properties);
    53     }
    54 
    55     @Override
    56     public void destroy() {
    57         if (registration == nullreturn;
    58 
    59         Framework framework = FrameworkConfigListener.getFramework();
    60         if (framework == nullreturn;
    61 
    62         if (framework.getState() == Framework.ACTIVE) registration.unregister();
    63         registration = null;
    64     }
    65 }
    通過ContainerServlet接口提供的setWrapper方法,我們獲得了一個Wrapper實例,這個實例對應于TomcatContextServlet部署到Tomcat中的封裝類,通過其getParent方法我們就可以獲得Servlet所在的Context了。
    接下來在init方法中,我們將獲得的Context實例,通過Framework注冊到OSGi容器中去。在destroy方法中,注銷Context的注冊,這樣形成了一個完整的生命周期。
    然后,將這個TomcatContextServlet部署到web.xml中去:
    1     <!-- register a org.apache.catalina.Context to OSGi Container    -->
    2     <servlet>
    3         <servlet-name>TomcatContextServlet</servlet-name>
    4         <servlet-class>org.dbstar.osgi.web.launcher.tomcat.TomcatContextServlet</servlet-class>
    5         <load-on-startup>1</load-on-startup>
    6     </servlet>
    設置<load-on-startup>使這個Servlet在WebContainer初始化時加載,否則它將沒有加載的機會,因為我們在應用中不會直接使用到這個Servlet。

    最后還有一件事情不要忘記了,我們需要將org.apache.catalina及其相關的package export到OSGi容器中去,這樣才能在OSGi容器中供給bundle來import。參照《打造一個基于OSGi的Web Application——為OSGi容器提供Web Application環境》一文中提到的方式,我們將catalina.jar作為extension Fragment的方式,引入到OSGi容器中去。
    Catalina的MANIFEST.MF:
     1 Manifest-Version: 1.0
     2 Bundle-ManifestVersion: 2
     3 Bundle-Name: Catalina Extension Fragment
     4 Bundle-SymbolicName: org.apache.catalina_extension;singleton:=true
     5 Bundle-Version: 5.5.28
     6 Bundle-Vendor: dbstar
     7 Fragment-Host: system.bundle; extension:=framework
     8 Bundle-RequiredExecutionEnvironment: J2SE-1.5
     9 Export-Package: org.apache.catalina,org.apache.catalina.authenticator,
    10  org.apache.catalina.connector,org.apache.catalina.core,org.apache.cat
    11  alina.deploy,org.apache.catalina.loader,org.apache.catalina.mbeans,or
    12  g.apache.catalina.realm,org.apache.catalina.security,org.apache.catal
    13  ina.session,org.apache.catalina.startup,org.apache.catalina.users,org
    14  .apache.catalina.util,org.apache.catalina.valves

    在接下來的章節中,我會逐一描述如何在基于Tomcat的OSGi容器中,如何實現各種Web元素的動態管理,盡請期待哦:)

    最后提供幾個本章提到的bundle給大家下載,大家就不用自己再起生成一個了。
    org.apache.catalina_extension_5.5.28.jar


    posted on 2010-04-01 12:02 dbstar 閱讀(3101) 評論(0)  編輯  收藏 所屬分類: OSGi

    主站蜘蛛池模板: 亚洲色偷偷综合亚洲AV伊人蜜桃| 亚洲精品美女在线观看| 亚洲AV无码乱码在线观看牲色 | 美女一级毛片免费观看| 一级毛片免费全部播放| 国色精品va在线观看免费视频 | 国产一级高青免费| AV无码免费永久在线观看| 最近高清国语中文在线观看免费| 四虎永久在线精品免费观看地址| 久久综合亚洲色HEZYO国产| 亚洲综合色一区二区三区小说| 一级毛片免费观看不卡视频| 性xxxx视频播放免费| 中国亚洲女人69内射少妇| 亚洲精品无AMM毛片| 全部免费毛片在线播放| 五月婷婷亚洲综合| 亚洲一欧洲中文字幕在线| WWW免费视频在线观看播放| 成人在线视频免费| 爱情岛亚洲论坛在线观看| 亚洲精品国产免费| 久久精品国产亚洲麻豆| 青青青亚洲精品国产| 国产精品亚洲mnbav网站| 综合一区自拍亚洲综合图区| 国产av无码专区亚洲国产精品| 免费看搞黄视频网站| 亚洲色爱图小说专区| 成人免费观看男女羞羞视频| 免费高清av一区二区三区| 2022年亚洲午夜一区二区福利| fc2成年免费共享视频网站| 国产成人免费一区二区三区| 亚洲人成77777在线观看网| 在线免费观看亚洲| 亚洲国产精品久久久久| 丝瓜app免费下载网址进入ios| 亚洲人成影院在线| 国产一级大片免费看|