第一个OSGI开发实例-简易字典查询程序
2014-03-16 18:49
375 查看
由于是初次接触OSGI开发,先模仿编写一个简易字典查询程序,用于理解基于OSGI的程序开发。
要求:实现一个B/S应用的简易字典查询,提供一个字典服务,用户在浏览器中输入一个单词,点击查询,给出这个单词的解释(由于是练习程序,所以仅仅支持很少单词的查询)。
有四个Bundle,分别是字典查询响应Bundle,字典查询接口Bundle,本地字典服务Bundle,远程字典服务Bundle。
![](https://img-blog.csdn.net/20140316183736296?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb1RlbmdZdWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
下面分析介绍它们。
1.字典查询响应Bundle
提供输入要查询单词的页面,接受用户的查询请求,从 BundleContext 中获取字典服务的Service,
调用字典服务的查询接口得到查询结果,并返回结果到页面。
2.字典查询接口 Bundle
对外提供字典查询的接口。
3.本地字典服务Bundle
提供字典查询服务,是从本地的字典中查询结果。
4.远程字典服务Bundle
提供字典查询服务,是从远程的字典中查询结果。
此次主要用OSGI框架嵌入Http服务器的方式开发。
首先配置开发环境,点击Run->Run Configurations选择开发运行所需要的Bundle,注:如缺少某些Bundle请去官方网站下载http://archive.eclipse.org/equinox/drops/R-3.6.2-201102101200/
![](https://img-blog.csdn.net/20140316183847718?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb1RlbmdZdWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
(1)完成字典查询接口Bundle工程。
创建名为DictQuery的Plug-in工程,其中注意an OSGI framework选择standard选项
![](https://img-blog.csdn.net/20140316183936734?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb1RlbmdZdWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20140316184044578?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb1RlbmdZdWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
然后在org.haiwi.demo.dictquery包下创建接口QueryService
点击META-INF文件夹下的MANIFEST.MF文件,点击选项卡Runtime点击Exported Packages下的Add添加org.haiwi.demo.dictquery包为其他Bundle提供服务,则MANIFEST.MF文件会多出一行配置Export-Package:org.haiwi.demo.dictquery
![](https://img-blog.csdn.net/20140316184114781?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb1RlbmdZdWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
(2)完成本地字典查询Bundle
同(1)创建名LocalDictQuery的插件工程
导入字典查询接口Bundle,即打开LocalDictQuery工程的META-INF下的MANIFEST.MF文件选择Dependencies页签,点击Imported Packages的Add,选择org.haiwi.demo.dictquery包。
![](https://img-blog.csdn.net/20140316184144359?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb1RlbmdZdWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
编写实现QueryService接口的类LocalDictQueryServiceImpl,实现DictQuery函数体
最后编写Activator的代码,在Bundle启动时候注册我们提供的字典查询服务,停止时卸载字典查询服务。在org.haiwi.demo.localdictquery包下建立类LocalDictQueryActivator。
(3)完成实现远程字典查询Bundle。
创建工程名RemoteDictQuery,过程和LocalDictQuery类似,
其中实现代码做一下改动
(4)完成字典查询响应Bundle
首先在插件工程DictQuery的Src目录下创建page文件夹用于存放html页面,创建org.haiwi.demo.servlet包下存放对应的响应servlet,并在org.haiwi.demo.dictquery下创建Activator。
![](https://img-blog.csdn.net/20140316184245875?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb1RlbmdZdWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
其中要引用Servlet API。同时要引入javax.servlet和javax.servlet.http两个包。
![](https://img-blog.csdn.net/20140316184343156?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb1RlbmdZdWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
其中类QueryServiceActivator代码如下
其中类DictQueryServlet代码如下
其中DictQuery.html代码如下
(5)配置运行环境点击Run->Run Configurations选择如下
![](https://img-blog.csdn.net/20140316184427546?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb1RlbmdZdWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
点击运行(下次无须配置直接点运行即可)启动Bundle服务,此时可以通过输入ss命令查看各Bundle的运行状态。 可以先输入ss命令(stop 28)停止LocalDictQuery Bundle服务,只用RemoteDictQuery Bundle服务,输入查询Key值查看结果如下
![](https://img-blog.csdn.net/20140316184501750?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb1RlbmdZdWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20140316184519906?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb1RlbmdZdWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20140316184638375?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb1RlbmdZdWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
然后先输入ss命令(start 28;stop 32)开启LocalDictQuery Bundle服务,停止RemoteDictQuery Bundle服务,输入查询Key值查看结果如下
![](https://img-blog.csdn.net/20140316184705046?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb1RlbmdZdWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20140316184726468?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb1RlbmdZdWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20140316184748031?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb1RlbmdZdWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
要求:实现一个B/S应用的简易字典查询,提供一个字典服务,用户在浏览器中输入一个单词,点击查询,给出这个单词的解释(由于是练习程序,所以仅仅支持很少单词的查询)。
有四个Bundle,分别是字典查询响应Bundle,字典查询接口Bundle,本地字典服务Bundle,远程字典服务Bundle。
下面分析介绍它们。
1.字典查询响应Bundle
提供输入要查询单词的页面,接受用户的查询请求,从 BundleContext 中获取字典服务的Service,
调用字典服务的查询接口得到查询结果,并返回结果到页面。
2.字典查询接口 Bundle
对外提供字典查询的接口。
3.本地字典服务Bundle
提供字典查询服务,是从本地的字典中查询结果。
4.远程字典服务Bundle
提供字典查询服务,是从远程的字典中查询结果。
此次主要用OSGI框架嵌入Http服务器的方式开发。
首先配置开发环境,点击Run->Run Configurations选择开发运行所需要的Bundle,注:如缺少某些Bundle请去官方网站下载http://archive.eclipse.org/equinox/drops/R-3.6.2-201102101200/
(1)完成字典查询接口Bundle工程。
创建名为DictQuery的Plug-in工程,其中注意an OSGI framework选择standard选项
然后在org.haiwi.demo.dictquery包下创建接口QueryService
package org.haiwi.demo.dictquery; public interface QueryService { /* * author:Haiwi * 输入查询word * 返回查询结果 */ String QueryWord(String word); }
点击META-INF文件夹下的MANIFEST.MF文件,点击选项卡Runtime点击Exported Packages下的Add添加org.haiwi.demo.dictquery包为其他Bundle提供服务,则MANIFEST.MF文件会多出一行配置Export-Package:org.haiwi.demo.dictquery
(2)完成本地字典查询Bundle
同(1)创建名LocalDictQuery的插件工程
导入字典查询接口Bundle,即打开LocalDictQuery工程的META-INF下的MANIFEST.MF文件选择Dependencies页签,点击Imported Packages的Add,选择org.haiwi.demo.dictquery包。
编写实现QueryService接口的类LocalDictQueryServiceImpl,实现DictQuery函数体
package org.haiwi.demo.localdictquery; import java.util.concurrent.ConcurrentHashMap; import org.haiwi.demo.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", "中国"); dict.put("LocalTest", "LocalDictQueryServiceImpl"); } @Override public String QueryWord(String word) { System.out.println("start LocalDictQueryServiceImpl"); String result=dict.get(word); if(null==result) result="本地库中未存在!"; return result; } }
最后编写Activator的代码,在Bundle启动时候注册我们提供的字典查询服务,停止时卸载字典查询服务。在org.haiwi.demo.localdictquery包下建立类LocalDictQueryActivator。
package org.haiwi.demo.localdictquery; import org.haiwi.demo.dictquery.QueryService; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceRegistration; public class LocalDictQueryActivator implements BundleActivator { private static BundleContext context; private ServiceRegistration sr=null;//Service注册类 static BundleContext getContext() { return context; } @Override public void start(BundleContext bundleContext) throws Exception { System.out.println("start org.haiwi.demo.localdictquery.LocalDictQueryActivator"); LocalDictQueryActivator.context = bundleContext; sr=context.registerService(QueryService.class.getName(), new LocalDictQueryServiceImpl(), null); } @Override public void stop(BundleContext bundleContext) throws Exception { System.out.println("end org.haiwi.demo.localdictquery.LocalDictQueryActivator"); LocalDictQueryActivator.context = null; sr.unregister(); } }
(3)完成实现远程字典查询Bundle。
创建工程名RemoteDictQuery,过程和LocalDictQuery类似,
其中实现代码做一下改动
package org.haiwi.demo.remotedictquery; import java.util.concurrent.ConcurrentHashMap; import org.haiwi.demo.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 开始"); String result=dict.get(word); if(null==result) result="远程库中未存在!"; return result; } }
(4)完成字典查询响应Bundle
首先在插件工程DictQuery的Src目录下创建page文件夹用于存放html页面,创建org.haiwi.demo.servlet包下存放对应的响应servlet,并在org.haiwi.demo.dictquery下创建Activator。
其中要引用Servlet API。同时要引入javax.servlet和javax.servlet.http两个包。
其中类QueryServiceActivator代码如下
package org.haiwi.demo.dictquery; import org.haiwi.demo.servlet.DictQueryServlet; import org.haiwi.demo.servlet.HelloServlet; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.service.http.HttpContext; import org.osgi.service.http.HttpService; public class QueryServiceActivator implements BundleActivator { private HttpService httpService=null; private ServiceReference sr=null; @Override public void start(BundleContext context) throws Exception { System.out.println("start org.haiwi.demo.dictqueryquery.QueryServiceActivator!"); //取得HttpService对象 sr=context.getServiceReference(HttpService.class.getName()); HttpService httpService=(HttpService)context.getService(sr); //注册页面和对应的Servlet类 HttpContext httpContext = httpService.createDefaultHttpContext(); httpService.registerServlet("/servlet/dictquery", new DictQueryServlet(context) , null , httpContext); httpService.registerServlet("/servlet/hello", new HelloServlet(), null, httpContext); // httpService.registerResources("/page", "/page", httpContext); } @Override public void stop(BundleContext context) throws Exception { System.out.println("end org.haiwi.demo.dictqueryquery.QueryServiceActivator!"); httpService.unregister("/servlet/dictquery"); httpService.unregister("/servlet/hello"); httpService.unregister("/page"); } }
其中类DictQueryServlet代码如下
package org.haiwi.demo.servlet; import java.io.IOException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.haiwi.demo.dictquery.QueryService; import org.osgi.framework.BundleContext; @SuppressWarnings("serial") public class DictQueryServlet extends HttpServlet { public BundleContext context=null; public DictQueryServlet(BundleContext context){ this.context=context; } private void ResponseWrite(HttpServletResponse response,StringBuffer resultBuff){ StringBuffer strBuff=new StringBuffer(); strBuff.append("<h1>"); strBuff.append(resultBuff); strBuff.append("</h1>"); strBuff.append(""); strBuff.append("<a href=\"http://localhost/page/DictQuery.html\">返回查询</a>"); try { response.getWriter().write(strBuff.toString()); } catch (IOException e) { e.printStackTrace(); } } public void doGet(HttpServletRequest request,HttpServletResponse response){ StringBuffer resultBuff=new StringBuffer(); String key=request.getParameter("key"); if(null==key||"".equals(key.trim())){ resultBuff.append("查询Key值不能为空!"); }else{ QueryService queryService =(QueryService)context.getService(context.getServiceReference(QueryService.class.getName())); String value=queryService.QueryWord(key); resultBuff.append(" Key值:"+key); resultBuff.append("<br />"); resultBuff.append("Result值:"+value); } ResponseWrite(response,resultBuff); } public void doPost(HttpServletRequest request,HttpServletResponse response){ doGet(request,response); } }
其中DictQuery.html代码如下
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>字典查询</title> </head> <body> <form action="/servlet/dictquery" method="post"> 请输入Key:<input type="text" name="key"/> <input type="submit" value="查询"/> </form> </body> </html>
(5)配置运行环境点击Run->Run Configurations选择如下
点击运行(下次无须配置直接点运行即可)启动Bundle服务,此时可以通过输入ss命令查看各Bundle的运行状态。 可以先输入ss命令(stop 28)停止LocalDictQuery Bundle服务,只用RemoteDictQuery Bundle服务,输入查询Key值查看结果如下
然后先输入ss命令(start 28;stop 32)开启LocalDictQuery Bundle服务,停止RemoteDictQuery Bundle服务,输入查询Key值查看结果如下
相关文章推荐
- Xcode 4开发第一个iPhone程序 图文实例
- EJB开发详细步骤及实例 MyEclipse+JBose+MySql 简易图书馆查询系统
- Python中使用wxPython开发的一个简易笔记本程序实例
- 使用富盛Sbo-Addon程序开发框架轻松开发模态单据选择查询功能实例
- Xcode 4开发第一个iPhone程序 图文实例(下)
- Python中使用wxPython开发的一个简易笔记本程序实例
- 基于Visual C#的DirectX开发实例——第一个DirectX程序
- Xcode 4开发第一个iPhone程序 图文实例
- 基于MT7688模块的开发笔记11——编写我的第一个程序并在MT7688中运行
- Android 蓝牙开发实例--蓝牙聊天程序的设计和实现
- 有简易通用权限管理后台的快速C# ASP.NET开发的例子应用程序卖给了曾长期开发JAVA银行程序的大哥
- iOS开发:第一个iOS程序分析——AppDelegate.h文件和视图View、视图控制器ViewController【转】
- IOS开发——01_第一个OC程序
- Win7下使用eclipse开发Android调用JNI-第一个程序
- TODO:即将开发的第一个小程序
- eclipse开发第一个Servlet程序
- 运行第一个实例display实现hello程序
- 微信小程序 实例开发总结
- 富盛Sbo Add-on程序开发框架Ver 1.0.1及其开发实例下载
- arcgis andriod开发程序实例,有图有真相