Java 如何将servlet与OSGi结合使用

Java 如何将servlet与OSGi结合使用,java,html,maven,servlets,osgi,Java,Html,Maven,Servlets,Osgi,我想创建一个web服务并将其部署到OSGi容器中。例如,将服务发布到以下地址: http://localhost:8080/testservice. 该服务在servlet中生成HTML响应 我搜索了很多,得到了: public class HelloWorldServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws

我想创建一个web服务并将其部署到OSGi容器中。例如,将服务发布到以下地址:

http://localhost:8080/testservice. 
该服务在servlet中生成HTML响应

我搜索了很多,得到了:

public class HelloWorldServlet extends HttpServlet {
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Hola</title>");
    out.println("</head>");
    out.println("<body bgcolor=\"white\">");
    out.println("</body>");
    out.println("</html>");
  }
}
公共类HelloWorldServlet扩展了HttpServlet{
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
response.setContentType(“text/html”);
PrintWriter out=response.getWriter();
out.println(“”);
out.println(“”);
out.println(“Hola”);
out.println(“”);
out.println(“”);
out.println(“”);
out.println(“”);
}
}
我需要使用的工具:

  • maven创建项目

  • 将ESB karaf融合为OSGi容器

  • 问题是我不知道如何使用Maven创建和实现这样的web服务,比如:

    • 如何指定
      webapp/web.xml

    • 如何指定
      pom.xml
      :依赖项、包类型、插件

    • 如何注册服务:实现
      bundleActivator
      或配置SpringXML文件


    有人能帮我吗?是否有针对新手的详细教程?

    检查此项,如果您使用bndtools,创建声明性服务项目并将此注释添加到servlet,可能会对您有所帮助:

     @Component(provide = Servlet.class, properties = {"alias=/hello"})
     public class HelloWorldServlet extends HttpServlet { ... }
    
    然后使用“ApacheFelix4withWebConsoleandGogo”创建一个bnd运行描述符,只需添加ApacheFelixHTTPWhiteboard包,就可以了。您可以在
    http://localhost:8080/hello


    它是如何工作的。@Component注释使您的类成为一个服务(由于提供属性,在本例中是一个Servlet服务)。这是使用服务属性“alias”注册的。ApacheFelixHTTP白板包获取这些服务并将它们注册为servlet。我认为它再简单不过了。

    您可能会发现以下教程很有帮助:。这是基于《圣经》第二章的。第八章还讨论了如何使用像maven这样的构建工具来获得正确的bundle结构,并提供了非常有用的maven说明


    在较高的层次上,您最好的方法可能是利用ApacheAries或EclipseGemini之类的工具来运行WAB(一个web包)。WAB的结构几乎与WAR完全相同,只是清单中包含OSGi元数据。servlet类本身与非OSGi情况相同。该框架将负责发现和启动servlet

    为了回答您的问题,由于Karaf(FUSE ESB)使用Pax Web作为其默认Web容器,请查看其工作原理的更多详细信息,可能是Pax Web的100多个应用程序中最适合您的应用程序,让您了解如何使用它。也可以通过白板扩展器或WAR/WAB向您展示如何使用标准Http服务

    我想您需要一个servlet桥来访问该服务。您的服务应该实现为一个OSGI包;servlet桥必须具有嵌入式OSGI框架。请按照此示例了解详细信息:

    我想继续了解的答案。使用OSGi规范中可用的
    @组件
    注释,示例可能如下所示:

    @Component(service=Servlet.class,property={“osgi.http.whiteboard.Servlet.pattern=/hello”})
    公共类HelloWorldServlet扩展了HttpServlet{…}
    
    @Component
    注释是从
    org.osgi.service.Component
    导入的,指定已实现服务的属性已将其名称更改为
    service

    例如,
    property
    可以包含多个属性

    @组件(服务=…,属性={“a=b”,“c=d”})
    
    或者,您可以使用
    properties
    指定一个或多个属性文件,如下所示:

    @Component(服务=…,属性={“OSGI-INF/servlet.properties”})
    

    以上内容已经用ApacheFelix附带的
    HttpService
    进行了测试。ApacheFelixHTTP服务的文档可以在这里找到:

    我的示例演示了一个简单但完整的基于OSGi的应用程序,它使用了一些servlet。它在其容器中没有使用ApacheKaraf,但应该可以帮助您了解它的工作原理。@Component足够了吗?我一直认为Servlet也必须声明为\@服务。我需要使用FUSE ESB Enterprise。无法切换到Apache Felix。ApacheFelix和ApacheKaraf相似吗?@ilikeorangutans是的,这就足够了。请注意“provide=Servlet.class”属性。@Li“FUSE ESB和Karaf都构建在ApacheFelix之上。所以你根本不需要切换。无论如何,所有这些都适用于任何框架,例如Equinox和Knopflerfish。欢迎使用OSGi,我们非常重视可重用性和可移植性!!FUSE ESB和Karaf使用Pax Web作为HTTPService的底层实现,Peter的回答对于HTTPService的这个实现也是正确的。Pax Web确实为您提供了std.HTTPService无法提供的更多功能,例如白板扩展器,它还可以用于过滤器、JSP和其他资源。更不用说你能在卡拉夫部署性病战争了。