- 在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的时候,感觉很怪异,不知道如何能简化。
分享到:
相关推荐
赠送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...
赠送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是Spring框架与OSGi(开放服务网关倡议)技术的结合,它为开发者提供了在OSGi环境中使用Spring的能力。OSGi是一种Java模块化系统,旨在解决大型软件系统的复杂性问题,而Spring OSGi则将Spring的依赖注入...
【标题】"killbill-osgi-bundles-lib-slf4j-osgi-0.8.4.zip" 是一个基于OSGi的 Kill Bill 库,其中包含了SLF4J(Simple Logging Facade for Java)的OSGi兼容版本。SLF4J是一个为各种日志框架提供简单抽象的接口,...
OSGi(Open Services Gateway Initiative)是一种Java平台上的模块化系统和服务平台,它的主要目标是解决软件的复杂性和可维护性问题。OSGi的核心是其服务导向的架构,它允许开发者将应用程序分解为独立的模块,这些...
此外,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
在这个框架下,组件描述符(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是一个关键的组件,它推动了Atlassian插件系统的发展,提供了更高效、灵活的开发和部署方式。开发者可以利用OSGi的强大功能,创建出适应性强、易于维护的插件,进一步...
OSGi(Open Services Gateway Initiative)是一种Java模块化系统...通过这个OSGi-WebService-axis教程,你将深入理解如何在OSGi框架下开发和部署Web服务,同时享受到模块化带来的好处,提高软件的可维护性和可扩展性。
OSGi是一种Java模块化系统,它提供了动态部署、版本控制和依赖管理等功能,极大地提高了软件的可维护性和可扩展性。下面将详细介绍Spring OSGi的相关知识点。 1. **OSGi基础** - OSGi的核心概念是模块化,每个模块...
标签"spring 包"表明这个压缩包主要与Spring框架有关,可能是其在OSGi环境下的扩展或实现。 由于没有提供具体的压缩包内容列表,我们可以假设它可能包括以下内容: 1. **Libraries**:包含了Spring OSGi的核心库和...
与Spring框架的XML配置类似,Blueprint使得我们在OSGi环境中能够以声明式方式管理我们的应用程序组件。 接下来,我们将Spring框架与OSGi结合。Spring框架以其强大的依赖注入(DI)和面向切面编程(AOP)能力著称,...
在软件开发领域,Eclipse OSGi作为一种模块化系统,为Java应用程序提供了强大的可扩展性和灵活性。它允许开发者将复杂的应用程序分解为一组独立、可重用的服务,这些服务可以在运行时动态地启动、停止、更新和依赖...
Spring-DM指的是 Spring ...Spring-DM 的主要目的是能够方便地将 Spring 框架和OSGi框架结合在一起,使得使用Spring的应用程序可以方便简单地部署在OSGi环境中,利用OSGi框架提供的服务,将应用变得 更加模块化。
《OSGi实战》是关于Java平台上开放服务网关规范(OSGi)的一本经典书籍,其源代码在"osgi-in-action-20090225"这个压缩包中,提供了丰富的示例和实践内容,便于读者深入理解OSGi技术。下面,我们将详细探讨OSGi的...
maven-osgi-plugin-launcher-framework-equinox-1.0.15.jar
总的来说,这个示例项目提供了一种学习OSGi DS服务管理机制的实践途径,包括服务的声明、依赖注入、生命周期管理等关键概念,对于理解OSGi环境下的服务导向开发有着重要的价值。通过分析和运行这些示例,开发者可以...