我在两个不同的容器(Tomcat和Jetty)上部署了一个webapp,但是它们用于提供静态内容的默认servlet有不同的方式来处理我想要使用的URL结构(details)。
因此,我希望在own应用程序中包含一个小servlet来为自己的静态内容(图像,CSS等)提供服务。servlet应具有以下属性:
对于gzip报头,没有外部dependencies
If-Modified-Since
编码的自定义dependencies
这样的servlet在什么地方可用吗?我能找到的最接近的是servlet书中的example 4-10。
我想要使用的结构--如果你想知道的话--很简单:
<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
文件夹中查找)。
发布于 2008-09-25 12:14:08
我最终使用了我自己的StaticServlet
。它支持If-Modified-Since
、gzip编码,也应该能够提供来自war文件的静态文件。这不是非常困难的代码,但也不是完全微不足道的。
代码可用:StaticServlet.java。请随时发表评论。
更新: Khurram询问在StaticServlet
中引用的ServletUtils
类。它只是一个带有辅助方法的类,我在项目中使用了它。您需要的惟一方法是coalesce
(它与SQL函数COALESCE
相同。代码如下:
public static <T> T coalesce(T...ts) {
for(T t: ts)
if(t != null)
return t;
return null;
}
发布于 2010-08-27 15:36:52
我想出了一个稍有不同的解决方案。这有点像黑客,但下面是映射:
<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中都有效。
发布于 2009-05-07 21:00:09
在这种情况下,不需要完全自定义的默认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);
}
}
https://stackoverflow.com/questions/132052
复制相似问题