以下工作代码演示了将两个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 {
....
}
答案 0 :(得分:7)
servlet位于服务器的类路径上,而不是打包在WAR中。
在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
简而言之,您需要: