对于osgi的具体详细讲解可以参看后面的附近,我这里主要是提供大家下载学习,对于想深入了解的人,这里不合适您。附件中主要讲解的是对于一个初学者的认知和简单使用,非常的实用教程。在这里我就不用过多的讲解。
大家可以在附件中下载,如果大家与pdf里面使用的eclipse版本不一致的,可以在启动osgi framework时根据提示要依赖的包进行相应的添加,在学习中使用Equinox框架的包,只要eclipse是在3.1版本之后的都会有的,不用下载的。
附近中主要讲解了Equinox、spring-DM、felix三种osgi框架的应用.
ps:对于书中提供的源码下载,我一打开链接就报404错误。
其实对于没有源码的学习,主要是在学习osgi web开发时会有些迷惘,我就把web这一块的源码分享一下.
1.首先写个简单的servlet类,为了方便我们将这个servlet也写成bundle,这样这个servlet类也能够获取你加载进来的其它组件(但是这个类中确没有,如果大家参看了附件中的pdf,可以将其中的几个本地字典和远程字典查询的组件加载进来,结合这个web项目来使用,我这里就不再结合了),代码如下:
package com.wy.query.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.util.tracker.ServiceTracker; import com.wy.demo.dictquey.query.QueryService; import com.wy.query.tracker.HttpServiceTracker; public class QueryServlet extends HttpServlet implements BundleActivator{ private ServiceReference serviceReference = null; private static BundleContext context; ServiceTracker httpServiceTracker; /** * */ private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String resultString = null; resp.setCharacterEncoding("UTF-8"); resp.setContentType("text/html"); String name= req.getParameter("name"); PrintWriter out = resp.getWriter(); out.write(name + "test success"); out.flush(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } @Override public void start(BundleContext arg0) throws Exception { System.err.println("http activator"); this.context = arg0; httpServiceTracker = new HttpServiceTracker(arg0, this, null); httpServiceTracker.open(); } @Override public void stop(BundleContext arg0) throws Exception { System.out.println("Goodbye http activator"); httpServiceTracker.close(); httpServiceTracker = null; this.context = null; } }
这个类与普通的bundle的区别就在于,它启动时做的事情是:
httpServiceTracker = new HttpServiceTracker(arg0, this, null); httpServiceTracker.open();
就是将服务启动起来,能够让客户端进行访问。而具体的这个HttpServiceTracker怎么实现的?我们可以参看下面的代码:
package com.wy.query.tracker; import javax.servlet.Servlet; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.service.http.HttpService; import org.osgi.util.tracker.ServiceTracker; import org.osgi.util.tracker.ServiceTrackerCustomizer; public class HttpServiceTracker extends ServiceTracker { private Servlet servlet; public HttpServiceTracker(BundleContext context, Servlet servlet, ServiceTrackerCustomizer customizer) { super(context, HttpService.class.getName(), customizer); this.servlet= servlet; } public Object addingService(ServiceReference reference) { HttpService httpService = (HttpService) context.getService(reference); try { System.err.println("注册页面/page/dictquery.html"); httpService.registerResources("/page", "/page/dictquery.html", null); System.err.println("注册servlet QueryServlet"); httpService.registerServlet("/rest",servlet, null, null); } catch (Exception e) { e.printStackTrace(); } return httpService; } public void removedService(ServiceReference reference, Object service) { HttpService httpService = (HttpService) service; httpService.unregister("/page"); httpService.unregister("/rest"); super.removedService(reference, service); } }
这个类主要就是继承了osgi工具类中的 ServiceTracker这个类,将页面中的资源和一些servlet类添加进来,这样你就可以通过启动服。
你就可以http://localhost/page来访问html资源/page/dictquery.html,这个资源就是你在项目中的src路径下建个page文件夹,然后再创建一个dictquery.html页面.
通过http://locahost/rest?name="test"来访问servlet,这个会执行
httpService.registerServlet("/rest",servlet,null, null);
我通过这种方法注册的servlet类,只要你的是在Ip:端口号后面以/rest为结尾的请求,都会执行你注册的这个servlet,而我注册的这个servlet就是我在QueryServlet中对HttpServiceTracker这个类创建时传入的,也就是QueryServlet这个对象,所以我们只要通过http://locahost/rest?name="test"这种方式请求就会执行QueryServlet中的doGet方法
对于osgi想有更多的学习,可以通过http://osgi.com.cn这个网站来进行
相关推荐
OSGi最佳实践: 1. OSGi技术基础: OSGi(Open Services Gateway initiative)是一个基于Java语言的服务平台,它允许运行时动态地安装、更新和卸载软件模块。这些模块被称为bundle。OSGi提供了一个在单一Java虚拟机...
### OSGi最佳实践 #### 引言 OSGi(Open Service Gateway Initiative)作为Java平台上的动态模块系统,为开发者提供了构建健壮、可靠、模块化及可扩展系统的强大工具。此官方权威资料《OSGi最佳实践》由OSGi联盟...
二、OSGi最佳实践 1. 模块设计:遵循模块化原则,每个模块应具有清晰的边界和职责,减少模块间的相互依赖。 2. 依赖管理:利用OSGi的版本管理机制,精确控制模块间的依赖关系,避免版本冲突。 3. 服务设计:合理设计...
二、OSGi最佳实践 1. **合理划分模块**:设计时应尽可能将功能模块化,避免过大的Bundle,同时保持模块间的高内聚、低耦合。 2. **使用版本管理**:为每个导出的包指定版本号,以便于处理API变更和兼容性问题。 3...
资源名称:OSGI原理与最佳实践内容简介:国内第一本OSGi图书OSGi国内推广者林昊多年经验的结晶涵盖OSGi从入门到深入的知识体系引领OSGi国内研究和普及本书基于作者多年使用OSGi的经验而编写,涵盖了OSGi从入门到深入...
OSGI原理与最佳实践的完整版,共12章 第1 章OSGi 简介 第2 章OSGi 框架简介 第3 章基于Spring-DM 实现Petstore 第4 章基于Apache CXF 实现分布式Petstore 第5 章构建OSGI Bundle Repositor'y 第6 章OSGi 规范解读 ...
最后对OSGi知识进行深入讲解,通过对OSGi规范和实现框架(Equinox、Felix、Spring-DM和Apache CXF)的分析,以及最佳实践的介绍,帮助读者更好地掌握如何使用OSGi。 本书适合希望了解、深入掌握OSGi,以及编写模块化...
InfoQ的"OSGi原理与最佳实践精选版"深入探讨了OSGi的关键概念、设计原则以及在实际开发中的应用策略。 OSGi的基本概念包括: 1. **模块化**:OSGi基于JAR(Java Archive)文件进行模块化,每个JAR都是一个独立的...
5. OSGI最佳实践: 掌握OSGI的最佳实践包括:合理划分bundle边界,确保每个bundle有明确的职责;利用Maven或Gradle等构建工具简化bundle打包;使用版本控制管理bundle间的依赖关系;以及充分利用OSGI的动态性进行...
7. **OSGi最佳实践**:最后,文档总结了一系列OSGi的最佳实践,包括将接口和实现分离为不同的 bundles、保持系统的动态性、搭建公司级的 bundle repository、创建共享 library bundle、最小化依赖以及避免启动顺序...
"OSGi原理与最佳实践"这本书可能会详细讲解以上各个方面,并可能包含实例代码和实战经验分享,对于深入理解OSGi并应用到实际项目中非常有帮助。另外,书中可能还会涵盖一些高级话题,如服务事件、远程服务、蓝绿部署...
本文将详细介绍OSGi Equinox的原理、应用以及最佳实践。 一、OSGi Equinox原理 OSGi框架的核心是其模块化系统,它将程序分割成一系列的“Bundle”,每个Bundle都是一个独立的模块,拥有自己的类加载器。这样做的...
OSGi原理与最佳实践基于作者多年使用0SGi的经验而编写,涵盖了0SGi从/kfqN深入的知识体系,从OSGi的简介开始,介绍OSGi的作用及基本概念;其后进入OSGi实战,结合实例讲解如何基于OSGi框架编写模块化、动态化的各种...
OSGi原理与最佳实践完整版_源码