在OSGI容器Equinox中嵌入HttpServer

来源:互联网 发布:java ant 安装 编辑:程序博客网 时间:2024/05/21 05:42

简单介绍一下如何在一个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代码  收藏代码
  1. <html>  
  2. <title>测试OSGI和HTTP</title>  
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  4. <body>  
  5. <form action="print" method="get">  
  6. 请输入名字:  
  7.   <input type="text" name="name" />  
  8.   <input type="submit" value="提交" />  
  9. </form>  
  10. </body>  
  11. </html>  

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

2、Servlet类

 

Java代码  收藏代码
  1. package testhttp.servlets;  
  2.   
  3. import java.io.BufferedWriter;  
  4. import java.io.IOException;  
  5. import java.io.OutputStreamWriter;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. import org.osgi.framework.BundleContext;  
  13.   
  14. public class PrintNameServlet extends HttpServlet{  
  15.       
  16.     private static final long serialVersionUID = -9080875068147052401L;  
  17.       
  18.     private BundleContext context;  
  19.       
  20.     public PrintNameServlet(BundleContext context) {  
  21.         super();  
  22.         this.context = context;  
  23.     }  
  24.   
  25.     @Override  
  26.     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
  27.             throws ServletException, IOException {  
  28.         doGet(req, resp);  
  29.     }  
  30.       
  31.     @Override  
  32.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  33.             throws ServletException, IOException {  
  34.           
  35.         resp.setCharacterEncoding("UTF-8");  
  36.           
  37.         String name = req.getParameter("name");  
  38.         System.out.println(name);  
  39.           
  40.         String s = "";  
  41.         if(name==null||"".equals(name.trim())){  
  42.             s = "你没有输入名字";  
  43.         }else{  
  44.             s = "你输入的名字是:"+name.trim();  
  45.         }  
  46.         StringBuilder sb = new StringBuilder();  
  47.         sb.append("<html><title>Response</title><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");  
  48.         sb.append("<body>");  
  49.         sb.append(s);  
  50.         sb.append("</body></html>");  
  51.           
  52.         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(resp.getOutputStream(),"UTF-8"));  
  53.         bw.write(sb.toString());  
  54.         bw.flush();  
  55.         bw.close();  
  56.     }  
  57.   
  58. }  

 

3、注册

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

 

  • 取得HttpService对象

        private HttpService service;

Java代码  收藏代码
  1. public void start(BundleContext bundleContext) throws Exception {  
  2.     Activator.context = bundleContext;  
  3.     ServiceReference serviceReference = bundleContext.getServiceReference(HttpService.class.getName());  
  4.     service = (HttpService) bundleContext.getService(serviceReference);  
  5. }  

  

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

  • 注册页面和Servlet

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

 

Java代码  收藏代码
  1. public void start(BundleContext bundleContext) throws Exception {  
  2.     Activator.context = bundleContext;  
  3.     ServiceReference serviceReference = bundleContext.getServiceReference(HttpService.class.getName());  
  4.     service = (HttpService) bundleContext.getService(serviceReference);  
  5.   
  6.                //register  
  7.     HttpContext httpContext = service.createDefaultHttpContext();  
  8.       
  9.     service.registerResources("/osgi""/web", httpContext); //设置别名,所有对"/osgi"映射到"web"目录  
  10.     service.registerServlet("/osgi/print"new PrintNameServlet(bundleContext)  
  11.     , null, httpContext);   //设置servlet别名,'/osgi/print"映射到servlet的实现  
  12. }  
  •  退出时移除别名
Java代码  收藏代码
  1. public void stop(BundleContext bundleContext) throws Exception {  
  2.     service.unregister("/osgi/print");  
  3.     service.unregister("/osgi");  
  4.     Activator.context = null;  
  5. }  
  • 启动bundle

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

bundle

 

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

submit

 

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

requestresponse

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 眼镜框铰链坏了怎么办 金属眼镜框歪了怎么办 眼镜框螺丝断了怎么办 眼镜被压变形了怎么办 金属眼镜腿断了怎么办 眼镜弹簧腿断了怎么办 眼镜腿螺丝太紧怎么办 眼镜金属柄断了怎么办 金属眼镜腿折了怎么办 眼镜腿中间断了怎么办 塑料眼镜腿断了怎么办 眼镜上的螺丝拧不紧怎么办 眼镜的把坏了怎么办 把眼镜坐坏了怎么办 梦见眼镜腿掉了怎么办 眼镜的腿掉了怎么办 眼镜腿的螺丝掉了怎么办 爱大爱眼镜掉腿了怎么办 合金眼镜腿断了怎么办 手关节复位h疼痛怎么办 我叫mt红色卡牌怎么办 星盟冲突qq登录怎么办 汽车雷达下雨一直响怎么办 火山小视频封火力怎么办 电脑被当成矿机怎么办 哥华有线机顶盒反应慢怎么办 电脑绣花机编码器坏了怎么办? 伺服电机开起没有力怎么办 西门子冰箱排水孔堵塞怎么办 数控车床西门子系统卡顿怎么办 手机系统不支持多屏互动怎么办 伺服驱动器系统错误报警怎么办 防雷接地电阻不符合规范怎么办 微信支付风控了怎么办 伺服电机没有配原点开关怎么办 电脑自带游戏打不开怎么办 战地1更新很慢怎么办 客户端提示初始化控件失败怎么办 刺客信条兄弟会存档损坏怎么办 百度不小心点赞怎么办 c盘空间不够了怎么办