JSF不這樣做。這是服務器這樣做。此問題表明您正在手動將(上傳的?)圖像存儲在展開的WAR文件夾中,而不是其中的某處。 「清理和重建」只是清理服務器的工作文件夾和舊的擴展WAR,並根據原始WAR(實質上是在開發時,項目結構)重新構建Web應用程序。這種方式不僅在開發過程中發生,而且在重新部署新的WAR文件時也會在生產中發生。
此行爲是由規範。您應該不要手動將文件放入展開的WAR文件夾中,並期望它們奇蹟般地包含在原始WAR文件中,或保留在重新部署中。
將它們存儲在WAR以外的固定和永久位置。如果將外部路徑作爲新的上下文添加到服務器,則可以通過<img>
或<h:graphicImage value>
通常的方式引用它們。 另請參閱Load images from outside of webapps/webcontext/deploy folder using <h:graphicImage> or <img> tag。
如果你真的需要讓他們由JSF資源處理程序來解決,這樣就可以像<h:graphicImage library="uploads" name="foo.png>
的東西使用它們,那麼你需要實現自定義ResourceHandler
。它看起來像這樣:
public class UploadedResourceHandler extends ResourceHandlerWrapper {
private ResourceHandler wrapped;
public MyResourceHandler(ResourceHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public ResourceHandler getWrapped() {
return this.wrapped;
}
@Override
public Resource createResource(String resourceName, String libraryName) {
if ("uploads".equals(libraryName)) {
return new YourCustomUploadedResourceImpl(resourceName);
} else {
return super.createResource(resourceName, libraryName);
}
}
}
得到它的運行,如faces-config.xml
如下注冊它:
<application>
<resource-handler>com.example.UploadedResourceHandler</resource-handler>
</application>
但是,這是不完全瑣碎總結過頭頂在一個單一的答案。您還需要了解HTTP(緩存)如何工作。剛剛閱讀javadocs,從ResourceHandler
開始,並瀏覽Mojarra自己的ResourceHandlerImpl
和ResourceImpl
源代碼以獲得此主意。
我的我! BalusC,你是一個傳奇!真的,你是如何得到這麼好的? – Emmanuel 2012-08-29 12:14:41
多年經驗:) – BalusC 2012-08-29 12:46:28
或許。但是,請原諒我,我不得不堅持還有更多。你只有'34'(你的個人資料說),所以隨着對這些技術的深入瞭解 - 一些暗示你閱讀技術規範,而我們大多數人使用教科書 - 很明顯,有超過「年」它。 61,099個人資料視圖說我不是唯一一個這麼認爲的人。你是我希望在工作崗位上工作的那種人。我會'吸'所有我可以離開你:-)希望我知道這個祕密。真的很希望。也許你應該寫一些東西來幫助像我這樣的人試圖得到壞蛋。 – Emmanuel 2012-08-29 16:21:49