`
snoopy7713
  • 浏览: 1123487 次
  • 性别: 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

    java 基于OSGi和Spring开发Web应用

    OSGI的较全资料(9+4)

    包括OSGI的相关书籍及网页: OSGi R4服务平台核心规范中译本 Spring OSGI入门 modular java OSGI原理与最佳实践 ...基于 OSGi 和 Spring 开发 Web 应用 基于 OSGi 的面向服务的组件编程 探索 OSGi 框架的组件运行机制

    OSGI原理最佳实践(包含源代码)

    是一本适合新接触OSGI开发学习的一本很好的书,本书介绍了Equinox, Spring-DM和Felix这三个常用的OSGi容器的使用、开发、以及WebApplication的开发部署;介绍了OSGi的规范和Core Framework和Layer。包含书中的用例源...

    JAVA上百实例源码以及开源项目

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    jemma.osgi.dal.web-apis:jemma.osgi.from.web-apis

    DAL WEB API提供对OSGi设备抽象层中可用的设备,功能和事件的REST和WebSocket访问。 REST API用于提供对设备和功能服务的访问。 函数操作调用和FunctionData编辑是使用Java Reflection实现的。 WebSocket API提供了...

    JAVA上百实例源码以及开源项目源代码

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    java类加载器实例

    现在类加载器在 Web 容器和 OSGi 中得到了广泛的使用。一般来说,Java 应用的开发人员不需要直接同类加载器进行交互。Java 虚拟机默认的行为就已经足够满足大多数情况的需求了。不过如果遇到了需要与类加载器进行...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    应用技术 计算机基础知识 cpu mem disk net 线程,进程 第三方库 poi Jsoup zxing Gson 数据结构 树 栈 链表 队列 图 操作系统 linux 代码控制 自动化代码检查 sonar 代码规范 阿里巴巴...

    java开源包4

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包11

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包6

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包9

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包101

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包5

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包8

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包10

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包1

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包3

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

Global site tag (gtag.js) - Google Analytics