如何在OSGi中使用servlet

时间:2013-05-01 06:21:34

标签: java html maven servlets osgi

我想为OSGi容器创建和部署Web服务。例如,将服务发布到地址:

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>");
  }
}

我需要使用的工具:

  1. maven创建项目

  2. 将ESB karaf融合为OSGi容器

  3. 问题是我不知道如何使用Maven来创建和实现这样的Web服务,例如:

    • 如何指定webapp/web.xml

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

    • 如何注册服务:实现BundlActivator或配置Spring xml文件

    任何人都可以帮我吗?是否有新手的详细教程?

6 个答案:

答案 0 :(得分:5)

如果您使用bndtools,请创建一个Declarative Services项目并将此注释添加到您的servlet中:

 @Component(provide = Servlet.class, properties = {"alias=/hello"})
 public class HelloWorldServlet extends HttpServlet { ... }

然后使用'Apache Felix 4 with Web Console and Gogo'创建一个bnd运行描述符,只需添加Apache Felix Http白板包,你就可以了。您可以在http://localhost:8080/hello

找到您的servlet

工作原理。 @Component注释使您的类成为一个服务(在这种情况下由于提供属性而成为Servlet服务)。这是在服务属性“别名”中注册的。 Apache Felix Http Whiteboard捆绑包获取这些服务并将它们注册为servlet。我认为它不会比这更简单。

答案 1 :(得分:5)

我想跟进Peter Kriens的回答。通过OSGi规范中提供的@Component注释,示例可能如下所示:

@Component(service = Servlet.class, property = { "osgi.http.whiteboard.servlet.pattern = /hello" })
public class HelloWorldServlet extends HttpServlet { ... }

@Component导入org.osgi.service.component注释,指定已实施服务的属性已将其名称更改为service

尽管名称如此,property可以包含多个属性,例如

@Component(service = ..., property = { "a=b", "c=d" })

或者您可以使用properties指定一个或多个属性文件,如下所示:

@Component(service = ..., properties = { "OSGI-INF/servlet.properties" } )

上面已经使用Apache Felix附带的HttpService进行了测试。可以在此处找到Apache Felix HTTP服务的文档:http://felix.apache.org/documentation/subprojects/apache-felix-http-service.html

答案 2 :(得分:3)

选中此项,可能会对您有所帮助Create a servlet that accesses an OSGi service

答案 3 :(得分:1)

您可能会发现以下教程很有用:http://www.javabeat.net/2011/11/writing-an-osgi-web-application/。它基于Enterprise OSGi in Action的第二章。第八章还讨论了如何使用像maven这样的构建工具来获得正确的包结构,http://coding.alasdair.info/2011/01/creating-web-application-bundle-using.html也有非常有用的maven指令。

在最高级别,您最好的方法可能是利用Apache Aries或Eclipse Gemini之类的东西来运行WAB(Web捆绑包)。 WAB的结构几乎与WAR类似,只是清单中包含OSGi元数据。您的servlet类本身与非OSGi案例相同。该框架将处理发现和启动您的servlet。

答案 4 :(得分:0)

要回答您的问题,因为Karaf(FUSE ESB)使用Pax Web作为其默认Web容器,请查看Pax Web以了解其工作原理的详细信息,并且可能最适合您的超过100 integration tests samples 3x} Pax Web为您提供了如何使用它的想法。还有{{3}}可用于向您展示如何使用std。 Http-Service,通过Whiteboard-Extender或WAR / WAB。

答案 5 :(得分:0)

我猜你需要一个servlet桥来访问该服务。您的服务应该作为OSGI包实现; servlet桥必须具有嵌入式OSGI框架。请按照此示例获取详细信息:http://vbashur.blogspot.kr/2014/07/osgi-servlet-bridge-sample.html