我们上次开发了包含本地服务和远程服务两个插件的pulg-in项目,并且学习了如何注册和获取Service,如何绑定Http服务,如何绑定Servlet服务。
接下来我们依旧使用osgi技术,将项目改为使用Spring注入技术的项目。

说到这里不得不介绍一下Spring-DM:
Spring-DM指的是 Spring Dynamic Modules。Spring-DM 的主要目的是能够方便地将 Spring 框架和OSGi框架结合在一起,使得使用Spring的应用程序可以方便简单地部署在OSGi环境中,利用OSGi框架提供的服务,将应用变得 更加模块化。

所以我们接下来要做的就是Spring-DM与OSGI的结合。

可以从 Spring 的网站上下载最新的 Spring-DM 包。目前最新的版本为 1.2.0 RC1,下载地址在:
http://download.csdn.net/detail/u013517797/9463540
下载了这个Spring-DM 包后,我们把压缩包中的dist和lib目录解压到硬盘上的某个目录,比如解压到D盘根目录下的 spring-dm 目录中。那么我们会在D:\Spring-dm\dist目录下看到如下图所示的内容。

在D:\spring-dm\lib中看到如下图所示的内容。

然后我们要在我们的项目中引入需要的Spring插件,我们点击import,然后选择 Import Plugin-ins and Fragments:

然后做一下设置

我们要设置 Plug-in Location,先设置为 D:\spring-dm\dist,导入 sprimg-dm 的包:

点击 Next 后,出现了让我们选择导入的Plugin界面

我们可以导入 core、extender、io 三个 Bundle。

完成后可以在Eclipse的工作区看到引入的三个插件:

我们直接在 Run Configurations 中选择这三个 Bundle,并执行,会发现三个 Bundle 都是INSTALLED状态,如果我们启动Bundle,会报错,原因是我们没有加入这三个Bundle所依赖的Bundle。而这些Bundle,也就在D:\spring-dm\lib目录下。我们用和前面一样的方式来导入lib中所需要的Bundle。
要 导 入 的 Bundle 是 
com.springsource.org.aopalliance
org.springframework.aop
org.springframework.beans
org.springframework.context 
org.springframework.context.support
org.springframework.core

导入完之后我们在Eclipse的工作区看到引入的插件:

我们再次配置一下Run Configurations:

(单纯的,我们自己的加了更多需要的插件)

然后我们将此环境运行起来,然后出现如下画面就是我们的环境配置成功:

然后我们输入ss指令,发现我们的环境中的spring插件全部ACTIVE:

我们的环境配置完成之后,接下来我们开始改造我们的翻译助手项目。
首先改造我们的本地查询服务,我们在localTranslateAsslt的MANIFEST.MF导入我们需要的插件依赖: 
javax.servlet;
javax.servlet.http;
org.osgi.service.http;

然后将本工程下的Activator类删除(我们接下来将不通过Activator来注入Service和获取Service了,我们通过spring的注入来注册和获取相应的服务),并在MANIFEST.MF中删除Bundle-Activator:选项。

然后我们在工程下创建一个名为“OSGI-INF”的文件夹,然后创建一个名为“component.xml”的xml配置文件:

然后在MANIFEST.MF中添加Service-Component: OSGI-INF/component.xml这句话(如果报"Header must be terminated by a line break"的错,在上面那个配置末尾加一个回车就好了)。

这个文件就是配置我们该插件项目注册的Service,其中的内容为:

<?xml version="1.0" encoding="UTF-8"?>
<component name="TranslateService">
<implementation class="com.zyg.osgi.localtranslateasslt.impls.TranslateServiceLocalImpl"/><service><provide interface="com.zyg.osgi.translateasslt.service.TranslateService"/></service>
</component>

可以看到,我们注册了一个名为"TranslateService"的Service,这个Service的实例化类为"com.zyg.osgi.localtranslateasslt.impls.TranslateServiceLocalImpl"。

同理,我们在远程服务插件中做相同的操作,先加入相应的依赖(javax.servlet;javax.servlet.http;org.osgi.service.http;),然后删除Activator类,然后在MANIFEST.MF中删除Bundle-Activator:选项,并创建OSGI-INF的文件夹与component.xml配置文件,然后在MANIFEST.MF中添加Service-Component: OSGI-INF/component.xml这句话。接着在配置文件中写入如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<component name="TranslateService">
<implementation class="com.zyg.osgi.remotetranslateasslt.impls.TranslateServiceRemoteImpl"/><service><provide interface="com.zyg.osgi.translateasslt.service.TranslateService"/></service>
</component>

最后我们修改我们的Web入口插件TranslateClient,先加入相应的依赖(javax.servlet;javax.servlet.http;org.osgi.service.http;),然后删除其Activator类,然后在MANIFEST.MF中删除Bundle-Activator:选项,并创建OSGI-INF的文件夹与component.xml配置文件,然后在MANIFEST.MF中添加Service-Component: OSGI-INF/component.xml这句话。接着在component.xml写入以下配置:

<?xml version="1.0" encoding="UTF-8"?>
<component name="TranslateServlet"><implementation class="com.zyg.osgi.translateclient.servlet.TranslateServiceServlet"/><reference name="TranslateService" interface="com.zyg.osgi.translateasslt.service.TranslateService" bind="setTranslateService" unbind="unsetTranslateService" policy="dynamic" cardinality="0..1"/><reference name="HttpService" interface="org.osgi.service.http.HttpService" bind="setHttpService" unbind="unsetHttpService" policy="dynamic"/>
</component>

可以看到我们配置了Servlet和Servlet的实现,然后里面的参数是Servlet依赖的类,分别是TranslateService和HttpService。

然后我们修改一下TranslateServiceServlet,让其能够通过配置文件注入TranslateService和HttpService:

package com.zyg.osgi.translateclient.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 com.zyg.osgi.translateasslt.service.TranslateService;public class TranslateServiceServlet extends HttpServlet{private  static final long serialVersionUID = 1L;private HttpService httpService;private TranslateService translateService;/*** 注入HttpService* @param httpService*/public void setHttpService(HttpService httpService){try {httpService.registerServlet("/servlet/translateServlet", this, null, null);httpService.registerResources("/page", "pages", null);System.out.println("翻译助手服务已启动成功,请通过/page/translate.html访问!");} catch (Exception e) {e.printStackTrace();}}/*** 注销HttpService* @param httpService*/public void unsetHttpService(HttpService httpService){if(httpService != this.httpService){return;}try {httpService.unregister("/servlet/translateServlet");httpService.unregister("/page");System.out.println("翻译助手服务已停用成功,谢谢使用!");} catch (Exception e) {e.printStackTrace();}this.httpService = null;}/*** 注入TranslateService* @param translateService*/public void setTranslateService(TranslateService translateService){this.translateService = translateService;}/*** 注销TranslateService* @param translateService*/public void unsetTranslateService(TranslateService translateService){if(translateService != this.translateService){return;}this.translateService = null;}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//1、取得用户传来的英文单词String queryWord=req.getParameter("query_word");//2、调用方法查找中文含义resp.setContentType("text/html;charset=GBK");PrintWriter writer=resp.getWriter();if(translateService==null){writer.println("没有开放翻译服务!");writer.close();return;}String result=translateService.translate(queryWord);//3、返回结果给用户writer.println("结果"+result);writer.close();return;}}

我们配置一下Run Configuration,在之前的基础上,将我们的项目的四个部分全部引入进去(localTranslateAsslt、remoteTranslateAsslt、TranslateAsslt、TranslateClient)

如果出现java.lang.ClassNotFoundException:等错误,应在Target platform中加入等工程中需要的依赖插件。

我们现在运行一下我们的项目:

说明我们的项目运行成功,那么使用ss指令发现我们的插件都是运行正常 的,那么我们先停掉我们的远程服务

测试一下本地服务:

可以看到本地服务查询是正常的,远程服务查询是停掉的。

然后停掉我们的本地服务,启动远程服务:

测试一下远程服务:




可以看到远程服务查询是正常的,本地服务查询是停掉的。

至此,我们的OSGI和Spring-DM整合成功。

转载请注明出处:http://blog.csdn.net/acmman/article/details/50935373

【OSGI】5.实战OSGI-翻译助手项目03相关推荐

  1. 【OSGI】4.实战OSGI-翻译助手项目02

    上次我们配置了运行Web项目所需要的Run Configuration环境,创建了客户端入口插件TranslateClient模块,下面我们来继续完成客户端模块的程序. 因为是Web项目,我们要让用户 ...

  2. 【OSGI】3.实战OSGI-翻译助手项目01

    我们通过写一个真实的Web项目来深入学习使用OSGI技术. 我们做一个Web版的翻译助手(类似电子英汉词典之类的) (1)服务接口模块 我们在Eclipse中创建一个pulg-in项目: 我们创建一个 ...

  3. 『菜鸟手机助手』-做一个属于自己的AppStore-Android助手项目

    『菜鸟手机助手』-做一个属于自己的AppStore-Android助手项目 官方地址:http://www.cniao5.com/course/lessons/10124 注意:更新未完整,更新至41 ...

  4. OSGi介绍及OSGi的Bundle应用

    http://blog.sina.com.cn/s/blog_50356fbb0100dytp.html 关键字: OSGi Bundle Plugin Eclipse 开放服务网关协议 (Open ...

  5. ServiceMix异常(1):missing requirement [262.0] osgi.wiring.package;osgi.wiring.package=org.apache.camel

    环境 servicemix :6.1.0 jdk:jdk1.8.0_191 项目中使用的camel版本:2.23.1 servicemix中安装的camel版本:2.16.1 起初小编在开发的时候就直 ...

  6. 《Netty IN ACTION》中文版《Netty实战》翻译手记——不负好时光

    不负好时光--<Netty in Action>中文版<Netty实战>翻译手记 引子 "书中自有黄金屋,书中自有颜如玉",这句话从小我老爸就给我讲,当然那 ...

  7. OpenCV-PyQT项目实战(5)项目案例01:图像模糊

    欢迎关注『OpenCV-PyQT项目实战 @ Youcans』系列,持续更新中 OpenCV-PyQT项目实战(1)安装与环境配置 OpenCV-PyQT项目实战(2)QtDesigner 和 PyU ...

  8. linux 退出服务器_Vue实战091:Vue项目部署到nginx服务器

    项目开发完成之后我们就需要将项目上线运行供用户访问,这时候我们就需要将项目部署到服务器上.对于Vue这种前端Web项目我们一般都部署在linux系统上,Linux常见的Web应用服务器有Apache. ...

  9. 《实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)》

    <实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)> 基本信息 作者: 徐康明    辛洪郁 出版社:电子工业出版社 ISBN:9787121221378 上架时间:2014 ...

最新文章

  1. php仿攻击,PHP写的仿DDOS攻击程序代码
  2. Polycom开启“创新协作+”时代 全新解决方案闪耀京城
  3. 【 MATLAB 】ppval 函数介绍(评估分段多项式)
  4. 全球与中国自行车和零件制造市场发展规划及未来投资趋势展望报告2021年版
  5. windows下设置socket的connect超时
  6. php ci框架中载入css和js文件失败的原因及解决方法
  7. 超实用Mac软件分享(二)
  8. JDBC12 ORM01 Object[]存放一条记录
  9. 关于Tapestry5中的配置项的说明
  10. 用Acrobat pro DC 自动生成pdf目录——知网硕博论文为例(附带如何下载只有caj的pdf)
  11. 2022-04- 聂卫平围棋道场-小汪小喵学围棋
  12. 数模电路基础知识 —— 5. 常见电路符号说明(三极管)
  13. 快速幂与快速矩阵幂(以大数下的斐波那契数列为例)
  14. JAVA-【1】配置
  15. 2019二级建造师-法规-基础班-精讲班课程更新进度
  16. 异步处理,Event Souring,事务补偿,实现最终一致性和服务的弹性和批处理
  17. 微信公众号加外链怎么不管用——已解决
  18. 指南:使用 Trickle 限制应用程序带宽占用
  19. PLC模拟量采集在工业自动化控制中的应用
  20. mysql fabric搭建_MySQL Fabric 安装部署

热门文章

  1. winsetup装系统报:应用系统镜像失败!0x5:拒绝访问
  2. 用计算器实现主机字节序与网络字节序之间转换
  3. win10-快速助手
  4. 【人工智能】SWI-prolog学习笔记(一)
  5. Python(八)类与对象
  6. 90分钟详解网络编程相关的细节处理丨 reactor丨网络io丨epoll丨C/C++丨Linux服务器开发丨后端开发丨Linux后台开发
  7. 李宏毅机器学习作业二(从参考答案中学到了什么)
  8. 一套采用ASP.NET开发的工作通OA协同办公系统源码 流程审批 公文流转 文档管理
  9. postek二次开发_详解Visual Basic脚本在BarTender中的应用
  10. PHP5 mysqli 绑定参数