0

我正在尝试注册一个将接收参数的 HttpServlet(不管它是通过 POST 还是 GET,尽管显然首选 POST)。几乎只是扩展这里描述的内容:

http://www.javaworld.com/javaworld/jw-06-2008/jw-06-osgi3.html?page=3

和这里:

http://www.peterfriese.de/osgi-servlets-a-happy-marriage/

我还没有使用声明式注册,首先希望看到它工作,然后我会做其他的事情。

调用时出现疑问:

httpService.registerServlet("/helloworld", new RestServlet(), null, null);

不知道如何告诉 HttpService 服务器将接受参数。此外,每次注册 servlet 时是否必须使用 new() 创建一个 HttpServlet,或者我可以为不同的别名重复使用相同的 HttpServlet?我问是因为也许可以在别名参数中使用一些通配符,然后让 HttpServlet 对象处理 HttpRequest 中的任何内容......?

欢迎任何帮助/建议/想法!

问候,亚历克斯

4

2 回答 2

2
  • 如果忽略 servlet init,您可以使用同一个 servlet 多次注册。
  • 如果您想查看所有内容,只需注册 /
  • 白板更容易,也是更好的方法。

Http 服务将找到最长的路径并调用该 servlet。所以 / 是一个后备。

没有白板的示例 hello world servlet:

@Component
public class Hello extends HttpServlet {
  public void doGet(HttpServletRequest rq, HttpServletResponse rsp) throws IOException {
    rsp.getWriter().write( ("Hello World " + rq.getParameter("name")).getBytes());
  }

  @Reference
  void setHttp(HttpService http) { http.registerService("/hello", null, null); }
}

例如,现在使用白板:

@Component(provide=Servlet.class, properties="alias=/hello")
public class Hello extends HttpServlet {
  public void doGet(HttpServletRequest rq, HttpServletResponse rsp) throws IOException {
    rsp.getWriter().write( ("Hello World " + rq.getParameter("name")).getBytes());
  }

}

这种东西在 bndtools 中真的很容易玩。使用 DS 创建一个小项目,然后使用 Web 控制台创建一个 bndrun 文件。不会后悔的。

于 2013-02-12T18:21:40.773 回答
0

我对 OSGI 不太了解,但在我看来,这更像是一个纯粹的 servlet 问题。我查看了您提供的链接,希望对您有所帮助。

首先,我认为您不需要告诉HttpService它它会接受参数。当您使用 servlet 时,您可以简单地提取请求参数:

public void doGet(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException {
    req.getParameter(paramName); // get a request parameter
}

其次,我认为您可以将同一个 Servlet 用于多个“别名”。这对我来说似乎是一种 servlet 映射:您可以对同一个 servlet 使用多个映射(/helloworld/helloxyz)。

于 2013-02-12T17:30:09.013 回答