在OSGI容器Equinox中嵌入HttpServer
原文地址:https://liugang594.iteye.com/blog/1328050
简单介绍一下如何在一个osgi的bundle中内嵌使用http服务
一、基础
首先看看在OSGI中怎么启动内嵌的jetty容器。看下图:

其实简单的只选中"org.eclipse.osgi"和"org.eclipse.equinox.http.jetty",然后点击"Add Required Bundles"即可。
默认的Jetty监听的端口为80,可又通过指定运行参数 org.osgi.service.http.port 来修改围住端口,例如要想使用8080端口,可又切换到 "Arguments"页:

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

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

二、添加页面
上面介绍了怎么在Eclipse的OSGI容器里启动Jetty服务,不过从结果看来,这个jetty里还没有什么内容。这一节我们就要加一点内容。
首先,先创建一个简单的osgi的bundle,过程如下:
- New --> Other --> Plug-in Project, 点 “Next”
- 填写“Project name”;
- "Target Platform"一栏,选择“an OSGI framework" --> "standard", 点 "Next", "Next"

- 不选任何模板,直接Finish
OK,一个基本OSGI的bundle project就创建完成。要结合使用http服务,需要添加以下依赖包:
- javax.servlet
- javax.servlet.http
- org.osgi.service.http

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实现,我们就需要:
- 取得httpService对象
- 提供Servlet和Web Page的实现
- 将Servlet和Web Page注册到HttpService服务中
- 访问
四、实现
我这里提供一个很简单的例子:一个页面,用户可又输入名字,然后点提交,将输入的信息提交到后台的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添加进去就可又了:

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

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


在OSGI容器Equinox中嵌入HttpServer的更多相关文章
- C#WinForm窗体内Panel容器中嵌入子窗体、程序主窗体设计例子
C#WinForm父级窗体内Panel容器中嵌入子窗体.程序主窗体设计例子 在项目开发中经常遇到父级窗体嵌入子窗体所以写了一个例子程序,顺便大概划分了下界面模块和配色,不足之处还望指点 主窗体窗体采用 ...
- WPF中嵌入普通Win32程序的方法
公司现在在研发基于.Net中WPF技术的产品,由于要兼容旧有产品,比如一些旧有的Win32程序.第三方的Win32程序等等,还要实现自动登录这些外部Win32程序,因此必须能够将这些程序整合到我们的系 ...
- OSGI容器与插件
插件必须符合osgi规范才能插到osgi容器中,osgi容器查看插件jar中MANIFEST.MF中osgi容器. 所谓插件----就是打包好的jar文件, 内部都封装好了一些功能
- JSP中嵌入java代码方式以及指令
JSP中嵌入java代码的三种方式: (1)声明变量或方法 : <%! 声明; %> :慎重使用,因为此方法定义的是全局变量 (2)java片段(scriptlet): <% j ...
- 《深入理解OSGi:Equinox原理、应用与最佳实践》笔记_1_运行最简单的bundlehelloworld
<深入理解OSGi:Equinox原理.应用与最佳实践>笔记_1_运行最简单的bundlehelloworld 买了周大大的OSGI的书看 先前完全没有基础 就靠这本书看看学学 顺便记一些 ...
- C#WinForm应用程序中嵌入ECharts图表
C#WinForm应用程序中嵌入ECharts图表 程序运行效果: 下载ECharts: 官网下载ECharts :http://echarts.baidu.com/download.html 或者直 ...
- Java嵌入式数据库H2学习总结(三)——在Web应用中嵌入H2数据库
H2作为一个嵌入型的数据库,它最大的好处就是可以嵌入到我们的Web应用中,和我们的Web应用绑定在一起,成为我们Web应用的一部分.下面来演示一下如何将H2数据库嵌入到我们的Web应用中. 一.搭建测 ...
- 使用CefSharp在.NET中嵌入Chromium
使用CefSharp可以在.NET轻松的嵌入Html,不用担心WPF与Winform 控件与它的兼容性问题,CefSharp大部分的代码是C#,它可以在VB或者其他.NET平台语言中来进行使用. 近几 ...
- 使用CefSharp在.NET中嵌入Google kernel
原文:使用CefSharp在.NET中嵌入Google kernel 使用CefSharp可以在.NET轻松的嵌入Html,不用担心WPF与Winform 控件与它的兼容性问题,CefSharp大部分 ...
随机推荐
- [PHP] curl访问https与CA证书问题
CA证书,用来在调用HTTPS资源的时候,验证对方网站是否是CA颁布的证书,而不是自己随便生成的 curl命令1.需要下载CA证书 文件地址是 http://curl.haxx.se/ca/cacer ...
- [Go] golang使用github里的imap类库
1.在windows系统下,需要首先定义两个环境变量GOPATH和GOROOT, GOPATH是第三方类库的代码目录 , GOROOT是go的安装目录 2.按照我的定义 , 进入这个目录D:\gola ...
- Java开发笔记(二十五)方法的输入参数
前面通过main方法介绍了方法的定义形式,对于方法的输入参数来说,还有几个值得注意的地方,接下来分别对输入参数的几种用法进行阐述.一个方法可以有输入参数,也可以没有输入参数,倘若无需输入参数,则方法定 ...
- 日志收集ELK+kafka相关博客
SpringBoot+kafka+ELK分布式日志收集 使用 logstash + kafka + elasticsearch 实现日志监控 Kibana 安装 与 汉化 windows系统安装运行f ...
- 5-Redis 的持久化之 RDB
2016-12-22 13:58:48 该系列文章链接NoSQL 数据库简介Redis的安装及及一些杂项基础知识Redis 的常用五大数据类型(key,string,hash,list,set,zse ...
- SAP MM ME1M报表结果不科学?
SAP MM ME1M报表结果不科学? 做过SAP MM顾问的都知道,报表ME1M可以查询物料的info record列表,即是说可以以列表的形式批量显示多个物料的采购价格主数据. 但是这个报表有个不 ...
- arcgis api 3.x for js 入门开发系列八聚合效果(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- Apex 中文件夹相关的单元测试
Salesforce 中的文件夹 在 Salesforce 中,我们可以建立各种文档.报表.仪表板.电子邮件模板等.它们都被保存在相应的文件夹中. Salesforce 的后端将这些文件夹保存为 Fo ...
- BGP:所有邻居都启动了BGP,则无须建立首尾逻辑邻居,否则就需要首尾建立逻辑邻居。
配置说明:都通过loopback 口作为bgp 连接口,并且要配置ebgp多跳,同时配置loopback口的静态路由. 以AR2为例: 第一种场景:所有直接相连的邻居都启动了BGP,则路由可以随意扩散 ...
- Android为TV端助力 集成第三方播放器,实现全屏播放
下面这Demo链接:Android实现全屏播放,各种格式支持直播,点播,不收费!