2010-05-28 72 views
0

我對servlet非常陌生。我想提供一些靜態文件,一些CSS和一些JavaScript。這是我走到這一步:關於從Servlet中提供靜態文件的問題

在web.xml:

<servlet> 
    <description></description> 
    <display-name>StaticServlet</display-name> 
    <servlet-name>StaticServlet</servlet-name> 
    <servlet-class>StaticServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>StaticServlet</servlet-name> 
    <url-pattern>/static/*</url-pattern> 
</servlet-mapping> 

我假設在StaticServlet我有request.getPathInfo工作,看是什麼要求,得到一個MIME類型,閱讀將文件&寫入客戶端。

如果這不是一種可行的做法,或者不是一種可行的做法,請建議一種更好的方法。 我不太確定在哪裏放置static目錄,因爲如果我嘗試打印new File(".")它會給我我的Eclipse安裝目錄。 有沒有辦法找出項目的目錄?

回答

2

您不需要通過servlet提供靜態內容,servlet容器可以直接從war文件提供這個服務。

您只需要一個servlet就可以做到這一點,如果您想將原始項目作爲模板使用,那麼您需要在將程序返回到客戶端瀏覽器之前進行編程操作。

+0

在哪裏可以找到戰爭文件?我目前正在從eclipse運行該項目,並且找不到它。 – Geo 2010-05-28 16:10:19

+1

通常,如果您直接從Eclipse運行項目,則不會創建實際的.war文件,但這並不重要,您的servlet容器仍應提供WebContent目錄下的任何文件。這假定你沒有一個servlet映射覆蓋文件的路徑。如果您從web.xml中刪除所有servlet並直接在WebContent目錄中放置test.html並重新啓動服務器,則應該可以通過導航到http:// localhost:8080/{web-root}/test.html – 2010-05-28 16:24:23

+0

謝謝麥克!這就是訣竅! – Geo 2010-05-28 16:39:39

2

如果你想提供靜態文件,你可以將它們包含在WAR中。無論什麼不由Servlet處理,默認情況下都會在戰爭的根目錄中查找。

5

你確實可以讓servletcontainer的DefaultServlet來處理這個問題。

要回答你的實際問題,即使它只是爲了學習的目的,你可以使用ServletContext#getRealPath()一個相對網絡路徑轉換爲絕對的本地磁盤文件系統。

String relativeWebPath = "/static/file.ext"; 
String absoluteFilePath = getServletContext().getRealPath(relativeWebPath); 
File file = new File (absoluteFilePath); 
// ...