Показаны сообщения с ярлыком Web programming. Показать все сообщения
Показаны сообщения с ярлыком Web programming. Показать все сообщения

понедельник, 25 января 2016 г.

Spring Framework: влияние сканирования зависимостей на время запуска веб-приложения

В комментариях к заметке Пишем простой RESTful веб-сервис на Spring Web MVC прозвучал довольно интересный вопрос, суть которого сводится к следующему: как сервер приложений находит все классы, реализующие интерфейс javax.servlet.ServletContainerInitializer, и сколько времени это занимает. Попробуем разобраться.


Какие компоненты ищет сервер приложений при запуске


Часть 8 спецификации Servlet 3.0 вводит понятие "подключаемой возможности" ("plugability features"), что существенно упрощает структуру веб-приложения, а так же подключение дополнительных фреймворков. Однако, данные возможности требуют времени на сканирование JAR-архивов и файлов с классами приложения. Спецификация требует, чтобы данное сканирование производилось по-умолчанию, однако его можно частично или полностью избежать в зависимости от используемого сервера приложений.

Сканирования зависимостей и классов приложения требуют следующие возможности:

  • Впервые предложенные в спецификации Servlet 3.0:

    • SCI (javax.servlet.ServletContainerInitializer);

    • Веб-фрагменты (META-INF/web-fragment.xml);

    • Ресурсы веб-приложения, собранные в JAR-файлах (META-INF/resources/*);

    • Аннотации, определяющие компоненты веб-приложения (@WebServlet и т.д.);

    • Аннотации, определяющие компоненты для сторонних библиотек, инициализируемые с помощью SCI (аннотации, которые определены в аннотации @HandlesTypes на SCI-классе. Класс конфигурации контекста приложения Spring Framework из примера - ApplicationInitializer - является таким компонентом.

  • Старые возможности, впервые предложенные в ранних версиях спецификации:

    • Tag Library Descriptor (TLD), определяет библиотеки тегов. Сервер приложений ищет файлы META-INF/**/*.tld.

Servlet Container Initializer (CSI)


В принципе, на Stack Overflow дан довольно подробный и развернутый ответ на вопрос о том, как сервер приложений ищет классы инициализации контекста. В каталоге META-INF/services архива с библиотекой должен находиться файл javax.servlet.ServletContainerInitializer, содержащий перечисление полных имен классов, реализующих интерфейс javax.servlet.ServletContainerInitializer (по одному имени на строке). Например:

psamolysov.demo.spring.restws.ServletContextInitializer1
psamolysov.demo.spring.restws.ServletContextInitializer2

Аналогичным образом можно зарегистрировать слушатели, находящиеся непосредственно в коде самого веб-приложения, при этом файл javax.servlet.ServletContainerInitializer должен находиться в каталоге WEB-INF/classes/META-INF/services.

среда, 13 января 2016 г.

Пишем простой RESTful веб-сервис на Spring Web MVC

Суровый разместил на GitHub'е новый репозиторий, в котором будет собирать примеры использования Spring Framework 4.x. И сегодня я поделюсь с уважаемыми читателями блога примером простого RESTful веб-сервиса, реализованного на базе фреймворка Spring Web MVC и не содержащего ни строчки XML за исключением pom.xml.


Архитектура сервиса


Задачей примера было продемонстрировать реализацию классической многослойной архитектуры, к которой тяготеет большинство приложений, построенных на основе Spring Framework. Точкой входа является контроллер MessageController, в который инжектируются "сервисы" MessageService и ZShopService:

понедельник, 12 декабря 2011 г.

Установка и использование WebLogic Server 12c в версии для разработчиков


На прошлой неделе Oracle сделала доступным для скачивания набор дистрибутивов сервера приложений нового поколения, основы линейки продуктов Oracle Fusion Middleware, - WebLogic Server 12c. Данный продукт доступен как в виде инсталляторов под Windows, Linux и Mac OS X, так и в виде двух ZIP-архивов, предназначенных исключительно для разработчиков. В данной заметке мы рассмотрим как установить WebLogic Server из данных архивов и создать демонстрационный домен, а так же написать и развернуть в данном домене небольшое Java EE 6 приложение, используя Oracle Enterprise Pack for Eclipse 12.1.1.

пятница, 27 августа 2010 г.

Сервлеты и OSGi: разворачиваем бандлы на GlassFish v3


В ноябре 2008-го года тогда еще живая SUN Microsystems выпустила новую экспериментальную версию сервера приложений с открытым исходным кодом - GlassFish v3 Prelude. С тех пор вышло несколько стабильных версий данного сервера, последней из которых на сегодняшний день является 3.0.1. Отличительными чертами GlassFish v3 являются модульность и расширяемость, обеспечиваемые использованием технологии OSGi (в реализации Apache Felix). Соответственно, с одной стороны GlassFish v3 предоставляет сервлет-контейнер (как часть спецификации JavaEE 6.0), а с другой - OSGi-фреймворк (Apache Felix или Eclipse Equinox), что позволяет добавлять свои бандлы, в которых можно регистрировать сервлеты.

Подробно вопрос регистрации сервлетов с помощью сервиса HttpService рассматривался в предыдущих статьях серии, поэтому сейчас мы сконцентрируемся только на вопросах развертывания бандлов, содержащих сервлеты, на GlassFish v3.

четверг, 26 августа 2010 г.

Запускаем GlassFish v3 на OSGi-фреймворке Equinox


Введение


Одним из преимуществ сервера приложений GlassFish v3 является модульность, которая обеспечивается за счет использования технологии OSGi. По-умолчанию, в качестве OSGi-фреймворка для GlassFish используется Apache Felix, однако имеется возможность запускать данный сервер приложений и поверх другого популярного OSGi-фреймворка с открытым исходным кодом - Eclipse Equinox. Напомню, что на базе Eclipse Equinox построена широкоиспользуемая Java-разработчиками IDE Eclipse, да и вообще вся платформа Eclipse RCP/RAP.

Внимание! Из-за различий в лицензиях GlassFish и Eclipse Equinox сам фреймворк Equinox не поставляется вместе с сервером приложений. Нужно или скачать последнюю версию данного фреймворка или скопировать Jar-файл org.eclipse.osgi_3.x.x.vxxx.jar из имеющейся у вас поставки Eclipse в каталог $GlassFish_HOME/osgi/equinox.

Существует два способа заставить GlassFish запускаться на Equinox: использование переменной окружения GlassFish_Platform и использование опции JVM -DGlassFish_Platform. Рассмотрим эти способы подробнее.

среда, 18 августа 2010 г.

Настраиваем взаимодействие Eclipse - GlassFish v3


Сервер приложений GlassFish является Reference Implementation спецификации JavaEE 6 (так же известной под названием JSR-316), поэтому знакомство с ним будет полезно любому разработчику, планирующему использовать как весь стек JavaEE, так и некоторые его компоненты.

Интегрированная среда разработки Eclipse позволяет упростить взаимодействие с сервером приложений, в частности - автоматизировать создание специфичной для него структуры проекта, облегчить запуск/останов сервера и разворачивание на нем разрабатываемого приложения. Так же очень полезной функцией IDE является обеспечение горячего разворачивания приложения - возможности заменять классы и статический контент "на лету", т.е. непосредственно после компиляции, не прибегая каждый раз к сборке архивов модулей (war, ear, rar, jar) и переустановке приложения целиком. Данная возможность существенно ускоряет разработку и отладку приложения.

суббота, 15 мая 2010 г.

Сервлеты и OSGi: Equinox в сервлет-контейнере. Equinox Servletbridge


Наконец-то пришло время рассмотреть, как выполняется развертывание приложения, основанного на OSGi, в обычном, а не приспособленном специально для Equinox, сервлет-контейнере (или сервере приложений, в дальнейшем будем употреблять только термин "сервлет-контейнер"), таком как Tomcat, GlassFish, IBM WebSphere и т.д.

вторник, 27 апреля 2010 г.

Сервлеты и OSGi: будь проще и люди к тебе потянутся


Данную заметку можно рассматривать как продолжение предыдущей - О любви и дружбе между сервлетами и OSGi. Рассмотрим еще один способ регистрации сервлета в OSGi-контейнере - использование декларативных сервисов.

Использование декларативных сервисов обеспечивает следующее преимущество по сравнению с использованием точек расширения и сервис-трекера: OSGi контейнер в этом случае сам управляет жизненным циклом бандла. Имеется ввиду следующее: в декларативном сервисе определяются методы регистрации зависимостей и старта/останова сервиса. Пока все зависимости не будут удовлетворены - сервис не будет запущен. Таким образом гарантируется, что в момент запуска декларативного сервиса регистрации сервлета, сервис HttpService будет доступен. Данное обстоятельство позволяет существенно упростить код регистрации сервлета, сделать его короче и понятнее. К тому же, в случае использования декларативных сервисов, нам не нужен активатор бандла.

понедельник, 12 апреля 2010 г.

Сервлеты и OSGi: о любви и дружбе между сервлетами и OSGi


Как известно, одной из основных областей применения языка и платформы Java является разработка веб-приложений, по крайней мере в России, если ищут программиста на данном языке, то в описании вакансии как правило указывают J2EE, Servlets, JSP, JSF и прочие умные слова. В сферу моих интересов входит разработка модульных приложений с использованием технологии OSGi и у меня есть хорошая новость: сервлеты тоже могут быть модульными и могут интегрироваться с данной технологией.

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

вторник, 16 декабря 2008 г.

Создаем веб-приложение на базе Tapestry в Eclipse WTP


Здравствуйте, уважаемые читатели. Суровый челябинский программист все еще жив, он по прежнему очень суровый и временами даже челябинский.

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

Вообще есть плагин под эклипс для работы с Tapestry, но плагин очень старый, для 3й версии фреймворка. Соответственно, никаких преимуществ в его использовании я не вижу, поэтому работать будем без специальных tapestry-плагинов.

Начнем с того, что определимся с инструментарием. Итак, будем иметь:

  • Eclipse 3.4 (впрочем не принципиально, 3.2 и 3.3 тоже подойдут) с установленным WTP

  • Tapestry 5.0.15

  • Tomcat 6 (хотя работать будет и на 5-й версии)



Для тестового приложения я создаю отдельный воркспэйс. Также устанавливаю томкат, просто распаковывая zip-архив в отдельную папку (это под Windows). Папка с томкатом находится, естественно, вне воркспэйса.

суббота, 12 июля 2008 г.

Совместное использование Tapestry и Spring


Давно задумывал написать что-то полезное для блоггеров и вконце-концов родилась идея конечно же социальной сети. Да, да, можете ругать за очередной велосипед, но как говорится у своего велосипеда колеса круглее. Собственно вопрос на чем реализовывать особо не стоял, т.к. решено было реализовывать на Java, заодно и получить опыт проектирования с нуля пусть не очень сложного, но все же J2EE приложения. Единственная проблема, которую я сейчас вижу это проблема последующего развертывания - нужно будет выбрать java-хостинг (скорее всего буржуйский) и как-то залить туда приложение. Впрочем проблему деплоя на виртуальный хостинг я еще опишу.

Впрочем выбор Java в качестве платформы для реализации приложения ставит перед нами еще одну проблему выбора - проблему выбора библиотек и фреймворков. Так как я имею опыт работы с Tapestry (не сильно большой, но все же) и этот опыт положительный, для реализации веб-части я выбрал именно данный фреймворк. Tapestry основан на IoC-контейнере Hivemind, но я отказался от его использования в пользу более мощного Spring. Почему Spring, а не например Guice? Потому что Spring позволяет не изобретать велосипед - определение источников данных, подключение Hibernate, AOP, управление транзакциями - это все есть в Spring (точно так же как и возможность определения Generic DAO, интерцепторов и многих других вкусностей). Собственно разобраться со Spring это тоже одна из целей моего проекта.

Так же не маловажную роль сыграл тот факт, что Spring поддерживается Tapestry "из коробки". А вот о том, как подключить Spring к Tapestry и инъектить эти бины на страницы и в компоненты, мы и поговорим.

пятница, 9 мая 2008 г.

Развивая тему Guice: прикручиваем Velocity с помощью Guice.


Данный пост написан не с целью развития холивара на тему, что лучше Velocity или JSP, но здесь я хочу продемонстрировать как можно подключать такой удобный шаблонный движок, как Velocity к приложению, построенному на базе Guice.

О том, что такое Velocity и многих аспектах его использования можно почитать на форуме программистов и конечно же официальной странице проекта.

пятница, 2 мая 2008 г.

Строим сервлеты на базе Guice


Компания google - основной разработчик IoC контейнера GUICE позиционирует его как легковесное решение для построения Java-приложений различных типов, в том числе и веб-приложений. Для этого существует пакет com.google.inject.servlet, о котором мы сегодня и поговорим.

Прежде всего хочу отметить тот факт, что снапшот guice-servlet в SVN и пакет, включенный в guice 1.0 отличаются - версия в SVN имеет более расширенный функционал. В частности - базовый сервлет, обеспечивающий инъекцию зависимостей и контекст-листенер, обеспечивающий подключение Guice.Injector. Поэтому для примеров в данном посте я использовал версию из SVN.