JSF этого не делает.Это сервер, который делает это.Эта проблема указывает на то, что вы вручную храните (загруженные?) Изображения в расширенной папке WAR, а не где-то за ее пределами.«Очистить и перестроить» просто очищает рабочую папку сервера и старые расширенные WAR-файлы и перестраивает веб-приложение на основе оригинального WAR-файла (по сути, при разработке структуры проекта).Это происходит, кстати, не только в процессе разработки, но и в производстве, когда вы повторно развертываете новый WAR-файл.
Это поведение по спецификации.Вам просто не следует вручную помещать файлы в расширенную папку WAR и ожидать, что они волшебным образом будут включены в исходный файл WAR или сохранятся при повторном развертывании.
Храните их в фиксированном и постоянном месте за пределами WAR.Если вы добавляете внешний путь в качестве нового контекста на сервер, то вы можете просто ссылаться на них <img>
или <h:graphicImage value>
обычным способом.См. Также Загрузка изображений из-за пределов папки webapps / webcontext / deploy, используяили 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
, чтобы получить идею.