`
snoopy7713
  • 浏览: 1146818 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

OSGi技术在Java Web开发中的应用

    博客分类:
  • OSGi
阅读更多

随着 Java SE 对模块化功能原生支持的一再推迟(据最新的消息, Jigsaw项目—— Java SE中的 标准模块系统 —— 的开发工作相对滞后,已经延期到了 Java 9 ,而 Java 9 2015 年才有希望发布), OSGi 作为事实标准的 Java 模块化实现得到了长足的发展,尤其是随着云计算和分布式技术的兴起, OSGi 这种模块化、动态部署的核心功能将会受到越来越多的重视。

目前 OSGi 规范的主流实现框架是 Eclipse Equinox 以及 Apache Felix ,其实际的应用场景也早就从起初的嵌入式设备扩展到桌面应用甚至 Java 企业级开发领域。最为大家所熟知的 OSGi 应用是 Eclipse IDE ,其实像 Sun GlassFish IBM WebSphere Application Server JBoss Application Server 以及 Apache 的大量开源项目如 Camel Sling ServiceMix Kafaf 等都使用了 OSGi 技术,随着其应用的日益广泛,技术的可用性和成熟度经受了充分的考验,实践证明 OSGi 是一项可靠的技术,完全可以应用于企业级应用的开发。尤其值得一提的是,随着 OSGi Core Release 5 OSGi Enterprise Release 5 版本的发布,预计 OSGi 技术将会受到更多的关注,国内外已经有将 OSGi 应用于云计算和分布式计算的案例。

本文将选取 OSGi 应用于传统 Java Web 开发的场景,介绍借助于 OSGi 技术,怎样实现将 web 应用拆分成满足 OSGi 规范的 bundle ,实现组件的动态部署。目前,为了实现在 bundle 中支持 JSP Servlet Java Web 开发技术和规范,有两种主要的开发部署方式,本文都将进行介绍,但是这两种方案在实现上与传统的 Java Web 应用开发模式有较大的不同,且对 JEE 规范的支持尚不完整

 

按照Eclipse Equinox的习惯,会将bundle称为插件,在后文中会根据具体的应用场景穿插使用这两个名词,但其本质是相同的。 

 

<!--[if !supportLists]-->一、 将Web容器作为bundle置于 Equinox中进行开发  

在这种模式下,我们需要将支持 JEE 规范的容器也以 bundle 形式发布到 OSGi 容器中,而包含 JSP Servlet bundle 将会使用该容器接受对请求的访问,这种方式的好处在于 OSGi 容器管理整个运行环境,是个纯粹的可热插拔运行环境,其缺点在于需要 Web 容器支持以 bundel 的形式进行发布,对运行环境有一定的限制,目前支持该要求的 Web 容器有 Tomcat Jetty ,但是主流的企业级应用服务器尚不支持这种部署方式。

鉴于 Eclipse 开发环境中已经包含了 Jetty 服务器,所以我们将会使用该服务器进行 Web 应用的开发。

首先我们需要使用 Eclipse 的工程向导创建一个插件工程。根据工程的需要,我们不生成启动类( activator ),不使用任何模版,插件过程如下:

新建一个插件工程:



 输入工程的基本信息:



 此处我们不使用任何模版,因为我们不会用到 Eclipse UI 功能:



 新建完成的项目结构如下所示:



 为了测试进行 Web 开发,我们新建目录结构 /WebRoot/jsp (该目录名称是任意的,只需在后续定义扩展点时进行匹配即可)并在该目录下创建一个 JSP 文件,此时的工程结构如下:



 JSP 的代码如下:

 

 

Html代码  收藏代码
  1. < %@ page  language = "java"   contentType = "text/html; charset=ISO-8859-1"   
  2.     pageEncoding = "ISO-8859-1" % >   
  3.   
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">   
  5. < html >   
  6. < head >   
  7. < meta   http-equiv = "Content-Type"   content = "text/html; charset=ISO-8859-1" >   
  8. < title > Insert title here </ title >   
  9. </ head >   
  10. < body >   
  11. Hello,world!  
  12. </ body >   
  13. </ html >    

 

为了使用 JSP Servlet ,我们需要使用一个扩展点,该扩展的名称为 org.eclipse.equinox.http.registry.servlets ,我们需要使用该扩展点进行 JSP 目录和访问地址的匹配,在我们这个样例中我们匹配了 /WebRoot/jsp 目录,其访问地址的前缀将会是 /jsp/


 除此以外,我们还需要添加对 org.eclipse.equinox.jsp.jasper.registry 插件的依赖,以实现 JSP 的编译功能。

 


 最后,我们还需要在运行时配置里将 testweb Jetty 所依赖的插件全部选中,如下:

 

 



 然后点击“ Run ”按钮,此时就会启动 OSGi 运行环境,我们可以在控制台通过使用“ ss ”命令来查看运行插件的状态情况:


 

此时,我们可以在浏览器中输入 http://localhost/jsp/index.jsp Jetty 的默认端口是 80 ,可进行配置),就会看到我们所编写的 JSP 的代码了:



          要实现访问 Servlet 和静态资源( CSS 、图片等),也需要类似的配置,下图是一个包含静态资源和 Servlet 的配置样例:

 

 

 

Xml代码  收藏代码
  1. <? xml   version = "1.0"   encoding = "UTF-8" ?>    
  2.  <? eclipse   version = "3.4" ?>    
  3.  < plugin >    
  4.  < extension    
  5.     point = "org.eclipse.equinox.http.registry.servlets" >    
  6.      < servlet    
  7.          alias = "/servlet/myfirstservlet"    
  8.          class = "testjsp.LoginServlet"   
  9.          load-on-startup = "true" >        
  10.      </ servlet >    
  11.      < servlet    
  12.         alias = "/jsp/*.jsp"   
  13.         class = "org.eclipse.equinox.jsp.jasper.registry.JSPFactory:/WebRoot/jsp/" >    
  14.      </ servlet >    
  15.  </ extension >   
  16.  < extension   
  17.        point = "org.eclipse.equinox.http.registry.resources" >   
  18.         < resource   
  19.      alias = "/web"   
  20.      base-name = "/WebRoot/images" />   
  21.  </ extension >    
  22.  </ plugin >   
 

 

二、 Equinox 置于 web 容器中进行开发

 

以上的开发模式对于习惯于传统 JEE 开发模式的开发人员在接受上有一定的难度,直接使用 Equinox 作为运行环境在解决集群部署方面也有一定的难度,除此以外,主流的应用服务器并不提供 bundle 形式的 jar 以运行在 OSGi 容器中。所以,开发人员摸索出了另一种开发和部署模式。

在这种模式中,会将 Equinox 和我们开发的插件都打成一个标准的 war 包的格式,因此可以运行在任意支持 JEE 的容器中。 Equinox 的生命周期是通过 Servlet 来进行控制。这种模式被称为桥接模式。 Equinox 官方提供了该模式的实现,后来的社区贡献者基于此进行了功能的完善。

将下载后的代码导入到 Eclipse 中,工程目录如下所示:



 从该目录可以看出,这是一个典型 JEE 工程,可以运行在任意的支持规范的 Web 容器或应用服务器中,查看 web.xml ,我们可以看到这样的配置:

 

Xml代码  收藏代码
  1. < servlet   id = "bridge" >   
  2.         < servlet-name > equinoxbridgeservlet </ servlet-name >   
  3.         < display-name > Equinox Bridge Servlet </ display-name >   
  4.         < description > Equinox Bridge Servlet </ description >   
  5.         < servlet-class > org.eclipse.equinox.servletbridge.BridgeServlet </ servlet-class >   
  6.         < init-param >   
  7.             < param-name > commandline </ param-name >   
  8.             < param-value > -console </ param-value >            
  9.         </ init-param >        
  10.         < init-param >   
  11.             < param-name > enableFrameworkControls </ param-name >   
  12.             < param-value > true </ param-value >            
  13.         </ init-param >   
  14.         < init-param >   
  15.             < param-name > extendedFrameworkExports </ param-name >   
  16.             < param-value > </ param-value >            
  17.         </ init-param >   
  18.         < load-on-startup > 1 </ load-on-startup >   
  19.     </ servlet >   
  20.     < servlet-mapping >   
  21.         < servlet-name > equinoxbridgeservlet </ servlet-name >   
  22.         < url-pattern > /* </ url-pattern >   
  23.     </ servlet-mapping >   
  24.     < servlet-mapping >   
  25.         < servlet-name > equinoxbridgeservlet </ servlet-name >   
  26.         < url-pattern > *.jsp </ url-pattern >   
  27.     </ servlet-mapping >       

 我们可以看到这个 Servlet 拦截了所有的请求,由该 Servlet 代理所有的请求。

在部署阶段,可以把插件打成 jar 包,放到 /WEB-INF/eclipse/plugins 目录下即可。如将我们上例中的 testweb 导出为 jar 包后,置于指定目录下。然后在 Tomcat 中运行该应用。访问 http://localhost:8080/bridge/jsp/index.jsp 就可以看到我们编写的 JSP 页面了。

使用以上的模式进行开发,对原有的开发和部署模式冲击较小而且支持所有的应用服务器。

 

参考资料:

 

http://www.ibm.com/developerworks/cn/web/0907_osgiweb_liuqing/

分享到:
评论

相关推荐

    基于OSGi和Spring开发Web应用.doc

    在基于 OSGi 和 Spring 的 Web 应用开发中,我们可以使用 Spring-DM 来实现模块化部署和管理。Spring-DM 是 Spring 开发组织在 2008 年发布的,将 OSGi 和 Spring 结合的第一个版本。dm Server 是一个完全模块化部署...

    基于OSGi和Spring开发Web应用

    Spring-DM,即Spring Dynamic Modules,是Spring官方在2008年推出的项目,旨在将Spring框架与OSGi模块化平台相结合,为Java开发者提供了一套全面的工具和API,以支持在OSGi环境中开发、部署和管理Spring应用程序。...

    基于OSGi和Spring开发Web应用教程

    在基于OSGi和Spring开发Web应用中,OSGi(Open Services Gateway Initiative)是一个开放标准,用于创建模块化Java应用程序。它允许开发者将应用程序分解为独立的模块,称为bundle,每个bundle都包含自己的类路径、...

    OSGi与Web容器的整合

    为了在Eclipse中开发OSGi Web应用,需要安装相应的插件,如Gemini Web的支持,以便创建和管理WAB项目。 **2.4 设置目标平台** 目标平台是开发和运行OSGi应用的基础,需要包含必要的OSGi框架(如Equinox)、Gemini ...

    基于OSGi和Spring开发Web应用的Demo

    在基于OSGi和Spring的Web应用开发中,通常会将业务逻辑、服务接口和Web层分别封装在不同的模块中。根据压缩包子文件的文件名称,我们可以推测这些文件可能代表了这样的模块结构: 1. `...

    OSGi Web示例工程

    Web示例工程是使用OSGi技术构建的一个具体应用,通常包括了如何在OSGi环境中部署和运行Web应用程序的实例。 在OSGi框架中,Equinox是Eclipse基金会提供的一个实现,它是OSGi规范的主要实现之一,广泛应用于服务器端...

    OSGi, Spring , Web

    "html5演示"暗示有HTML5技术的应用实例,HTML5是现代Web开发的标准,提供了更好的多媒体支持、离线存储和更强大的表单控件。"freemarker运用"则提到了Freemarker,这是一款开源的模板引擎,常用于生成动态HTML页面,...

    基于osgi整合ssm框架注解开发

    SSM(Spring、SpringMVC、MyBatis)框架是Java Web开发中常见的技术栈,而OSGi(Open Service Gateway Initiative)则是一种模块化系统,主要用于解决Java应用程序的动态性、可扩展性和版本管理问题。将SSM框架与...

    osgi 在web容器中部署

    在Web容器中部署OSGi应用,特别是像Tomcat这样的流行Servlet容器,可以提高应用的灵活性、可维护性和可扩展性。本文将详细介绍如何使用桥接技术(如Apache Felix的WebConsole或Pax Web)在Tomcat中部署OSGi程序。 ...

    OSGI中包含web服务器配置需要的jar.zip

    在OSGI中集成Web服务器配置,是为了能够在模块化的环境中运行Web应用。这个压缩包"OSGI中包含web服务器配置需要的jar.zip"很可能包含了运行OSGI环境下的Web工程所需的特定jar文件。这些jar文件可能包括了OSGI容器...

    基于OSGI的Web开发例子

    本示例以“基于OSGI的Web开发例子”为主题,主要介绍了如何利用Equinox框架在OSGi环境中进行Web应用的开发,通过一个简单的“Hello World”项目来展示其工作原理。 首先,我们需要理解Equinox。Equinox是Eclipse...

    基于virgo环境的OSGI+Maven的web开发代码下载(spring+hibernate+GWT)

    标题中的“基于virgo环境的OSGI+Maven的web开发代码下载”表明这是一个使用OSGi(模块化Java系统)和Maven构建的Web应用程序项目,运行在Virgo服务器上。Virgo是SpringSource推出的一个OSGi应用服务器,它支持Spring...

    开发一个简单的 OSGi Web 应用实例

    ### 开发一个简单的 OSGi Web 应用实例 #### 一、项目概述 本教程旨在通过一个具体的示例来介绍如何使用OSGi框架开发一个简单的Web应用。这个示例应用能够计算两个数字的和或乘积,并展示了OSGi bundle的动态部署...

    基于OSGi的Web应用开发系列(全).pdf

    **基于OSGi的Web应用开发**是现代软件开发中的一种技术实践,它允许开发者构建模块化、可扩展和可维护的Web应用。OSGi(Open Service Gateway Initiative)是一种开放的标准,提供了一种服务导向的、模块化的Java...

Global site tag (gtag.js) - Google Analytics