嵌入式码头不加载 servlet 或 jersey servlet container.I 能够加载其中一个但不能同时加载
Embedded jetty not loading servlet or jersey servlet container.I am able to load either of them but not both
我是 运行 带有球衣容器的嵌入式码头。我正在测试我是否可以前往 '/hello' 来读取我的 servlet,它可以请求调度和另一个 url '/entry/test' 来进入我的入口点 class。其中只有一个基于最后添加的处理程序工作。
我试图推理出类似于:embedded jetty server does not run both servlet and webapp
ServletContextHandler contextHandler = new ServletContextHandler(
ServletContextHandler.SESSIONS);
contextHandler.setContextPath("/*");
Server jettyServer = new Server(8980);
WebAppContext webappcontext = new WebAppContext();
File warPath = new File( System.getProperty("user.dir"), "src/main/resources");
webappcontext.setWar(warPath.getAbsolutePath());
webappcontext.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed",
"false");
webappcontext.addServlet(new ServletHolder(new MyServlet()), "/hello");
ServletHolder jerseyServlet = contextHandler.addServlet(
org.glassfish.jersey.servlet.ServletContainer.class, "/*");
jerseyServlet.setInitOrder(0);
jerseyServlet.setInitParameter( "jersey.config.server.provider.classnames",
EntryPoint.class.getCanonicalName());
HandlerList handlerCollection = new HandlerList();
//handlerCollection.setHandlers(new Handler[] { contextHandler,webappcontext });
handlerCollection.setHandlers(new Handler[] { webappcontext,contextHandler });
// Based on which handler was added last, i am able to view /hello or /entry/test
jettyServer.setHandler(handlerCollection);
try {
jettyServer.start();
jettyServer.join();
} finally {
jettyServer.destroy();
}
/hello 显示我的 servlet 页面和 /entry/test 查看入口点 class 内容
根据您的情况,无需混用 WebAppContext
和 ServletContextHandler
。
使用其中之一。
- 如果你有一个正式的 WAR 文件,使用
WebAppContext
,带有(可选)WEB-INF/web.xml
。如果您需要运行时 bytecode/annotation 扫描您的 类(例如 @WebServlet
),请使用。
- 如果您手动声明 Servlet(就像您现在这样),请使用
ServletContextHandler
。
此外,不要在 Jersey 配置中使用 url 模式 "/*"
,这几乎意味着 Jersey 将接受请求。如果可以的话,将泽西岛分成它自己的 url 模式。一种常见的方法是让 "/api/*"
由 Jersey 处理,其余的由你想在 Servlet 容器中使用的任何东西处理。如果您采用这种方法,请确保您充分了解 Servlet 规范如何与上下文路径、url 模式、路径规范、路径信息等一起工作,因为这将帮助您正确导航 Jersey 配置。
您拥有的示例,但仅使用 ServletContextHandler
Server jettyServer = new Server(8980);
ServletContextHandler contextHandler = new ServletContextHandler(
ServletContextHandler.SESSIONS);
// Context-paths are not patterns, they are prefixes
contextHandler.setContextPath("/");
// Setup where static files are found
File warPath = new File(System.getProperty("user.dir"), "src/main/resources");
Resource warResource = new PathResource(warPath);
contextHandler.setBaseResource(warResource);
// Add your Jersey setup
// BWEE! BWEE! do not use "/*" for your url-pattern, if you want to do things
// in your servlet container that is not Jersey.
String jerseyUrlPattern = "/api/*";
ServletHolder jerseyServlet = contextHandler.addServlet(
org.glassfish.jersey.servlet.ServletContainer.class, jerseyUrlPattern);
jerseyServlet.setInitOrder(0);
jerseyServlet.setInitParameter("jersey.config.server.provider.classnames",
EntryPoint.class.getCanonicalName());
// Add your custom Servlets
contextHandler.addServlet(MyServlet.class, "/hello");
// Add DefaultServlet to serve static files (servlet spec requirement)
// always added last in your ServletContext.
// always named "default" for this specific servlet setup (per spec)
ServletHolder defaultHolder = new ServletHolder("default", DefaultServlet.class);
defaultHolder.setInitParameter("dirAllowed", "true");
// always at url-pattern "/" for this specific servlet (per spec)
contextHandler.addServlet(defaultHolder, "/");
HandlerList handlers = new HandlerList();
handlers.addHandler(contextHandler);
handlers.addHandler(new DefaultHandler()); // used to show config errors
jettyServer.setHandler(handlers);
try
{
jettyServer.start();
jettyServer.join();
}
finally
{
jettyServer.stop(); // use STOP not .destroy()
}
我是 运行 带有球衣容器的嵌入式码头。我正在测试我是否可以前往 '/hello' 来读取我的 servlet,它可以请求调度和另一个 url '/entry/test' 来进入我的入口点 class。其中只有一个基于最后添加的处理程序工作。
我试图推理出类似于:embedded jetty server does not run both servlet and webapp
ServletContextHandler contextHandler = new ServletContextHandler(
ServletContextHandler.SESSIONS);
contextHandler.setContextPath("/*");
Server jettyServer = new Server(8980);
WebAppContext webappcontext = new WebAppContext();
File warPath = new File( System.getProperty("user.dir"), "src/main/resources");
webappcontext.setWar(warPath.getAbsolutePath());
webappcontext.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed",
"false");
webappcontext.addServlet(new ServletHolder(new MyServlet()), "/hello");
ServletHolder jerseyServlet = contextHandler.addServlet(
org.glassfish.jersey.servlet.ServletContainer.class, "/*");
jerseyServlet.setInitOrder(0);
jerseyServlet.setInitParameter( "jersey.config.server.provider.classnames",
EntryPoint.class.getCanonicalName());
HandlerList handlerCollection = new HandlerList();
//handlerCollection.setHandlers(new Handler[] { contextHandler,webappcontext });
handlerCollection.setHandlers(new Handler[] { webappcontext,contextHandler });
// Based on which handler was added last, i am able to view /hello or /entry/test
jettyServer.setHandler(handlerCollection);
try {
jettyServer.start();
jettyServer.join();
} finally {
jettyServer.destroy();
}
/hello 显示我的 servlet 页面和 /entry/test 查看入口点 class 内容
根据您的情况,无需混用 WebAppContext
和 ServletContextHandler
。
使用其中之一。
- 如果你有一个正式的 WAR 文件,使用
WebAppContext
,带有(可选)WEB-INF/web.xml
。如果您需要运行时 bytecode/annotation 扫描您的 类(例如@WebServlet
),请使用。 - 如果您手动声明 Servlet(就像您现在这样),请使用
ServletContextHandler
。
此外,不要在 Jersey 配置中使用 url 模式 "/*"
,这几乎意味着 Jersey 将接受请求。如果可以的话,将泽西岛分成它自己的 url 模式。一种常见的方法是让 "/api/*"
由 Jersey 处理,其余的由你想在 Servlet 容器中使用的任何东西处理。如果您采用这种方法,请确保您充分了解 Servlet 规范如何与上下文路径、url 模式、路径规范、路径信息等一起工作,因为这将帮助您正确导航 Jersey 配置。
您拥有的示例,但仅使用 ServletContextHandler
Server jettyServer = new Server(8980);
ServletContextHandler contextHandler = new ServletContextHandler(
ServletContextHandler.SESSIONS);
// Context-paths are not patterns, they are prefixes
contextHandler.setContextPath("/");
// Setup where static files are found
File warPath = new File(System.getProperty("user.dir"), "src/main/resources");
Resource warResource = new PathResource(warPath);
contextHandler.setBaseResource(warResource);
// Add your Jersey setup
// BWEE! BWEE! do not use "/*" for your url-pattern, if you want to do things
// in your servlet container that is not Jersey.
String jerseyUrlPattern = "/api/*";
ServletHolder jerseyServlet = contextHandler.addServlet(
org.glassfish.jersey.servlet.ServletContainer.class, jerseyUrlPattern);
jerseyServlet.setInitOrder(0);
jerseyServlet.setInitParameter("jersey.config.server.provider.classnames",
EntryPoint.class.getCanonicalName());
// Add your custom Servlets
contextHandler.addServlet(MyServlet.class, "/hello");
// Add DefaultServlet to serve static files (servlet spec requirement)
// always added last in your ServletContext.
// always named "default" for this specific servlet setup (per spec)
ServletHolder defaultHolder = new ServletHolder("default", DefaultServlet.class);
defaultHolder.setInitParameter("dirAllowed", "true");
// always at url-pattern "/" for this specific servlet (per spec)
contextHandler.addServlet(defaultHolder, "/");
HandlerList handlers = new HandlerList();
handlers.addHandler(contextHandler);
handlers.addHandler(new DefaultHandler()); // used to show config errors
jettyServer.setHandler(handlers);
try
{
jettyServer.start();
jettyServer.join();
}
finally
{
jettyServer.stop(); // use STOP not .destroy()
}