在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,过程如下:

  1. New --> Other --> Plug-in Project, 点 “Next”
  2. 填写“Project name”;
  3. "Target Platform"一栏,选择“an OSGI framework" --> "standard", 点 "Next", "Next"

  1. 不选任何模板,直接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实现,我们就需要:

  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添加进去就可又了:

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

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

原文地址:https://www.cnblogs.com/dyh004/p/10647858.html

时间: 2024-08-29 23:35:33

在OSGI容器Equinox中嵌入HttpServer的相关文章

OSGi#3:ClassLoader中嵌入Equinox

Java语言的模块化之路似乎走得异常艰辛,但实际上技术难点看上去并不像是最大的问题,OSGi已经是业内公认的标准,正如这篇文章中作者所说的, I suspect the answer to these questions has little to do with technology, and more to do with politics. anyway,要等到Java语言级别来支持模块化,不知道要何年何月.最近做了个尝试,直接在ClassLoader中嵌入Equinox容器,这样是不是也

WPF中嵌入普通Win32程序的方法

公司现在在研发基于.Net中WPF技术的产品,由于要兼容旧有产品,比如一些旧有的Win32程序.第三方的Win32程序等等,还要实现自动登录这些外部Win32程序,因此必须能够将这些程序整合到我们的系统中来,让使用者看起来它们好像是一个程序. 在MSDN中有专门的章节提到了在WPF中嵌入Win32控件的办法,那就是使用 HwndHost ,只要把 Win32控件的句柄传递给 HwndHost 就可以了.MSDN中的例子演示的都是在同一个进程内创建的 Win32控件,我一开始认为只要通过FindW

《深入理解OSGi:Equinox原理、应用与最佳实践》笔记_1_运行最简单的bundlehelloworld

<深入理解OSGi:Equinox原理.应用与最佳实践>笔记_1_运行最简单的bundlehelloworld 买了周大大的OSGI的书看 先前完全没有基础 就靠这本书看看学学 顺便记一些笔记 今天先跳到了第5章的equinox启航部分 第一个简单的helloworld就遇到了问题.... 因为eclipse版本和书中不同 用书中所说得到的全是异常.... 搜索有关资料以后可以运行正常了 以此来记录一下: 在较新版本的eclipse中 不能通过java -jar org.eclipse.osg

在自己的网页中嵌入百度地图

最近项目需要在网页中嵌入地图,于是在这里记录下网页嵌入百度地图和使用百度地图api自定义地图的步骤,需要的朋友也可以参考下 首先进入http://api.map.baidu.com/lbsapi/creatmap/,搜索自己想要显示的经纬度,即为定义的中心点坐标 其余的在代码中有注释,可以根据自己需要进行更改 <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conte

Java嵌入式数据库H2学习总结(三)——在Web应用中嵌入H2数据库

H2作为一个嵌入型的数据库,它最大的好处就是可以嵌入到我们的Web应用中,和我们的Web应用绑定在一起,成为我们Web应用的一部分.下面来演示一下如何将H2数据库嵌入到我们的Web应用中. 一.搭建测试环境和项目 1.1.搭建JavaWeb测试项目 创建一个[H2DBTest]JavaWeb项目,找到H2数据库的jar文件,如下图所示: H2数据库就一个jar文件,这个Jar文件里面包含了使用JDBC方式连接H2数据库时使用的驱动类,将"h2-1.4.183.jar"加入到[H2DBT

JSP中嵌入java代码方式以及指令

JSP中嵌入java代码的三种方式: (1)声明变量或方法 :  <%! 声明; %> :慎重使用,因为此方法定义的是全局变量 (2)java片段(scriptlet):  <% java代码; %> (3)表达式:用于输出表达式的值到浏览器,<%=表达式  %>  在表达式中不能加分号(;) JSP页面的指令 <%@ page %> //这个一般是写在最顶上的比如导入等 <%@ page language="java" impor

OSGI容器与插件

插件必须符合osgi规范才能插到osgi容器中,osgi容器查看插件jar中MANIFEST.MF中osgi容器. 所谓插件----就是打包好的jar文件,  内部都封装好了一些功能

使用CefSharp在.NET中嵌入Google kernel

原文:使用CefSharp在.NET中嵌入Google kernel 使用CefSharp可以在.NET轻松的嵌入Html,不用担心WPF与Winform 控件与它的兼容性问题,CefSharp大部分的代码是C#,它可以在VB或者其他.NET平台语言中来进行使用. 近几天来,公司项目中需要使用WebBrowser,其中考虑了几个控件,如1.Winform中的WebBrowser    2.WPF中的WebBrowser    3.WebKit.Net     4.CefSharp Winform

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 选择调用的进程为 24 i386 getuid sys_getuid1647 i386 getgid sys_getgid16 使用库函数API方式 使用C代码中嵌入汇编代码方式