(Java)App Engine中的静态文件无法访问
示例文档说您只需要将文件放在war /(或子目录)中,并且它们应该可以从主机访问(只要它们不是JSP或WEB-INF)。 例如,如果你将foo.css放在war /中,那么你应该可以在http:// localhost:8080 / foo.css上访问它。 但是,这对我来说根本不起作用。 无法访问我的静态文件。
appengine-web.xml上的文档说您也可以将某些类型明确地表示为静态类型。 我也尝试过这个并没有什么区别。
我错过了一些明显的东西吗
更新:原来我的web.xml中的一个映射有点过于激进了。 以下是罪魁祸首:
Main MainServlet Main /
它似乎抓住了所有未被抓住的其他规则之一,我不明白,因为url-pattern的末尾没有*。 它似乎与文档直接相矛盾:
注意:静态文件,逐字提供给用户的文件(如图像,CSS或JavaScript)与部署描述符中提到的路径分开处理。 无论部署描述符中的servlet和filter映射如何,对与路径中的文件路径匹配的URL路径的请求都将为该文件提供服务,该文件将被视为静态文件。 您可以使用appengine-web.xml文件从被视为静态文件的文件中排除文件。
那么,我怎么能有一个与我的域的基础匹配的规则(例如http://www.example.com/ )并且仍允许静态文件过滤?
尝试在appengine-web.xml中手动定义静态文件
即使像servlet这样,这对我也有用
testServlet /
和
testServlet /*
请参阅静态文件和资源文件
……似乎抓住了一切未被抓住的其他规则,我不理解,因为url-pattern的末尾没有*。 …
[[不幸的是,术语“默认servlet”被重载意味着不同的东西 – 导致混淆。 我会尽力清楚。]]
url-pattern“/”是特殊的(Rogue Wave将其称为“默认映射”)。 这定义了应用程序的“默认servlet”,当URL请求与其他模式(SRV.11.2项目符号3和SRV 11.1项目#4)不匹配时使用。 显然,“/”的处理方式就像指定了“/ *”一样。
……它似乎与文件直接相矛盾……
同意,我认为app引擎有一个bug,所以它不遵循你引用的文档。 这是我对正在发生的事情的理论。 由于您的应用程序有一个默认的servlet(由于为url模式“/”定义了一个servlet),应用程序停止使用容器为未定义自己的“默认servlet”的应用程序提供的“默认”“默认servlet” ”。 容器的“默认”“默认servlet”提供了提供静态文件的默认行为。 我认为这与某些容器的行为方式一致。
我想知道如果您尝试为与静态文件匹配的URL模式指定servlet会发生什么。 它是否为文件提供服务(如文档所示)或调用servlet(如此理论所示)。
…那么,我怎样才能有一个与我的域名基础相匹配的规则(例如http://www.example.com/ )并且仍允许静态文件过滤? …
如果理论是正确的,雅各布(适用于谷歌应用程序引擎)和zockman提供的解决方案似乎都可以工作 – 他们将静态文件映射到容器的“默认”“默认servlet”。
我唯一的另一个想法就是编写应用程序的“默认servlet”来检查请求是否为“/”。 如果是这样,请处理它。 如果没有,则(以某种方式)调用容器的“默认”“默认servlet”来处理请求(希望缓存文件)。 希望一旦静态文件被提供一次,缓存将在未来绕过servlet。
抱歉,我无法更具体或提供代码 – 我还没有使用Google应用引擎(还有!)。
参考:
- JSR-000154 JavaTM Servlet 2.5规范(维护版本2) – http://jcp.org/aboutJava/communityprocess/mrel/jsr154/index2.html – 部分SRV.11.2和SRV.11.1
- http://www2.roguewave.com/support/docs/hydraexpress/3.5.0/html/rwsfservletug/4-3.html#433 – Rogue Wave默认servlet
- http://tomcat.apache.org/tomcat-4.1-doc/catalina/funcspecs/fs-default.html – Tomcat默认servlet
我意识到这是一个非常古老的问题,但我遇到了同样的问题。 我在/war/static/
下放了我的css/*.css
, js/*.css
public_root
和favicon.ico
,并使用appengine-web.xml
的public_root
指令指向/static
。 这在我的本地开发服务器上运行良好,但在我上传应用程序时没有。 摆脱/static
并将一切都提升到一个水平对我有用。
带有Java SE 6的Mac OSX 10.6.8上的SDK v1.5.2(Java)(MacOS X默认)
当使用例如tomcat来提供静态文件时,必须指定这样的模式:
default *.css default *.js
也许你可以尝试做同样的事情?