`
jncz
  • 浏览: 29341 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

osgi-扩展bluedavy提供的“简单方式下的留言板”遇到的问题

    博客分类:
  • osgi
阅读更多
  • 在BulletinListModule中仿照右侧左上角的扩展点增加一个左侧扩展点,用于显示“查询”字样
  • 根据上述扩展点,在新的bundle中实现扩展
  • 通过DS描述component,在本bundle中,有两个component,一个为进入查询页面进入的action,另一个是查询功能本身。


package com.company.jncz.query;

import java.util.List;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.equinox.http.helper.BundleEntryHttpContext;
import org.eclipse.equinox.http.helper.ContextPathServletAdaptor;
import org.eclipse.equinox.jsp.jasper.JspServlet;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.http.HttpContext;
import org.osgi.service.http.HttpService;
import org.osgi.service.http.NamespaceException;
import org.osgi.util.tracker.ServiceTracker;

import cn.org.osgi.bulletin.po.Bulletin;
import cn.org.osgi.module.hibernate.service.CommonDaoService;
import cn.org.osgi.opendoc.bulletin.mvc.SimpleMVCFrameworkActivator;
import cn.org.osgi.opendoc.bulletin.service.WebCommand;

public class QueryBulletinCommand implements WebCommand{
	private CommonDaoService service;
	
	private HttpService hs;
	
	private HttpServiceTracker httpServiceTracker;

	// ----------------------------------------------Public Method
	
	public void setService(CommonDaoService service){
		this.service=service;
	}
	
	public void unsetService(CommonDaoService service){
		if(this.service!=service)
			return;
		this.service=null;
	}
	
	
	public void unsetHs() {
		if(this.hs!=hs){
			return;
		}
		this.hs = null;
		httpServiceTracker.close();
	}

	public void setHs(HttpService hs) {
		this.hs = hs;
		httpServiceTracker = new HttpServiceTracker(SimpleMVCFrameworkActivator.getContext());
		httpServiceTracker.open();
	}
	
	@Override
	public String execute(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		String name = request.getParameter("name");
		String content = request.getParameter("content");
		DetachedCriteria dc = DetachedCriteria.forClass(Bulletin.class);
		dc.add(Restrictions.eq("author", name));
		dc.add(Restrictions.like("content", content, MatchMode.ANYWHERE));
		System.out.println("before query");
		List list = service.queryDynamic(dc);
		System.out.println("查询之后:"+list.size());
		request.setAttribute("list", list);
		request.getRequestDispatcher("/pagess/queryresult.jsp").forward(request, response);
		return "";
	}

	private class HttpServiceTracker extends ServiceTracker {

		public HttpServiceTracker(BundleContext context) {
			super(context, HttpService.class.getName(), null);
		}

		public Object addingService(ServiceReference reference) {
			final HttpService httpService = (HttpService) context.getService(reference);
			try {
				Bundle[] bs = this.context.getBundles();
				Bundle b = null;
				for (int i = 0; i < bs.length; i++) {
					System.out.println(bs[i].getBundleContext());
					if(bs[i].getSymbolicName().equals("QueryBundleModule")){
						b = bs[i];
//						System.out.println("QueryBundleModule");
						break;
					}
				}
				HttpContext commonContext = new BundleEntryHttpContext(b, "/page"); //$NON-NLS-1$
				hs.registerResources("/pagess", "/", commonContext); //$NON-NLS-1$ //$NON-NLS-2$

				Servlet adaptedJspServlet = new ContextPathServletAdaptor(new JspServlet(b, "/page"), "/pagess");  //$NON-NLS-1$//$NON-NLS-2$
				hs.registerServlet("/pagess/*.jsp", adaptedJspServlet, null, commonContext); //$NON-NLS-1$
				System.out.println("映射完毕");
			} catch (NamespaceException e) {
				e.printStackTrace();
			} catch (ServletException e) {
				e.printStackTrace();
			}
			return httpService;
		}

		public void removedService(ServiceReference reference, Object service) {
			final HttpService httpService = (HttpService) service;
			httpService.unregister("/pagess"); //$NON-NLS-1$
			httpService.unregister("/pagess/*.jsp"); //$NON-NLS-1$
			super.removedService(reference, service);
		}			
	}
}


在这个过程中碰到了一个比较郁闷的问题,
BundleEntryHttpContext和JspServlet都需要bundle,而且必须是当前页面所在的bundle,所以,通过
Bundle[] bs = this.context.getBundles();
				Bundle b = null;
				for (int i = 0; i < bs.length; i++) {
					System.out.println(bs[i].getBundleContext());
					if(bs[i].getSymbolicName().equals("QueryBundleModule")){
						b = bs[i];
						break;
					}
				}

来获取bundle,而QueryBundleModule就是当前的页面所在bundle的name。
这样才可以,达到映射的正确性。
另外一点,需要注意的是,build.properties需要经常查看,如果自己新加了什么东西,那么一定要多看看,看是否勾选中了,否则导出的bundle不会包含变动,造成很多的诡异的问题。
由于不想使用Activator,所以获取bundle的时候,感觉很怪异,不知道如何能简化。
7
1
分享到:
评论

相关推荐

    osgi-resource-locator-1.0.1-API文档-中文版.zip

    赠送jar包:osgi-resource-locator-1.0.1.jar; 赠送原API文档:osgi-resource-locator-1.0.1-javadoc.jar; 赠送源代码:osgi-resource-locator-1.0.1-sources.jar; 赠送Maven依赖信息文件:osgi-resource-locator...

    osgi-resource-locator-1.0.1-API文档-中英对照版.zip

    赠送jar包:osgi-resource-locator-1.0.1.jar; 赠送原API文档:osgi-resource-locator-1.0.1-javadoc.jar; 赠送源代码:osgi-resource-locator-1.0.1-sources.jar; 赠送Maven依赖信息文件:osgi-resource-locator...

    spring-osgi-1.2.1-with-dependencies.zip

    spring-osgi-1.2.1-with-dependencies.zip spring-osgi-1.2.1-with-dependencies.zip spring-osgi-1.2.1-with-dependencies.zip

    spring-osgi-1.2.0-rc1-with-dependencies.zip

    Spring OSGi是Spring框架与OSGi(开放服务网关倡议)技术的结合,它为开发者提供了在OSGi环境中使用Spring的能力。OSGi是一种Java模块化系统,旨在解决大型软件系统的复杂性问题,而Spring OSGi则将Spring的依赖注入...

    killbill-osgi-bundles-lib-slf4j-osgi-0.8.4.zip

    【标题】"killbill-osgi-bundles-lib-slf4j-osgi-0.8.4.zip" 是一个基于OSGi的 Kill Bill 库,其中包含了SLF4J(Simple Logging Facade for Java)的OSGi兼容版本。SLF4J是一个为各种日志框架提供简单抽象的接口,...

    OSGi-lib.rar

    OSGi(Open Services Gateway Initiative)是一种Java平台上的模块化系统和服务平台,它的主要目标是解决软件的复杂性和可维护性问题。OSGi的核心是其服务导向的架构,它允许开发者将应用程序分解为独立的模块,这些...

    spring-osgi-1.2.1-with-dependencies

    此外,Spring OSGi还支持AOP(面向切面编程),开发者可以利用OSGi的模块化特性来实现细粒度的切面,提供更灵活的代码组织和复用方式。 在实际应用中,Spring OSGi常用于构建分布式系统,例如,它可以用来构建云...

    spring-osgi-1.2.0-with-dependencies.zip

    spring-osgi-1.2.0-with-dependencies.zip spring-osgi-1.2.0-with-dependencies.zip spring-osgi-1.2.0-with-dependencies.zip

    carrot-osgi-anno-scr-make-2.0.1.zip

    在这个框架下,组件描述符(Service Component Runtime, SCR)是用于定义OSGi服务的关键组件。本文将围绕"carrot-osgi-anno-scr-make-2.0.1.zip"这个开源项目,深入探讨其在OSGi DS(Declarative Services)中的作用...

    atlassian-plugins-osgi-2.6.0.jar.zip

    总的来说,Atlassian-plugins-osgi-2.6.0.jar是一个关键的组件,它推动了Atlassian插件系统的发展,提供了更高效、灵活的开发和部署方式。开发者可以利用OSGi的强大功能,创建出适应性强、易于维护的插件,进一步...

    osgi-webservice教程

    OSGi(Open Services Gateway Initiative)是一种Java模块化系统...通过这个OSGi-WebService-axis教程,你将深入理解如何在OSGi框架下开发和部署Web服务,同时享受到模块化带来的好处,提高软件的可维护性和可扩展性。

    spring-osgi-1.2.1.rar

    OSGi是一种Java模块化系统,它提供了动态部署、版本控制和依赖管理等功能,极大地提高了软件的可维护性和可扩展性。下面将详细介绍Spring OSGi的相关知识点。 1. **OSGi基础** - OSGi的核心概念是模块化,每个模块...

    spring-osgi-1.2.0.zip

    标签"spring 包"表明这个压缩包主要与Spring框架有关,可能是其在OSGi环境下的扩展或实现。 由于没有提供具体的压缩包内容列表,我们可以假设它可能包括以下内容: 1. **Libraries**:包含了Spring OSGi的核心库和...

    osgi-tutorial.zip

    与Spring框架的XML配置类似,Blueprint使得我们在OSGi环境中能够以声明式方式管理我们的应用程序组件。 接下来,我们将Spring框架与OSGi结合。Spring框架以其强大的依赖注入(DI)和面向切面编程(AOP)能力著称,...

    org.eclipse.osgi-3.7.2

    在软件开发领域,Eclipse OSGi作为一种模块化系统,为Java应用程序提供了强大的可扩展性和灵活性。它允许开发者将复杂的应用程序分解为一组独立、可重用的服务,这些服务可以在运行时动态地启动、停止、更新和依赖...

    osgi-SpringDM

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

    osgi-in-action-20090225

    《OSGi实战》是关于Java平台上开放服务网关规范(OSGi)的一本经典书籍,其源代码在"osgi-in-action-20090225"这个压缩包中,提供了丰富的示例和实践内容,便于读者深入理解OSGi技术。下面,我们将详细探讨OSGi的...

    maven-osgi-plugin-launcher-framework-equinox-1.0.15.jar

    maven-osgi-plugin-launcher-framework-equinox-1.0.15.jar

    osgi-ds对应的demo

    总的来说,这个示例项目提供了一种学习OSGi DS服务管理机制的实践途径,包括服务的声明、依赖注入、生命周期管理等关键概念,对于理解OSGi环境下的服务导向开发有着重要的价值。通过分析和运行这些示例,开发者可以...

Global site tag (gtag.js) - Google Analytics