2011-07-04 92 views
1

我只在web.xml中對位置進行硬編碼,但它使我們需要在部署期間每次更改web.xml。什麼是告訴servlet文件位置的正確方法?

我們可以在項目中創建一個文件夾並告訴servlet查找文件夾及其下面的文件嗎?

<context-param> 
     <param-name>ipTable</param-name> 
     <param-value>E:\Workspace\Eclipse_Workspace\BpsPdfBill\WebContent\WEB-INF\ipTable.txt</param-value> 
</context-param> 
+1

您不能使用Java資源來代替(將文本文件放在下一個或放在類旁邊的子目錄中)。這會比WebContent文件夾中的文件更有意義... –

+0

您可以詳細說明嗎?我對java來說太新了。謝謝。 – lamwaiman1988

+0

相關:http://stackoverflow.com/questions/6097814/how-to-know-the-path-of-the-webcontainer-using-java – BalusC

回答

2

如果您不需要File對象,你可以使用ServletContext.getResource(String path)。參數path必須以'/'開頭,並且與上下文根相關。該方法返回URL,您可以打開並讀取文件的內容。

我不認爲有一個獲取指向File對象的指針的標準方法。您始終可以使用系統屬性,但這可能不會比將其放入web.xml更好。

UPDATE

如果你真的需要一個File對象,而不僅僅是文件的內容,有一對夫婦的事情可以做。這取決於文件位置如何更改。

如果基於要部署到服務器上的文件位置的變化,但它停留在每個服務器上是相同的,不只是一個系統屬性添加到您的Web容器的啓動腳本。當然,你如何做到這一點,因容器而異,但你應該能夠找到文檔中的內容。

你也可以把文件的位置在一個單獨的屬性文件,說file.properties和修改您的部署過程生成或更新此文件並把它放在你的WEB-INF目錄。然後,您可以使用ServletContext.getResourceAsStream()讀取此屬性文件,獲取路徑並實例化File

+0

我需要一個文件對象。 – lamwaiman1988

+0

爲什麼你需要一個'文件'?你需要什麼?獲得它的'InputStream'?然後只需使用'ServletContext#getResourceAsStream()'方法。 – BalusC

0

嘗試getServletContext().getResourceAsStream(filename)

0

有兩個原因,我必須能夠從我的servlet文件的操作系統路徑。如果你的目標與我的一致,這可能是答案。

  1. 服務器外的其他一些進程需要讀/寫來與我的web應用程序共享該文件,並且該文件不應該通過服務器的url訪問。
  2. 我需要動態生成一個圖表到一個臨時的位置可以通過服務器的url訪問。

爲了實現這個目標,我把文件放在戰爭目錄下的一個已知的URL下。假設URL是/data/asdf.txt。我甚至可以將其存儲爲web.xml參數。然後我用

的ServletContext.getRealPath(/data/asdf.txt)

獲得OS路徑。即使我在web.xml中對param進行了硬編碼,文件的路徑也隨着部署而移動。

要隱藏URL訪問的文件夾,我在Tomcat中以「〜」前綴的文件夾。我認爲角色是「〜」,無法回憶。你需要嘗試一下。以該字符作爲前綴,服務器不可能通過該URL提供內容。當我挖掘過去的代碼以找出前綴時,我可能會回來更新答案。

當然,隱藏文件夾的另一種方式是將其放置在WEB-INF中。

相關問題