用于提供静态内容的Servlet

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

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

  • 没有外部依赖性
  • 简单可靠
  • 支持If-Modified-Since标题(即自定义getLastModified方法)
  • (可选)支持gzip编码,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文件夹中)。


    我想出了一个稍微不同的解决方案。 这有点黑客 - 但是这里是映射:

    <servlet-mapping>   
        <servlet-name>default</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
     <servlet-name>default</servlet-name>
        <url-pattern>*.png</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>myAppServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    

    这基本上只是将所有内容文件通过扩展映射到默认的servlet,而其他所有内容都映射到“myAppServlet”。

    它适用于Jetty和Tomcat。


    在这种情况下,不需要完全自定义实现默认的servlet,您可以使用这个简单的servlet将请求包装到容器的实现中:

    
    package com.example;
    
    import java.io.*;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    
    public class DefaultWrapperServlet extends HttpServlet
    {   
        public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
        {
            RequestDispatcher rd = getServletContext().getNamedDispatcher("default");
    
            HttpServletRequest wrapped = new HttpServletRequestWrapper(req) {
                public String getServletPath() { return ""; }
            };
    
            rd.forward(wrapped, resp);
        }
    }
    

    我使用FileServlet获得了很好的结果,因为它支持几乎所有的HTTP(etags,chunking等)。

    链接地址: http://www.djcxy.com/p/46219.html

    上一篇: Servlet for serving static content

    下一篇: How to retrieve and display images from a database in a JSP page?