开发环境:Eclipse JEE 3.6(Helio)
开发步骤:
1、创建基于Equinox的plugin工程,工程名为DictQuery,用于定义一个字典查询的接口。
package org.sunny.dictQuery;
public interface QueryService {
String queryWord(String word);
}
2、创建基于Equinox的plugin工程,工程名为RemoteDictQuery,实现了字典查询接口,在Activator类中注册服务。在Manifest.mf配置中导入org.sunny.dictQuery包。
package org.sunny.remote;
import java.util.concurrent.ConcurrentHashMap;
import org.sunny.dictQuery.QueryService;
public class RemoteDictQueryServiceImpl implements QueryService {
private static final ConcurrentHashMap<String, String> dict = new ConcurrentHashMap<String, String>();
static {
dict.put("sky", "天空");
dict.put("computer", "计算机");
}
@Override
public String queryWord(String word) {
System.out.println("RemoteDictQueryServiceImpl.queryWord called!");
String result = dict.get(word);
if (result == null)
result = "N/A";
return result;
}
}
package org.sunny.remote;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import org.sunny.dictQuery.QueryService;
public class Activator implements BundleActivator {
private static BundleContext context;
private ServiceRegistration sr = null;
static BundleContext getContext() {
return context;
}
/*
* (non-Javadoc)
*
* @see
* org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext
* )
*/
public void start(BundleContext bundleContext) throws Exception {
Activator.context = bundleContext;
sr = context.registerService(QueryService.class.getName(),
new RemoteDictQueryServiceImpl(), null);
}
/*
* (non-Javadoc)
*
* @see
* org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext bundleContext) throws Exception {
Activator.context = null;
sr.unregister();
}
}
3、创建基于Equinox的plugin工程,工程名为LocalDictQuery,实现了字典查询接口,采用Declarative Service方法注册服务,此工程不需要Activator类。在Manifest.mf配置中导入org.sunny.dictQuery包。
package org.sunny.ldq;
import java.util.concurrent.ConcurrentHashMap;
import org.sunny.dictQuery.QueryService;
public class LocalDictQueryServiceImpl implements QueryService {
private static final ConcurrentHashMap<String, String> dict = new ConcurrentHashMap<String, String>();
static {
dict.put("test", "测试");
dict.put("china", "中国");
}
@Override
public String queryWord(String word) {
System.out.println("LocalDictQueryServiceImpl.queryWord called!");
String result = dict.get(word);
if (result == null)
result = "N/A";
return result;
}
}
工程下建目录OSGI-INF,Component.xm配置如下。
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="LocalDictService">
<implementation class="org.sunny.ldq.LocalDictQueryServiceImpl"/>
<service>
<provide interface="org.sunny.dictQuery.QueryService"/>
</service>
</scr:component>
4、创建基于Equinox的plugin工程,工程名为QueryServlet,用于提供http服务。
在src目录下创建page目录,置放dictQuery.html,内容如下。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>demo</title>
</head>
<body>
<form action="/query">
<input type="text" name="query_word">
<input type="submit" value="查询" >
</form>
</body>
</html>
QueryServlet类注册servlet和resource,响应http请求。
package org.sunny.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.service.http.HttpService;
import org.sunny.dictQuery.QueryService;
public class QueryServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private QueryService query = null;
private HttpService http = null;
public QueryServlet() {
}
public void setQueryService(QueryService query) {
this.query = query;
}
public void unsetQueryService(QueryService query) {
if (this.query != query)
return;
this.query = null;
}
public void setHttpService(HttpService http) {
this.http = http;
try {
http.registerServlet("/query", this, null, null);
http.registerResources("/static", "page", null);
} catch (Exception e) {
e.printStackTrace();
}
}
public void unsetHttpService(HttpService http) {
this.http.unregister("/query");
this.http.unregister("/static");
this.http = null;
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String word = req.getParameter("query_word");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
if (query != null) {
out.println(query.queryWord(word));
} else {
out.println("no impl for query servcie...");
out.close();
return;
}
}
}
在工程下建立OSGI-INF目录,配置component.xml,以declarative service方式引入QueryService和HttpService。
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="QueryServlet">
<implementation class="org.sunny.servlet.QueryServlet"/>
<reference bind="setQueryService" cardinality="1..1" interface="org.sunny.dictQuery.QueryService" name="QueryService" policy="dynamic" unbind="unsetQueryService"/>
<reference bind="setHttpService" cardinality="1..1" interface="org.osgi.service.http.HttpService" name="HttpService" policy="dynamic" unbind="unsetHttpService"/>
</scr:component>
在Manifest.mf中要导入的包有java.servlet,java.servlet.http,org.sunny.dictQuery,org.osgi.service.http。
5、配置运行时环境。
在osgi控制台输入ss命令,可以看到以下内容。
osgi> ss
Framework is launched.
id State Bundle
0 ACTIVE org.eclipse.osgi_3.6.2.R36x_v20110210
1 ACTIVE org.apache.commons.logging_1.0.4.v201005080501
2 ACTIVE DictQuery_1.0.0.qualifier
3 ACTIVE org.eclipse.equinox.http.jetty_2.0.0.v20100503
4 ACTIVE LocalDictQuery_1.0.0.qualifier
5 ACTIVE org.eclipse.osgi.services_3.2.100.v20100503
6 ACTIVE javax.servlet_2.5.0.v200910301333
7 ACTIVE RemoteDictQuery_1.0.0.qualifier
8 ACTIVE QueryServlet_1.0.0.qualifier
9 ACTIVE org.eclipse.equinox.http.servlet_1.1.0.v20100503
10 ACTIVE org.eclipse.equinox.ds_1.2.1.R36x_v20100803
11 ACTIVE org.mortbay.jetty.server_6.1.23.v201004211559
12 ACTIVE org.mortbay.jetty.util_6.1.23.v201004211559
13 ACTIVE org.eclipse.equinox.util_1.0.200.v20100503
在浏览器输入http://localhost/static/dictQuery.htm访问,填入sky查询,输出“天空”,后台打印“RemoteDictQueryServiceImpl.queryWord called!”。
在osgi控制台输入stop 7命令,停止运行RemoteDictQuery bundle。填入test查询,输出“测试”,后台打印“LocalDictQueryServiceImpl.queryWord called!”。
附件中是这四个工程的project文件,可download并运行,good luck!
- 大小: 63.1 KB
分享到:
相关推荐
在本入门资料中,我们将探讨OSGI的关键概念、优势以及如何通过实战和最佳实践来掌握它。 1. OSGI原理: OSGI的核心在于它的模块系统,称为“bundle”。一个bundle是一个自包含的Java模块,包含了类、资源和元数据...
OSGi(Open Services Gateway Initiative)是一种Java平台上的模块化服务框架,它定义了一种标准,使得开发者能够构建可互操作的、动态的、模块化的软件系统。OSGi的核心概念是基于Java的模块化,它的主要目标是为...
OSGi的入门资料,网上找的,初探OSGi 的全文
标题"OSGI入门和例子"意味着我们将探讨OSGI的基本概念以及如何通过实例来学习和理解这个框架。下面,我们将深入讨论OSGI的关键知识点: 1. **模块系统**:OSGI的核心是模块化,它定义了一种基于Java导出和导入包的...
学习OSGI入门和整合Spring,对于开发复杂的企业级应用,或者想要提升系统灵活性和可维护性的开发者来说,是非常有价值的。通过理解OSGI的模块化机制和Spring的依赖注入原理,可以构建出更加高效和可扩展的Java应用。
### Spring OSGi 入门知识点...以上内容为Spring OSGi入门的基本知识点,涵盖了Spring DM的基础概念、配置方法以及如何在OSGi环境中导出和引用服务等内容。这些知识点对于理解如何将Spring与OSGi结合使用具有重要意义。
《OSGI入门和整合Spring》则关注OSGI与Spring框架的结合,主要讨论: 1. **Spring与OSGI集成原理**:Spring的bean管理如何与OSGI服务机制相结合,实现更灵活的依赖注入。 2. **Declarative Services(DS)**:利用...
下面将详细介绍Spring OSGi的基本概念、优势以及如何入门。 一、Spring OSGi 基本概念 1. Spring Framework:Spring是一个全面的Java企业级应用开发框架,提供依赖注入、AOP(面向切面编程)、数据访问、事务管理...
很基础全面的OSGI ppt教程,讲解的很详细。
### OSGi 入门与实践 #### OSGi 的历史背景 OSGi,全称为 Open Service Gateway Initiative,从字面上理解,它最初被设计为一个面向服务的平台。1999 年,OSGi 联盟成立,旨在为通过网络向设备提供服务建立开放的...
在OSGI入门阶段,首先要理解的是它的基本概念,如bundle(模块)、服务、生命周期管理和依赖管理。Bundle是OSGI中的核心组件,它类似于Java的JAR文件,但具有自己的元数据和生命周期。每个bundle可以导出和导入服务...
在OSGi入门篇:模块层这篇文章中,作者静默虚空深入探讨了OSGi框架中模块层的基础知识以及设计模块层时OSGi联盟所做的考虑。OSGi模块层是框架中最基础的部分,它实现了Java的模块化特性,但又与Java现有的模块化特性...
### Spring OSGi 入门知识点详解 #### 一、Spring-DM与OSGi结合的优势 Spring Dynamic Modules (Spring DM) 是Spring Framework的一个扩展项目,它使得Spring可以在OSGi环境中运行,进而为开发者提供了模块化的...
Spring OSGi 是一个将 Spring 框架与 OSGi(Open Service Gateway Initiative)容器相结合的开源项目,旨在提供一种在 ...提供的压缩包文件可能包含了入门手册和示例代码,这些资源将有助于你快速上手 Spring OSGi。
**入门篇** 1. **模块系统**:OSGi的核心是模块化,每个模块称为一个Bundle,它包含类、资源和元数据。Bundle之间通过导出和导入包来实现依赖关系。 2. **生命周期管理**:OSGi Bundle有启动、停止、安装、更新和...