2009-06-22 49 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系統默認)

相關問題