Мои изображения в папке ресурсов моего приложения JSF удаляются, когда я "Очистить и построить" - PullRequest
1 голос
/ 27 декабря 2011

Я действительно не знаю, является ли это проблемой Netbeans, но вот проблема: в моем веб-приложении jsf, в корневом каталоге, у меня есть папка с именем resources, которая содержит подпапки images, css и js (для javascript),Подпапки содержат соответствующий контент.Вот как я ссылаюсь на скрипт (например) из приложения:

   <h:outputScript library="js" target="head" name="dialog.js"/>

Проблема в том, что когда я чищу и собираю файлы, а файлы в каталогах css и js остаются без изменений, все изображенияв каталоге изображений удаляются.Как тогда я могу использовать механизм ресурсов jsf, если он будет стирать мои изображения при каждом "чистке и сборке"?

1 Ответ

1 голос
/ 27 декабря 2011

JSF этого не делает.Это сервер, который делает это.Эта проблема указывает на то, что вы вручную храните (загруженные?) Изображения в расширенной папке WAR, а не где-то за ее пределами.«Очистить и перестроить» просто очищает рабочую папку сервера и старые расширенные WAR-файлы и перестраивает веб-приложение на основе оригинального WAR-файла (по сути, при разработке структуры проекта).Это происходит, кстати, не только в процессе разработки, но и в производстве, когда вы повторно развертываете новый WAR-файл.

Это поведение по спецификации.Вам просто не следует вручную помещать файлы в расширенную папку WAR и ожидать, что они волшебным образом будут включены в исходный файл WAR или сохранятся при повторном развертывании.

Храните их в фиксированном и постоянном месте за пределами WAR.Если вы добавляете внешний путь в качестве нового контекста на сервер, то вы можете просто ссылаться на них <img> или <h:graphicImage value> обычным способом.См. Также Загрузка изображений из-за пределов папки webapps / webcontext / deploy, используяили imagetag .

Если вам действительно нужно, чтобы они были разрешены обработчиком ресурсов 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, чтобы получить идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...