用于提供静态内容的 Servlet

2022-08-31 07:38:10

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

因此,我希望在Web应用程序中包含一个小的servlet来提供自己的静态内容(图像,CSS等)。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,除非它们用于路径。问题在于Tomcat的默认servlet没有考虑ServletPath(因此它在主文件夹中查找静态文件),而Jetty则考虑了ServletPath(因此它在文件夹中查找)。staticstatic


答案 1

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

<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。


答案 2

在这种情况下,不需要完全自定义默认 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);
    }
}