2009-06-22 84 views
13

example documentation表示您只需将文件置于war /(或子目录)中,并且应该可以从主机访问它们(只要它们不是JSP或在WEB-INF中)。例如,如果您将foo.css置于war中,那么您应该可以在http://localhost:8080/foo.css上访问它。但是,这根本不适合我。没有我的静态文件可以访问。(Java)App Engine中的静态文件无法访问

appengine-web.xml上的文档说,您还可以特定地将某些类型表示为静态。我也尝试过这一点,它没有任何区别。

我错过了一些明显的东西吗?

更新: 原来我的web.xml中的一个映射有点太过分了。以下是罪魁祸首:

<servlet> 
    <servlet-name>Main</servlet-name> 
    <servlet-class>MainServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Main</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

它似乎抓住了,这不是被抓住的其他规则之一的一切,我不理解,因为有在URL-的末尾没有*模式。这也似乎是直接矛盾the documentation,上面写着:

注:静态文件,它们逐字提供给用户,如图片,CSS或JavaScript文件,分别从部署描述符中提及的路径处理。无论在部署描述符中使用何种servlet和过滤器映射,对WAR路径中与被指定为静态文件的文件路径匹配的URL路径请求都将为该文件提供服务。您可以使用appengine-web.xml文件将那些被视为静态文件的文件排除在外。

那么,我怎么能有一个规则匹配我的域的基础(例如http://www.example.com/),仍然允许静态文件过滤?

+0

做附带SDK工作的样本?如何启动应用程序。我想你已经检查过这些文件真的在战争中/ – jitter 2009-06-22 16:06:48

+0

是的,留言簿应用程序让我打它的CSS文件就好了。 – 2009-06-22 20:09:24

回答

-2

当使用e.g的Tomcat提供静态文件的一个已指定这样的模式:

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

也许你可以尝试这样做?

11

尝试手动定义诸如

<static-files> 
    <include path="/favicon.ico" expiration="1d" /> 
    <include path="/static/**" /> 
    <include path="/**.css" />  
</static-files> 

这个工作对我来说,即使像

<servlet-mapping> 
<servlet-name>testServlet</servlet-name> 
<url-pattern>/</url-pattern> 
</servlet-mapping> 

的servlet中的AppEngine-web.xml中的静态文件
<servlet-mapping> 
<servlet-name>testServlet</servlet-name> 
<url-pattern>/*</url-pattern> 
</servlet-mapping> 

Static Files and Resource Files

2

......它似乎抓住了所有未被抓住的东西,而是其他规则之一,我不明白这是因为url模式的末尾没有*。 ...

[[不幸的是,术语“默认servlet”被重载意味着不同的事情 - 导致混淆。我会尽量清楚。]]

url-pattern“/”是特殊的(Rogue Wave称之为“默认映射”)。这定义了应用程序的“默认servlet”,当URL请求与其他模式(SRV.11.2项目符号3和SRV 11.1项目编号4)不匹配时使用。显然,处理“/”就好像你指定了“/ *”。

...这也似乎是直接矛盾的文件...

同意,我认为应用程序引擎有一个bug,因此它不会跟着你引用的文档。这是我的理论。由于您的应用程序有一个默认的servlet(通过为url模式定义一个servlet“/”),因此应用程序将停止使用容器提供的默认“default servlet”,以便未定义自己的“默认servlet ”。容器的“默认”“默认servlet”是提供静态文件的默认行为。我认为这与一些容器的行为是一致的。

我想知道如果您试图为匹配静态文件的URL模式指定一个servlet,会发生什么。它会提供文件(如文档所示)或调用servlet(如此理论所示)。

...那么,我怎么能有一个规则匹配我的域的基础(例如http://www.example.com/),并仍然允许静态文件过滤? ...

如果理论是正确的,由雅各布提供的解决方案(适用于谷歌应用程序引擎)和zockman看起来他们会工作 - 他们的映射静态文件到容器的“默认”“默认的servlet ”。

我唯一的想法是编写应用程序的“默认servlet”来检查请求,以查看请求是否为“/”。如果是这样,处理它。如果没有,然后(以某种方式)调用容器的“默认”“默认servlet”来处理请求(希望缓存该文件)。希望一旦静态文件被提供一次,缓存将在未来绕过servlet。

对不起,我不能更具体或提供代码 - 我还没有与谷歌应用程序引擎(还!)工作。


价:

1

我意识到这是一个非常古老的问题,但我遇到了同样的问题。我已将我的css/*.css,js/*.cssfavicon.ico置于/war/static/之下,并在我的appengine-web.xml中使用public_root指令指向/static。这在我的本地开发服务器上运行良好,但没有当我上传应用程序。摆脱/static并将所有事情都提升到一个水平。

SDK V1.5.2(JAVA)在Mac OSX 10.6.8使用Java SE 6(MacOS X系统默认)

相关问题