9

以下工作代码演示了将两个 servlet 包含到 jetty 的嵌入式实例中。

Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
context.addServlet(new ServletHolder(new Html()), "/html");
context.addServlet(new ServletHolder(new Iphone()), "/iphone");       
server.setHandler(context);
server.start();
server.join();

这应该如何改变,而不是使用url“/iphone”,而是使用servlet注释中的urlpatterns,即

@WebServlet(urlPatterns={"/json", "/iphone"})
public class Iphone extends HttpServlet {
    ....
}
4

2 回答 2

7

servlet 位于服务器的类路径中,而不是打包在 WAR 中。

Servlet 3.0 规范指出:

在 Web 应用程序中,使用注解的类只有在它们位于 WEB-INF/classes目录中或打包在WEB-INF/lib应用程序内的 jar 文件中时才会处理它们的注解。

Web 应用程序部署描述符在 web-app 元素上包含一个新的“<code>metadata-complete”属性。“<code>metadata-complete” 属性定义了 web 描述符是否完整,或者是否应该在部署时检查 jar 文件的类文件中的注释和 web 片段。如果“<code>metadata-complete”设置为“ true”,部署工具必须忽略应用程序和 Web 片段的类文件中存在的任何 servlet 注释。如果未指定 metadata-complete 属性或设置为“false”,则部署工具必须检查应用程序的类文件以获取注释,并扫描 Web 片段。

您可能需要查看打包 WAR 并使用具有更多功能的上下文,例如WebAppContext.

或者,您可以尝试自己的注释扫描。某种形式的东西:

void registerServlets(ServletContextHandler context,
                              Class<? extends HttpServlet> type)
          throws InstantiationException, IllegalAccessException,
                 InvocationTargetException, NoSuchMethodException {
    WebServlet info = type.getAnnotation(WebServlet.class);
    for (String pattern : info.urlPatterns()) {
        HttpServlet servlet = type.getConstructor().newInstance();
        context.addServlet(new ServletHolder(servlet), pattern);
    }
}
于 2012-12-19T15:16:41.210 回答
0

请在此处查看我的答案:Embedded Jetty does not find Annotated Servlet

简而言之,您需要:

  1. 按照答案中的说明设置必要的配置
  2. 强制 Jetty 扫描已编译的 servlet 所在的 classes/ 目录。默认情况下,它只扫描我认为的罐子。
于 2017-01-24T20:18:57.007 回答