一尘不染

Java Servlet,用于提供静态内容

java

我在两个不同的容器(Tomcat和Jetty)上部署了一个webapp,但是它们用于提供静态内容的默认servlet具有处理我要使用的URL结构的不同方式(详细信息)。

因此,我希望在web应用程序中包含一个小型servlet,以提供其自己的静态内容(图像,CSS等)。Servlet应该具有以下属性:

  • No external dependencies
  • Simple and reliable
  • Support for If-Modified-Since header (i.e. custom getLastModified method)
  • (Optional) support for gzip encoding, etags,…

这样的servlet在某处可用吗?我能找到的最接近的是servlet书中的示例4-10。

更新:我想使用的URL结构-如果你想知道的话-很简单:

    <servlet-mapping>
            <servlet-name>main</servlet-name>
            <url-pattern>/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
            <servlet-name>default</servlet-name>
            <url-pattern>/static/*</url-pattern>
    </servlet-mapping>

因此,所有请求都应传递到主servlet,除非它们是static路径请求。问题在于,Tomcat的默认Servlet未考虑ServletPath(因此它在主文件夹中查找静态文件),而Jetty则将其考虑(因此在static文件夹中查找)。


阅读 382

收藏
2020-02-29

共1个答案

一尘不染

StaticServlet。它支持If-Modified-Sincegzip编码,并且还应该能够提供war文件中的静态文件。这不是很困难的代码,但是也不是完全无关紧要的。

该代码可用:StaticServlet.java。随时发表评论。

更新: Khurram询问有关ServletUtils中引用的类StaticServlet。这只是我用于项目的带有辅助方法的类。你唯一需要的方法是coalesce(与SQL函数相同COALESCE)。这是代码:

public static <T> T coalesce(T...ts) {
    for(T t: ts)
        if(t != null)
            return t;
    return null;
}
2020-02-29