`
liugang594
  • 浏览: 987612 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在OSGI容器Equinox中嵌入HttpServer

 
阅读更多

简单介绍一下如何在一个osgi的bundle中内嵌使用http服务

一、基础

首先看看在OSGI中怎么启动内嵌的jetty容器。看下图:

启动OSGI和Jetty

 

其实简单的只选中"org.eclipse.osgi"和"org.eclipse.equinox.http.jetty",然后点击"Add Required Bundles"即可。

默认的Jetty监听的端口为80,可又通过指定运行参数 org.osgi.service.http.port 来修改围住端口,例如要想使用8080端口,可又切换到 "Arguments"页:

port

 

完成配置又后,点运行即可:

run

 

如果得到又上结果,说明运行成功,可以访问一下启动的jetty了:

page

二、添加页面

上面介绍了怎么在Eclipse的OSGI容器里启动Jetty服务,不过从结果看来,这个jetty里还没有什么内容。这一节我们就要加一点内容。

 

首先,先创建一个简单的osgi的bundle,过程如下:

  1. New --> Other --> Plug-in Project, 点 “Next”
  2. 填写“Project name”;
  3. "Target Platform"一栏,选择“an OSGI framework" --> "standard", 点 "Next", "Next"new
  4. 不选任何模板,直接Finish

OK,一个基本OSGI的bundle project就创建完成。要结合使用http服务,需要添加以下依赖包:

  • javax.servlet
  • javax.servlet.http
  • org.osgi.service.httpdependencies

OK,配置部分就已经完成,下面就开始填写内容。

三、背景知识

Eclipse内嵌有一个HttpService的实现,它位于包"org.osgi.service.http"下,一旦这个service所在的osgi bundle启动了,就会有一个内嵌的http容器被启动,这个service就会被注册,默认地址是http://localhost,端口为80,可以通过指定参数“org.osgi.service.http.port”参数在运行的时候修改默认端口(参见上上节)。(注:不应该试图自己去启动他那HttpService服务,那样可能达不到目的;另外应避免启动多个HttpService服务,又节省资源)

 

要想提供我们自己定义的http服务,就需要将我们的服务(servlet或者是其他html页面)注册到这个HttpService中去,这里主要是用到HttpService的两个注册方法:

  • registerResources(String alias, String name, HttpContext context) 

          用来注册诸如表态页面等等

  • registerServlet(String alias, Servlet servlet, Dictionary initparams, HttpContext context)

          用来注册servlet类

所以要想提供我自己的webservice实现,我们就需要:

 

  1. 取得httpService对象
  2. 提供Servlet和Web Page的实现
  3. 将Servlet和Web Page注册到HttpService服务中
  4. 访问

四、实现

我这里提供一个很简单的例子:一个页面,用户可又输入名字,然后点提交,将输入的信息提交到后台的servlet;servlet得到提交的名字,如果不为空,就将它打印出来,否则就提示用户需要输入一个名字。

 

1、准备页面

提交页面的内容如下:

 

<html>
<title>测试OSGI和HTTP</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
<form action="print" method="get">
请输入名字:
  <input type="text" name="name" />
  <input type="submit" value="提交" />
</form>
</body>
</html>

在src目录下他那一个目录web,然后将该文件保存为submit.html

2、Servlet类

 

package testhttp.servlets;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;

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

import org.osgi.framework.BundleContext;

public class PrintNameServlet extends HttpServlet{
	
	private static final long serialVersionUID = -9080875068147052401L;
	
	private BundleContext context;
	
	public PrintNameServlet(BundleContext context) {
		super();
		this.context = context;
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doGet(req, resp);
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		resp.setCharacterEncoding("UTF-8");
		
		String name = req.getParameter("name");
		System.out.println(name);
		
		String s = "";
		if(name==null||"".equals(name.trim())){
			s = "你没有输入名字";
		}else{
			s = "你输入的名字是:"+name.trim();
		}
		StringBuilder sb = new StringBuilder();
		sb.append("<html><title>Response</title><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
		sb.append("<body>");
		sb.append(s);
		sb.append("</body></html>");
		
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(resp.getOutputStream(),"UTF-8"));
		bw.write(sb.toString());
		bw.flush();
		bw.close();
	}

}

 

3、注册

页面也有了,servlet类也有了,下面就是将他们注册入HttpService里了。假如在我们的bundle一运行,这些http页面就可用,那么,我们可又在Activator里注册服务。

 

  • 取得HttpService对象

        private HttpService service;

	public void start(BundleContext bundleContext) throws Exception {
		Activator.context = bundleContext;
		ServiceReference serviceReference = bundleContext.getServiceReference(HttpService.class.getName());
		service = (HttpService) bundleContext.getService(serviceReference);
	}

  

          这是一个例行公事般的步骤,一般取得一个特定服务的代码都可又这么实现。

  • 注册页面和Servlet

          有了HttpService对象,然后就是注册资源和servlet到这个HttpService对象:

 

	public void start(BundleContext bundleContext) throws Exception {
		Activator.context = bundleContext;
		ServiceReference serviceReference = bundleContext.getServiceReference(HttpService.class.getName());
		service = (HttpService) bundleContext.getService(serviceReference);
 
                //register
		HttpContext httpContext = service.createDefaultHttpContext();
		
		service.registerResources("/osgi", "/web", httpContext); //设置别名,所有对"/osgi"映射到"web"目录
		service.registerServlet("/osgi/print", new PrintNameServlet(bundleContext)
		, null, httpContext);   //设置servlet别名,'/osgi/print"映射到servlet的实现
	}
  •  退出时移除别名
	public void stop(BundleContext bundleContext) throws Exception {
		service.unregister("/osgi/print");
		service.unregister("/osgi");
		Activator.context = null;
	}
  • 启动bundle

          示例bundle已经准备好,最后就是启动这个bundle了,只需要在第一节的bundle列表中把这个bundle添加进去就可又了:

bundle

 

如果没有意外,访问 http://localhost:8080/osgi/submit.html 

submit

 

如果能看到这个页面,那基本就是成功了,输入"刘刚",提交后,返回结果为:

requestresponse

 

  • 大小: 54.4 KB
  • 大小: 3.3 KB
  • 大小: 21.8 KB
  • 大小: 11.5 KB
  • 大小: 52.2 KB
  • 大小: 22.5 KB
  • 大小: 20.5 KB
  • 大小: 24.9 KB
  • 大小: 21 KB
  • 大小: 24.6 KB
分享到:
评论
1 楼 lg975054280 2015-05-19  
ServiceReference serviceReference = bundleContext.getServiceReference(HttpService.class.getName());  我的这里为什么取到的serviceReference是null

相关推荐

    OSGi and Equinox

    标题“OSGi and Equinox”和描述“OSGi and Equinox, Creating Highly Modular Java Systems”表明本文旨在介绍OSGi框架以及它在Eclipse环境下的具体实现Equinox。OSGi是一个Java模块化平台,它允许多个独立的模块...

    深入理解OSGi:Equinox原理、应用与最佳实践.pdf

    在OSGi中,每个Bundle都运行在自己的类加载器中,它由Equinox的Bundle加载机制来管理。此外,OSGi还定义了生命周期管理,包括Bundle的安装、启动、停止和更新等。一个Bundle的生命周期可以被划分为以下状态:...

    OSGi与Equinox 创建高度模块化的Java系统 中文扫描版

    OSGi与Equinox 创建高度模块化的Java系统 This first part of the book introduces OSGi and Equinox, Eclipse’s implementation of the OSGi standard. Chapter 1outlines the history and context of OSGi. Its ...

    OSGi与Equinox 创建高度模块化的Java系统 第5章 源码

    在"OSGi与Equinox 创建高度模块化的Java系统 第5章 源码"中,我们可以深入学习如何利用OSGi和Equinox构建模块化系统。这一章节可能涵盖了以下几个核心知识点: 1. **模块系统**:OSGi的核心是模块系统,它定义了...

    OSGi与Equinox 创建高度模块化的Java系统 第4章完整源码

    在"OSGi与Equinox 创建高度模块化的Java系统 第4章完整源码"中,我们可以学习到以下关键知识点: 1. **OSGi模块系统**:理解OSGi的核心概念,如bundle(模块)、服务、生命周期管理(启动、停止、更新、卸载)以及...

    深入理解OSGi:Equinox原理、应用与最佳实践源代码+equinox-SDK-3.8源代码

    8. **案例研究**:通过实际示例,学习如何将Equinox应用于实际项目,如创建插件式应用、实现热更新、以及在企业级应用中集成OSGi。 9. **调试与工具**:了解如何使用Eclipse内置的OSGi工具进行调试,以及如何利用第...

    tomcat嵌入OSGI容器

    标题中的“tomcat嵌入OSGI容器”是指在Apache Tomcat服务器中集成OSGI(Open Service Gateway Initiative)框架,使得Tomcat能够支持模块化的应用程序部署和管理。OSGI是一种Java平台上的服务导向架构,它允许动态地...

    《osgi与equinox创建高度模块化的java系统》第五章源码

    在本章中,我们将深入探讨如何使用OSGi(Open Service Gateway Initiative)框架,特别是Equinox实现高度模块化的Java系统。Equinox是Eclipse基金会提供的一个OSGi实现,它允许开发者构建可热插拔的组件,使得系统...

    深入理解OSGi:Equinox原理、应用与最佳实践

    Equinox的出现极大地促进了OSGi技术在企业级应用中的普及和发展。 #### OSGi R5.0规范解读 《深入理解OSGi:Equinox原理、应用与最佳实践》这本书是全球首本基于最新OSGi R5.0规范的著作。OSGi R5.0规范相比之前的...

    osgi与equinox 创建高度模块化的java系统 第6章源码

    5. **Eclipse集成**:由于Equinox是Eclipse的一部分,所以该章节可能涉及到如何在Eclipse IDE中设置和运行OSGi项目,包括配置项目构建路径、打包依赖和调试服务交互等问题。 6. **案例分析**:可能通过具体的示例...

    WEB容器托管OSGi容器(轻量级集成方式)

    标题中的“WEB容器托管OSGi容器(轻量级集成方式)”是指在Web应用程序服务器(如Tomcat、Jetty等)中嵌入OSGi(Open Service Gateway Initiative)框架,实现服务组件的轻量化管理和部署。OSGi是一种动态模块化系统...

    《深入理解OSGi:Equinox原理、应用与最佳实践》

    在这一部分里,将会把OSGi技术从理论落地到实践之中,结合目前使用范围最广的OSGi实现Equinox和一个穿插整个部分的完整案例来讲解OSGi技术的使用;第四部分最佳实践,针对开发实践中遇到的具体问题进行分析讲解,...

    《深入理解OSGi:Equinox原理、应用与最佳实践》附赠光盘

    Equinox是OSGi规范的一个实现,由Eclipse基金会维护,广泛应用于企业级应用开发中。 首先,让我们深入了解OSGi的核心概念。OSGi基于模块化设计,每个模块称为一个Bundle,它包含了类、资源和元数据,定义了自己的...

    深入理解OSGi:Equinox原理、应用与最佳实践,书本源代码

    在深入理解OSGi:Equinox原理、应用与最佳实践中,我们可以学习到以下几个关键知识点: 1. **模块化编程**:OSGi的核心是模块化,它将应用程序划分为独立的单元,称为服务或bundle。每个bundle都有自己的类路径,...

    osgi 在web容器中部署

    在Web容器中部署OSGi应用,特别是像Tomcat这样的流行Servlet容器,可以提高应用的灵活性、可维护性和可扩展性。本文将详细介绍如何使用桥接技术(如Apache Felix的WebConsole或Pax Web)在Tomcat中部署OSGi程序。 ...

    Equinox OSGI ServletBridge 原理与实践.rar

    读者将首先了解到如何在 Servlet Container 中嵌入 OSGI,并从文章提供的例子中了了解其工作原理, 并提供一个简单的示例。通过学习了解 Servlet Container 中嵌入 OSGI, 我们也可以将这种技术用到其它的已有的系统...

Global site tag (gtag.js) - Google Analytics