【问题标题】:Serve static content on a per servlet basis为每个 servlet 提供静态内容
【发布时间】:2015-12-05 02:56:15
【问题描述】:

我正在制作一个基于配置文件动态加载模块的应用程序。每个模块都有自己的 servlet 和自己的路径。

它有效,但到目前为止,它只提供我在课堂上用@Path 注释的内容(休息服务),这要归功于ServerProperties.PROVIDER_PACKAGES 属性:

上下文:

    ServletContextHandler context = new ServletContextHandler( ServletContextHandler.SESSIONS );
    context.setContextPath( "/" );

每个模块/servlet 的初始化如下:

    ServletHolder jerseyServlet = context.addServlet( org.glassfish.jersey.servlet.ServletContainer.class, "/" );
    jerseyServlet.setInitOrder( 0 );
    jerseyServlet.setInitParameter( ServerProperties.PROVIDER_PACKAGES, "com.my.packages.rest.server.root" );

这为我提供了每个模块的 url 路径 - 很棒。

但是我在每个模块的资源/模块名文件夹中也有一些静态的html,我不知道如何服务...

使用 DefaultServlet,我可以这样做:

    DefaultServlet defaultServlet = new DefaultServlet();
    ServletHolder staticAppServlet = new ServletHolder( "default", defaultServlet );
    staticAppServlet.setInitParameter( "resourceBase", "./src/main/resources/modulename/" );
    context.addServlet( staticAppServlet, "/path" );

但我不知道如何使用码头ServletHolder

有什么想法吗?

【问题讨论】:

    标签: java jetty javax.ws.rs


    【解决方案1】:

    不要重复使用“default”这个名字,为每个模块取一个新名字。

    使用完全限定的资源库路径也很重要,可以作为完整的文件系统路径,也可以作为绝对 URL。

    这是来自 embedded-jetty-cookbook 示例的示例,名为 DefaultServletMultipleBases.java

    // add special pathspec of "/alt/" content mapped to the altPath
    ServletHolder holderAlt = new ServletHolder("static-alt", DefaultServlet.class);
    holderAlt.setInitParameter("resourceBase",altPath.toUri().toASCIIString());
    holderAlt.setInitParameter("dirAllowed","true");
    holderAlt.setInitParameter("pathInfoOnly","true");
    context.addServlet(holderAlt,"/alt/*");
    

    【讨论】:

    • 你的意思是你可以拥有多个 defaultservlet?
    • 当然,它只是一个 Servlet。只有名为“default”的那个是特殊的(用于错误处理)
    • 太棒了,我会尽快尝试的。
    猜你喜欢
    • 2010-09-13
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多