Стоит ли размещать ресурсы JS, CSS и изображений в JAR для приложения JSF?

Я хотел бы задать вам вопрос, связанный с еще один вопрос, который я задавал несколько раз назад (к сожалению, без ответа :( )

Представьте, что ваш проект разделен на несколько веб-приложений. У вас также есть много общих ресурсов (JS, CSS, изображения). Идея состоит в том, чтобы избежать дублирования в каждом веб-приложении, так как вам придется синхронизировать свои изменения между всеми веб-приложениями.

Так что лучше иметь эти ресурсы в одном месте.

Если я взгляну на проект Richfaces, все их ресурсы управляются JSF. Например, компонент <rich:calendar> отображает небольшой значок. Если мы посмотрим на HTML-код этого изображения, то увидим, что атрибут src относится к ссылке jsf, а не напрямую к .png:

<img src="/richfaces-demo/a4j/g/3_3_3.Finalorg.richfaces.renderkit.html.iconimages.CalendarIcon/DATB/eAH7cW0fw6znAA8XBA4_.jsf"
    style="vertical-align: middle" id="j_id354:j_id355PopupButton" class="rich-calendar-button " alt="">

Я вижу следующие преимущества такого подхода:

  • Включите ресурсы в классическую библиотеку (т. е. в JAR), что упрощает развертывание в Eclipse;
  • Разрешить создание динамического файла (т. е. CSS или JS, который содержит только необходимые свойства);
  • Разрешить включение только необходимых ресурсов (например, мы не будем загружать файл CSS, если он не требуется компонентом на странице).

Что касается моего приложения, мне понадобится только первый пункт, но он действительно важен для меня (см. Мой другой связанный вопрос о SO).

Основным недостатком этого решения является то, что браузер не сможет кэшировать ресурсы, поскольку они рассматриваются как запросы JSF. Кроме того, каждый из этих запросов должен будет пройти через весь жизненный цикл JSF, что может быть проблемой производительности, если важно количество ресурсов на текущей странице...

Вопросы

Спасибо.


person Romain Linsolas    schedule 11.05.2011    source источник


Ответы (1)


Да, это определенно хорошая идея поместить общие ресурсы в отдельный проект, который должен быть включен как JAR в основные веб-приложения. Однако для этого мы используем простой @WebServlet, который обслуживает статические ресурсы прямо из пути к классам, а также поддерживает кэш и gzip. Мы не делегируем эту работу JSF, мы просто используем управление ресурсами JSF, которое, в свою очередь, полностью прозрачно вызывает сервлет по URL-адресу.


Разрешить создание динамического файла (т. е. файла CSS или JS, содержащего только необходимые свойства)

Это также можно сделать, используя определенный URL-адрес, а затем передавая имена файлов отдельных ресурсов в качестве строки запроса. Затем сервлет статических ресурсов выполнит неприятную работу по считыванию нескольких ресурсов в один ответ.


Разрешить включение только необходимых ресурсов (например, мы не будем загружать файл CSS, если он не требуется компоненту на странице).

Это можно сделать с помощью аннотации @ResourceDependency. Например.

@ResourceDependency(library="css", name="specific.css")
public class CustomComponentWithCSS extends UIComponentBase {
    // ...
}

Мы используем модифицированную версию этого FileServlet, которая изменена чтобы получить ресурс из пути к классам, а не из файловой системы локального диска. Кроме того, удалена поддержка диапазона (поскольку RandomAccessFile не может напрямую работать с ресурсами пути к классам). Кроме того, мы добавили проверку, является ли текущий этап разработкой или нет, и если нет, то вместо этого обслуживайте уменьшенную версию CSS/JS, которая помещается в другой путь.

person BalusC    schedule 11.05.2011
comment
Это кажется неплохой идеей. К сожалению, мы все еще используем JSF 1.2, поэтому ни @WebServlet, ни @ResourceDependency использовать нельзя :( - person Romain Linsolas; 11.05.2011
comment
Что ж, тогда вам придется загромождать web.xml вашего веб-приложения записью <servlet>. Сам сервлет можно просто хранить в JAR. - person BalusC; 11.05.2011
comment
Я не уверен, что понял вашу точку зрения относительно этой модификации файла web.xml... - person Romain Linsolas; 11.05.2011
comment
Вы можете просто сохранить сервлет статического ресурса в файле JAR. Вы можете просто использовать сопоставление <servlet> в web.xml веб-приложения, чтобы сослаться на этот сервлет статического ресурса, точно так же, как вы делаете для JSF FacesServlet. - person BalusC; 11.05.2011