嵌入式Jetty带有带注释的servlet模式?

时间:2012-12-19 12:38:10

标签: java jetty embedded-jetty servlet-3.0

以下工作代码演示了将两个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 {
    ....
}

2 个答案:

答案 0 :(得分:7)

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

Servlet 3.0 specification州:

  

在Web应用程序中,使用注释的类将具有它们的   仅当注释位于其中时才处理注释   WEB-INF/classes目录,或者如果它们打包在jar文件中   位于应用程序内的WEB-INF/lib

     

Web应用程序部署描述符包含一个新的   web-app元素上的“metadata-complete”属性。该   “metadata-complete”属性定义Web描述符是否为   完成,或者是否应该是jar文件的类文件   在部署时检查注释和Web片段。如果   “metadata-complete”设置为“true”,部署工具必须   忽略在类文件中出现的任何servlet注释   应用程序和Web片段。如果是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);
    }
}

答案 1 :(得分:0)

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

简而言之,您需要:

  1. 按照答案
  2. 中的说明设置必要的配置
  3. 强制Jetty扫描编译的servlet所在的classes /目录。默认情况下,它只扫描我认为的罐子。