首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于提供静态内容的Servlet

用于提供静态内容的Servlet
EN

Stack Overflow用户
提问于 2008-09-25 08:04:28
回答 14查看 176.3K关注 0票数 150

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

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

对于gzip报头,没有外部dependencies

  • Simple和reliable

  • Simple、etags,...

这样的servlet在什么地方可用吗?我能找到的最接近的是servlet书中的example 4-10

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

代码语言:javascript
复制
    <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文件夹中查找)。

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2008-09-25 12:14:08

我最终使用了我自己的StaticServlet。它支持If-Modified-Since、gzip编码,也应该能够提供来自war文件的静态文件。这不是非常困难的代码,但也不是完全微不足道的。

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

更新: Khurram询问在StaticServlet中引用的ServletUtils类。它只是一个带有辅助方法的类,我在项目中使用了它。您需要的惟一方法是coalesce (它与SQL函数COALESCE相同。代码如下:

代码语言:javascript
复制
public static <T> T coalesce(T...ts) {
    for(T t: ts)
        if(t != null)
            return t;
    return null;
}
票数 20
EN

Stack Overflow用户

发布于 2010-08-27 15:36:52

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

代码语言:javascript
复制
<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中都有效。

票数 56
EN

Stack Overflow用户

发布于 2009-05-07 21:00:09

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

代码语言:javascript
复制
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);
    }
}
票数 46
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/132052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档