2013-06-04 23 views
2

我想訪問靜態文件,這是一個已知的目錄中我的web應用程序之外。我已經閱讀了許多關於www的選項,但我仍然對此有疑問。即成圖像外的Web應用程序

基本上,我要聲明我的應用程序服務器的defaultservlet的上下文。在我的情況下,我嘗試使用Tapestry教程,這是一個基於Maven的項目並導入到eclipse中。

當時的想法是創建一個HttpServlet的,它會從該位置的文件。是否有人知道我可以在哪裏獲得這樣一個servlet的例子,以及我如何給他打電話?我知道servlet必須可能被聲明爲服務,因爲應用程序的所有頁面都需要訪問這些文件,但我也可能會誤認爲它足夠導入它,比如說,在佈局頁面中(所有頁面都使用layout.tml文件)。我基本上沒有任何線索如何用servlet來完成它。有人能給我看光嗎?

坦克非常感謝。

+0

請編輯你的問題的話,將有隻有一個具體的問題在一個崗位 –

回答

2

這樣做的掛毯方式是通過貢獻的AssetRequestHandlerAssetFactory

AppModule.java

public static void contributeAssetDispatcher(
     MappedConfiguration<String, AssetRequestHandler> config, 
     ResourceStreamer streamer) 
{ 
    config.add("staticfile", new StaticFileAssetRequestHandler(streamer)); 
} 

public void contributeAssetSource(
     MappedConfiguration<String, AssetFactory> config) 
{ 
    config.add("staticfile", new StaticFileAssetFactory()); 
} 

然後在你的TML可以使用

<img src="${asset:staticfile:path/to/myFile.jpg}" /> 

看看的ContextAssetRequestHandler,ClasspathAssetRequestHandler,ContextAssetFactory和ClasspathAssetFactory尋找靈感。

要小心,不要打開一個安全漏洞,黑客可以通過傳遞與../../

+0

謝謝。你做了我的一天:) – user970183

3

另一種簡單的解決方法是創建一個頁面返回響應流中前綴的文件路徑訪問服務器上的任意文件

public class StaticFile { 
    StreamResponse onActivate(String fileName) { 
     return new StaticFileStreamResponse(fileName); 
    } 
} 

然後,在另一組件/頁

@Inject ComponentResources resources; 

public Link getStaticFileLink() { 
    return resources.createPageRenderLinkWithContext("StaticFile", "path/to/myFile.jpg"); 
} 

TML

<img src="${StaticFileLink}" /> 

但是,您不會像我的其他解決方案那樣利用掛毯的304 NOT_MODIFIED響應。

+0

關於這個響應的快速問題 - 我想這意味着在調用createPageRenderLInkWithContext時,如果文件的路徑可以改變,那麼文件不需要是靜態的?我正在尋找一種向用戶提供本地文件的方式,但只有在運行之後才能知道。 – ThePerson

+1

你問是否「path/to/myFile.jpg」可能是一個運行時間值?當然,它可以,它只是一個字符串:) –

+0

是的,我實際上實現了這一點(儘管有一些變化),它工作得很好,謝謝uklance - 我會upvote。 – ThePerson

相關問題