[转] 简单osgi实践---ds注册服务

10 篇文章 0 订阅

 

 

 

 

最近公司将部分应用迁移到osgi的平台上,我最近也学习了和实践了一下osgi。关于osgi的资料网上并不多,推荐看看《osgi.component.programming.ppt》和 《osgi实践》。
Osgi给我感觉最大优点:模块化~,动态性~,低耦合~。
最近根据《osgi实践》一书,实践了一个web请求的简单应用。osgi在申明服务的时候有两种方式,第一种通过BundleContext的方式注册,第二种通过ds的方式注册。第一种方式根据书中的步骤很容易的实现了,第二种方式书中介绍简略,而且我实践时候出现了ds无法注入服务的问题,不过某一早上灵感一显就搞定了~。我下面把这个简单的工程过程公布出来~我只是想给第一次弄osgi的人一个坚定的信念~,这个东西实现起来很简单~~。
下面就是建立这个工程的全过程。
环境:eclipse Version: 3.3.2 自然用的是Equinox(org.eclipse.osgi)。
还需要javax.servlet,org.eclipse.equinox.ds,org.eclipse.equinox.http,org.eclipse.osgi.services将这些包(网上搜索下载),放入eclipse的plugins文件下面。
1.> 建立工程如图1所示

选择plug-in Project 进入下一步

点击下一步

点击finish,这样我们就建立好了一个插件工程。

2.> 下面我按照上面步骤建立三个插件工程 分别是UserValidatorBundleTwo ,ConfigFileValidatorBundleTwo,UserValidatorWebBundleTwo。
其中UserValidatorBundleTwo工程只是定义一个验证用户名和密码的接口。ConfigFileValidatorBundleTwo才是这个接口真实的实现,所以在后面可以看到他提供了一个配置文件来申明他提供的服务。
UserValidatorWebBundleTwo 是一个提供web服务的工程,它需要依赖两个服务~~,在后面就的配置文件就可以看到了。
1. 首先看UserValidatorBundleTwo这个工程,我们需要建立一个接口

  1. package com.infotech.uservalidatorbundletwo;

  2. public interface IValidator {

  3.         public boolean validate(String username, String password) throws Exception;
  4. }
复制代码

我们需要将接口提供给别的组件使用,我们需要修改MANIFEST.MF文件

  1. Manifest-Version: 1.0
  2. Bundle-ManifestVersion: 2
  3. Bundle-Name: UserValidatorBundleTwo Plug-in
  4. Bundle-SymbolicName: UserValidatorBundleTwo
  5. Bundle-Version: 1.0.0
  6. Bundle-ClassPath: bin/
  7. Bundle-Activator: com.infotech.uservalidatorbundletwo.Activator
  8. Bundle-Vendor: com.infotech
  9. Import-Package: org.osgi.framework;version="1.3.0",
  10. org.osgi.service.startlevel;version="1.0.0"
  11. Export-Package: com.infotech.uservalidatorbundletwo
复制代码

2.  接着我们修改ConfigFileValidatorBundleTwo工程
首先我们需要引入IValidator这个接口,修改MANIFEST.MF并保存

,如下

  1. Manifest-Version: 1.0
  2. Bundle-ManifestVersion: 2
  3. Bundle-Name: ConfigFileValidatorBundleTwo Plug-in
  4. Bundle-SymbolicName: ConfigFileValidatorBundleTwo
  5. Bundle-Version: 1.0.0
  6. Bundle-ClassPath: bin/
  7. Bundle-Vendor: com.Infotech
  8. Service-Component: OSGI-INF/component.xml
  9. Import-Package: com.infotech.uservalidatorbundletwo,
  10. org.osgi.framework;version="1.3.0"
复制代码

注:其中Bundle-Activator这个属性可以要,也可以不要。
在看看实现接口的类ConfigFileValidatorImpl

  1. package com.infotech.configbundletwo;

  2. import com.infotech.uservalidatorbundletwo.IValidator;

  3. public class ConfigFileValidatorImpl implements IValidator{
  4.         
  5.         public ConfigFileValidatorImpl() {
  6.                 System.out.println("start ConfigFileValidatorImpl");
  7.         }

  8.         public boolean validate(String username, String password) throws Exception {
  9.                 if("MagicLiu".equals(username) && "iloveyou".equals(password))
  10.                         return true;                
  11.                 return false;
  12.         }

  13. }
复制代码

同时在工程下面建立OSGI-INF文件夹,并建立component.xml提供给ConfigFileValidatorBundleTwo申明服务,它的具体内容是:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <component name="ConfigFileValidatorBundleTwo">
  3.         <implementation class="com.infotech.configbundletwo.ConfigFileValidatorImpl"/>
  4.         <service>
  5.                 <provide interface="com.infotech.uservalidatorbundletwo.IValidator"/>
  6.         </service>
  7. </component>
复制代码

3. 好了修改最后一个UserValidatorWebBundleTwo这个工程了
首先要建立一个Servlet来处理web请求,这个时候我们需要两个服务,一个是http服务,一个是验证用户名和密码的服务,用ds注入的话需要对每一个服务有set和unset方法,接着就是doGet和doPost方法,具体代码如下:

  1. package com.infotech.web.servlet;

  2. import java.io.IOException;
  3. import javax.servlet.Servlet;
  4. import javax.servlet.ServletOutputStream;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;

  8. import org.osgi.service.http.HttpService;

  9. import com.infotech.uservalidatorbundletwo.IValidator;

  10. public class LoginServlet extends HttpServlet{
  11.         
  12.         /**
  13.          * 
  14.          */
  15.         private static final long serialVersionUID = 1L;
  16.         private HttpService http;
  17.         private IValidator validator;
  18.         
  19.         public LoginServlet(){
  20.                 System.out.println("Start Servlet!");
  21.         }
  22.         
  23.         public void setIValidator(IValidator validator) {
  24.                 System.out.println("set Validator");
  25.                 this.validator = validator;
  26.         }
  27.         
  28.         public void unsetIValidator(IValidator validator) {
  29.                 if(this.validator != validator) {
  30.                         return ;
  31.                 }                
  32.                 this.validator = null;        
  33.         }
  34.         
  35.         public void setHttpService(HttpService httpService) {
  36.                 this.http = httpService;
  37.                 try {
  38.                         http.registerServlet("/demo/login", (Servlet) this, null, null);
  39.                         http.registerResources("/demo/page", "pages", null);
  40.                         System.out.println("已启动用户登录验证web模块,请通过/demo/page/login.htm访问");
  41.                 } catch (Exception e) {
  42.                         e.printStackTrace();
  43.                 }
  44.                 
  45.         }
  46.         
  47.         public void unsetHttpService(HttpService httpService) {
  48.                 this.http.unregister("/demo/login");
  49.                 this.http.unregister("/demo/page");
  50.                 System.out.println("已卸载用户登录验证web模块!");
  51.                 this.http = null;
  52.         }
  53.         
  54.         public void doPost(HttpServletRequest request, 
  55.                         HttpServletResponse response) throws IOException {
  56.                 doGet(request, response);
  57.         }
  58.         
  59.         public void doGet(HttpServletRequest request, 
  60.                         HttpServletResponse response) throws IOException {
  61.                 String username = request.getParameter("username");
  62.                 String userpass = request.getParameter("userpass");
  63.                 response.setContentType("text/html");
  64.                 ServletOutputStream output = response.getOutputStream();
  65.         
  66.                 if(this.validator == null ) {
  67.                         output.println("No usable validator service");
  68.                         output.close();
  69.                         return;
  70.                 }
  71.                 boolean result = false;
  72.                 try{
  73.                         result = this.validator.validate(username, userpass);
  74.                         if(result)
  75.                                 output.println("Login success");
  76.                         
  77.                         else 
  78.                                 output.println("Login Fail, please check username and password");
  79.                         
  80.                         output.close();
  81.                         return ;
  82.                 }catch(Exception e) {
  83.                         output.println("Login error:");
  84.                         output.println(e.toString());
  85.                         output.close();
  86.                         return;
  87.                 }
  88.         }
  89. }
复制代码

我们需要建立一个页面请求,在这个工程下面建立一个Pages的文件夹,同时建立Login.htm
页面代码如下:

  1. <BODY>
  2. <table style="width:45%;border:1px solid;height:100px">
  3.         <form name=frmLogin method="post" action="/demo/login">
  4.                 <tr bgcolor="#C0C0C0">
  5.                         <td colspan="2" align="center">用户登录模块示例</td>
  6.                 </tr>
  7.                 <tr>
  8.                         <td width="30%">用户名</td>
  9.                         <td><input type="text" name="username" size="30"></td>
  10.                 </tr>
  11.                 <tr>
  12.                         <td>密&nbsp;&nbsp;码</td>
  13.                         <td><input type="password" name="userpass" size="33"></td>
  14.                 </tr>
  15.                 <tr bgcolor="#C0C0C0">
  16.                         <td colspan="2" align="center">
  17.                                 <input type=button name=btnSubmit value="登录" οnclick="login();">
  18.                         </td>
  19.                 </tr>
  20.         </form>
  21. </table>
  22. </BODY>
复制代码

我们需要修改配置文件了

  1. Manifest-Version: 1.0
  2. Bundle-ManifestVersion: 2
  3. Bundle-Name: UserValidatorWebBundleTwo Plug-in
  4. Bundle-SymbolicName: UserValidatorWebBundleTwo
  5. Bundle-Version: 1.0.0
  6. Bundle-ClassPath: bin/
  7. Bundle-Vendor: com.infotech
  8. Import-Package: com.infotech.uservalidatorbundletwo,
  9. org.osgi.framework;version="1.3.0",
  10. org.osgi.service.http;version="1.2.0"
  11. Require-Bundle: javax.servlet
  12. Service-Component: OSGI-INF/ component.xml
复制代码

接着再配置component.xml,在工程下面建立OSGI-INF文件夹和文件component.xml
文件修改如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <component name="LoginServlet">
  3.         <implementation class="com.infotech.web.servlet.LoginServlet"/>
  4.                 <reference name="IValidator" interface="com.infotech.uservalidatorbundletwo.IValidator" 
  5.                 bind="setIValidator" unbind="unsetIValidator" policy="dynamic"/>
  6.                 <reference name="HttpService" interface="org.osgi.service.http.HttpService" 
  7.                 bind="setHttpService" unbind="unsetHttpService" policy="dynamic"/>        
  8. </component>
复制代码

3.> 我们工程基本上都建立完全了,现在需要的是配置系统环境拉 
选择debug下面open debug dialog~~如图:

选择osgi Framework 点击右键 选择new,让后在bundles视图中勾选上你选择的三个Bundler ,同时点击add Required bundles 按钮,系统会帮你添加必要的bundle~好了点击“Apply”保存,点击debug按钮。系统运行了出现下面的图

同时输入ss 可以出现以下的bungles.
5.> 后台运行正常 让我们用访问这个web地址
我修改了web服务的端口,大家访问的时候直接可以直接用80端口


终于搞完了~~嘿嘿~~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值