Модульные веб-приложения

Недавно я изучал OSGi и считаю, что это действительно хорошая идея для модульных приложений Java. .

Однако мне было интересно, как OSGi будет работать в веб-приложении, если у вас не только код, о котором нужно беспокоиться, но и HTML, изображения, CSS и тому подобное.

На работе мы создаем приложение, которое имеет несколько «вкладок», каждая из которых является частью приложения. Я думаю, что использование подхода OSGi может действительно принести пользу, однако я действительно не уверен, как лучше всего обрабатывать все обычные ресурсы веб-приложений.

Я не уверен, имеет ли это какое-то значение, но мы используем JSF и IceFaces (который добавляет еще один уровень проблемы, потому что у вас есть правила навигации, и вы должны указать все файлы конфигурации лиц в своем web.xml ... doh!)

Изменить: согласно этот поток, файлы faces-config.xml могут быть загружены из файлов JAR - так что на самом деле можно включить несколько файлов faces-config.xml без изменения web.xml, при условии, что вы разбиты на файлы JAR.

Любые предложения будут ценны :-)


person Community    schedule 24.09.2008    source источник
comment
Фил, stackoverflow.com/questions/1834058/ Я также пытаюсь понять, можно ли совместно использовать веб-ресурсы с помощью OSGi среди приложений Struts 2. Есть идеи по этому поводу?   -  person peakit    schedule 02.12.2009


Ответы (8)


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

Мы не используем JSF (здесь Spring MVC), поэтому я не могу комментировать дополнительную сложность этой структуры в контексте OSGi.

Большинство фреймворков или подходов по-прежнему придерживаются «старого» образа мышления: один файл WAR, представляющий ваше веб-приложение, а затем множество пакетов и сервисов OSGi, но почти никто не занимается модуляризацией самого графического интерфейса.

Предпосылки для дизайна

При использовании OSGi первый вопрос, который необходимо решить: каков ваш сценарий развертывания и кто является основным контейнером? Я имею в виду, что вы можете развернуть свое приложение в среде выполнения OSGi и использовать ее инфраструктуру для всего. В качестве альтернативы вы можете встроить среду выполнения OSGi в традиционный сервер приложений, и тогда вам нужно будет повторно использовать некоторую инфраструктуру, в частности, вы хотите использовать механизм сервлетов AppServer.

В настоящее время наша конструкция основана на OSGi в качестве контейнера, и мы используем HTTPService, предлагаемый OSGi, в качестве контейнера сервлетов. Мы планируем создать своего рода прозрачный мост между внешним контейнером сервлетов и OSGi HTTPService, но эта работа продолжается.

Архитектурный эскиз модульного веб-приложения Spring MVC + OSGi

Таким образом, цель состоит не только в обслуживании веб-приложения через OSGi, но и в применении компонентной модели OSGi к самому веб-интерфейсу, чтобы сделать его компонуемым, повторно используемым, динамическим.

Это компоненты в системе:

  • 1 центральный пакет, который заботится о соединении Spring MVC с OSGi, в частности, он использует код Бернда Колба, чтобы вы могли зарегистрировать Spring DispatcherServlet в OSGi в качестве сервлета.
  • 1 настраиваемый сопоставитель URL-адресов, который вводится в DispatcherServlet и обеспечивает сопоставление входящих HTTP-запросов с правильным контроллером.
  • 1 центральный JSP-декоратор на основе Sitemesh, который определяет глобальный макет сайта, а также центральные библиотеки CSS и Javascript, которые мы хотим предложить по умолчанию.
  • Каждый пакет, который хочет добавить страницы в наш веб-интерфейс, должен опубликовать 1 или несколько контроллеров в качестве служб OSGi и обязательно зарегистрировать свой собственный сервлет и свои собственные ресурсы (CSS, JSP, изображения и т. Д.) с помощью OSGi HTTPService. Регистрация выполняется с помощью HTTPService, и основные методы:

    httpService.registerResources () и httpService.registerServlet ()

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

Затем, когда поступает HTTP-запрос для определенного URL-адреса, он находит связанный контроллер и отправляет запрос туда.

Контроллер выполняет свою работу, а затем возвращает любые данные, которые должны быть отображены и имя представления (в нашем случае это JSP). Этот JSP находится в пакете контроллера, и его можно получить и отобразить из центрального пакета веб-интерфейса именно потому, что мы зашли и зарегистрировали расположение ресурса с помощью HTTPService. Затем наш центральный преобразователь представлений объединяет этот JSP с нашим центральным декоратором Sitemesh и выдает полученный HTML клиенту.

Знаю, что это довольно высокий уровень, но без предоставления полной реализации его трудно полностью объяснить.

Нашим ключевым моментом в этом было изучение того, что Бернд Кольб сделал со своим пример преобразования JPetstore в OSGi и использования этой информации для разработки нашей собственной архитектуры.

ИМХО, в настоящее время слишком много шумихи и сосредоточения на том, чтобы OSGi каким-то образом встраивалась в традиционные приложения на основе Java EE, и очень мало внимания уделяется фактическому использованию идиом OSGi и ее превосходной компонентной модели, чтобы действительно позволить проектировать компонентные веб-приложения.

person Boris Terzic    schedule 24.09.2008
comment
Звучит интересно. Было бы неплохо, если бы вы могли предоставить дополнительную информацию. - person trunkc; 24.09.2008

Попробуйте SpringSource dm Server - сервер приложений, полностью построенный на OSGi и поддерживающий модульные веб-приложения. Он доступен в бесплатной, открытой и коммерческой версиях.

Вы можете начать с развертывания стандартного файла WAR, а затем постепенно разбить приложение на модули OSGi или «пакеты», говоря языком OSGi. Как и следовало ожидать от SpringSource, сервер имеет отличную поддержку инфраструктуры Spring и связанных продуктов портфолио Spring.

Отказ от ответственности: я работаю над этим продуктом.

person Glyn Normington    schedule 19.01.2009

Помните о лицензировании сервера Spring DM.

person MikeNereson    schedule 18.05.2009

Мы успешно использовали Restlet с OSGi со встроенной службой Http (на самом деле это Jetty , но кот тоже доступен).

Restlet не требует минимальной конфигурации XML, и любая конфигурация, которую мы делаем, находится в BundleActivator (регистрация новых сервисов).

При создании страницы мы просто обрабатываем соответствующие реализации службы для генерации вывода в стиле декоратора. Новые подключаемые пакеты добавят новые украшения / виджеты страницы при следующей визуализации.

REST дает нам красивые чистые и содержательные URL-адреса, несколько представлений одних и тех же данных и кажется расширяемой метафорой (несколько глаголов, много существительных).

Бонусной функцией для нас была обширная поддержка кеширования, в частности ETag.

person jamesh    schedule 24.09.2008

SpringSource, похоже, работает над интересной модульной веб-структурой, построенной на основе OSGi, под названием SpringSource Slices. Более подробную информацию можно найти в следующих сообщениях блога:

person Pavol Juhos    schedule 05.12.2009

Взгляните на РЭП! http://www.eclipse.org/rap/

person Community    schedule 11.11.2008

Взгляните на http://www.ztemplates.org, который прост и легок в освоении. Это позволяет вам поместить все связанные шаблоны, javascript и css в одну банку и использовать ее прозрачно. Это означает, что вам даже не нужно заботиться об объявлении необходимого javascript на своей странице при использовании предоставленного компонента, поскольку фреймворк делает это за вас.

person Community    schedule 12.01.2009

Интересный набор постов. У меня есть веб-приложение, которое настраивается для каждого клиента. Каждый клиент получает основной набор компонентов и дополнительные компоненты в зависимости от того, на что он подписался. Для каждого выпуска мы должны «собрать» правильный набор сервисов и применить правильную конфигурацию меню (мы используем struts menu) в зависимости от клиента, что, мягко говоря, утомительно. По сути, это та же база кода, но мы просто настраиваем навигацию, чтобы отображать или скрывать определенные страницы. Это явно не идеально, и мы хотели бы использовать OSGi для разбивки сервисов на компоненты. Хотя я могу видеть, как это делается для сервисных API, и вроде как понимаю, как можно объединить такие ресурсы, как CSS, java-скрипт и контроллеры (мы используем Spring MVC), как бы вы справились с «сквозными» проблемами, такими как навигация по страницам и общий рабочий процесс, особенно в сценарии, когда вы хотите динамически развернуть новую службу и вам нужно добавить навигацию к этой службе. Могут быть и другие «сквозные» проблемы, например, услуги, которые охватывают другие услуги. Спасибо, Деклан.

person Community    schedule 05.02.2009