在(Java)的应用程序引擎无法访问的静态文件(Static files in (Java) App

2019-07-29 02:33发布

该例子的文件说,你只需要简单地把在战争中/(或子目录)的文件,它们应该是从主机访问的(只要它们不是JSP或在WEB-INF)。 例如,如果你把foo.css在战争中/那么你应该能够访问它的http://本地主机:8080 / foo.css 。 然而,这不是为我工作的。 我的静态文件都不是访问。

上Docs 的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>

它似乎被抓,这不是抓住BE的其他规则,这一点我不明白,因为有在url-pattern的结束没有*一个一切。 这也似乎是直接矛盾的文件 ,上面写着:

注:静态文件,它们逐字提供给用户,如图片,CSS或JavaScript文件,分别从部署描述符中提及的路径处理。 一种用于一个路径匹配,不管在部署描述符中的servlet和过滤器映射到在战争中文件,该文件被认为是静态文件将成为该文件,URL路径请求。 您可以排除那些与使用静态文件处理文件的AppEngine-web.xml中的文件。

所以,我怎么能有我的域名(例如的基地相匹配的规则http://www.example.com/ ),并且仍然允许静态文件过滤通过?

Answer 1:

尝试手动定义中的AppEngine-web.xml中的静态文件如

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

这对我的作品,即使如servlet

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

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

见静态文件和资源文件



Answer 2:

......看来,这是敛,这不是抓住BE的其他规则,这一点我不明白,因为有在url-pattern的结束没有*一个一切。 ...

[不幸的是,术语“默认的servlet”超载意味着不同的事情 - 导致混乱。 我会尽力予以明确。]

URL模式“/”是特殊(Rogue Wave的这个所谓的“默认映射”)。 这定义了应用程序的“默认servlet”,当URL的请求不符合其它图案,其被使用(SRV.11.2子弹3和SRV 11.1项#4)。 显然,“/”是因为如果你指定“/ *”来处理。

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

答应了,我认为应用程序引擎有一个bug,因此其引用您的文档不继。 这是我这是怎么回事的理论。 由于没有为您的应用默认servlet(自定义URL模式“/”一个servlet产生的),应用程序将停止使用“默认”“默认servlet”由容器应用程序提供了没有定义自己的“默认的servlet ”。 容器的“默认”“默认servlet”是什么规定提供静态文件的默认行为。 我认为这是一些容器的行为是一致的。

我不知道如果你试图指定为匹配的静态文件的URL模式一个servlet会发生什么。 难道提供服务的文件(由文档所示)或调用Servlet(这一理论所示)。

...所以,我怎么能有我的域名(例如的基地相匹配的规则http://www.example.com/ ),并且仍然允许静态文件过滤通过? ...

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

唯一的其他想法我是写你的应用程序的“默认servlet”检查的要求,看是否请求的是“/”与否。 如果是这样,处理它。 如果没有,那么(在某种程度上)调用容器的“默认”“默认servlet”处理请求(希望这将缓存文件)。 我们希望,一旦静态文件已送达​​一次,缓存将绕过在未来的servlet(一个或多个)。

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


参考:

  • 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


Answer 3:

I realize that this is an really old question but I just ran into the same problem. I had put my css/*.css, js/*.css, and favicon.ico under /war/static/ and used the public_root directive in my appengine-web.xml to point to /static. This worked fine on my local dev server but did not when I uploaded the app. Getting rid of /static and moving everything up a level worked for me.

SDK v1.5.2 (Java) on Mac OSX 10.6.8 with Java SE 6 (MacOS X Default)



Answer 4:

当使用例如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>

也许你可以尝试这样做?



文章来源: Static files in (Java) App Engine not accessible