Equinox Server-side(三)
因为OSGi是最早为嵌入式系统设计,所以OSGi标准中的HTTP服务只提供了有限的Servlet与静态资源的发布功能,没有一个完整的WEB容器概念,这种模式更适合通过WEB方式暴露(Export)服务,不太适合开发展现层的WEB应用。
现在有个开源项目opengoss通过对OSGi插件体系的扩展,基本实现了Servlet容器
具体实现:"插件"与我们通常所说软件"模块"的一个区别是:插件能自我描述,加载运行在插件容器中。那么,我们可以分层扩展一个插件的自我描述,用类似Decorator的模式为插件增加“特征”描述。 所以,我们在OpenCore中定义了三种特征的插件.
这三种插件类型间关系类似Decorator模式,从内到外增加"特征"描述:
OSGi标准插件,自描述文件"META-INF/MANIFEST.MF"
OpenCore插件,增加自描述文件"META-INF/opencore.xml",实现符合OSGi环境的依赖注册(IoC)与动态扩展点
OpenCore Web插件,增加自描述文件"WEB-INF/web.xml"(符合Servlet规范),WEB特性的插件,可以部署在Servlet容器内 .
部署图:
来看看具体怎么做
先下载opengoss的org.opengoss.osgi.core,org.opengoss.web.core,org.opengoss.web.jetty
http://opengoss.googlecode.com/svn
具体的bundle都要依赖于上面的bundle
然后就可以基于这个写具体的web层了
新建一个插件项目..这个时候的Activator和以前的就不一样了
它要继承自WebPluginActivator.如下
public class Activator extends WebPluginActivator {
@Override
protected ClassLoader getClassLoader() {
return Activator.class.getClassLoader();
}
}
然后在META-INF下添加OPENCORE.xml如下
<?xml version="1.0" encoding="utf-8"?>
<plugin id="test" version="1.0" />
这里的id直接影响了这个应用的URI
在web.xml里添加
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>
org.opengoss.web.internal.jetty.DefaultServlet
</servlet-class>
<init-param>
<param-name>acceptRanges</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>dirAllowed</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>redirectWelcome</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>maxCacheSize</param-name>
<param-value>2000000</param-value>
</init-param>
<init-param>
<param-name>maxCachedFileSize</param-name>
<param-value>254000</param-value>
</init-param>
<init-param>
<param-name>maxCachedFiles</param-name>
<param-value>1000</param-value>
</init-param>
<init-param>
<param-name>useFileMappedBuffer</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
OK,接下去就可以写正真的应用了….
写完之后连同opengoss的bunlde一起放到osgi环境下就可以跑起来了
目前opencore还实现了简单的IOC容器
就是在opencore.xml来配置依赖关系
OpenCore IoC容器有下面几个特性:
1.完全基于OSGi的插件体系结构。
2.简单,远没有Spring IoC容器复杂,支持属性注射(Property Injection)与构造函数注册(Constructor Injection)。
3.分级IoC容器,分为插件级、应用程序级、网络级
4.IoC容器管理的服务与OSGi框架管理的服务可以互访,这样保证了OpenCore IoC不会屏蔽OSGi本身的模型,使得基于OpenCore IoC的插件与大量第三方基于完全基于OSGi服务模型的插件可以协作。
5.支持通过动态扩展点实现1对多的依赖注册机制。