Облако Оракула сегодня повсюду. Это началось с того, что Ларри отрицал необходимость в облаке в течение очень (слишком) долгого времени и некоторых очень ранних объявлений и очень плохой доступности после прошлогоднего Открытого мира, который, кажется, больше не интересует. Но для меня у него все еще есть свои скрытые сокровища, и я верю, что у него есть все шансы завоевать своих клиентов. Прежде чем углубиться в пример, который покажет вам, как использовать JAX-RS с Джерси в облачной службе Oracle, я хочу немного познакомить вас с этой службой. Не стесняйтесь пропустить этот первый раздел.
Что, черт возьми, Oracle Cloud, и почему вы заботитесь?
Oracle Cloud — это маркетинговый термин. Он пытается захватить пару разных сервисов, использующих общую базу, называемую сервисами платформы. Эти два в основном являются Java и служба базы данных . Технически это не слишком ново. Мы говорим об Oracle Cloud Foundation , который уже давно существует.
Он находится внизу всего стека промежуточного программного обеспечения Oracle Fusion (по крайней мере, в доступных маркетинговых слайдах) и является базовым программным стеком, который работает на устройствах Exalogic. Наиболее важными частями для разработчиков Java являются Java EE 5 WebLogic Server и решение для балансировки нагрузки, которое называется Traffic Director. Важная часть здесь заключается в том, что вы в буквальном смысле можете получить свою личную долю реальной машины Exalogic в облаке за небольшую долю затрат, которые стоят даже самой маленькой стойке. И это работает в дата-центрах по всему миру. Полностью управляется, включая лицензии. Итак, оплатив свою ежемесячную лепту, вы покончили с административной частью. И если у вас когда-либо было сомнительное удовольствие иметь дело с лицензированием и поддерживаемыми платформами, вы немного знаете о его добавленной стоимости. Технически говоря, Java-сервис мало интересен. EE 5 устарела, и даже JRockit, основанный на Java SE 6, чувствует себя как незнакомец из прошлого со всеми новыми функциями в Java SE 7 и политикой окончания публичных обновлений для SE 6 . Но я по-прежнему считаю, что это хорошее начало, и я с нетерпением жду появления последней версии WebLogic 12c и достойной Java 7 в облаке.
Сервер WebLogic и JAX-RS
Ты помнишь древние времена? Java EE 5? Бегая с новейшей спецификацией EE 6 с тех пор, как пару лет назад вы чувствуете, что вам снова нужно водить машину, которая была у вас в качестве студента. Хотите верьте, хотите нет: JAX-R вообще не были частью EE 5. Именно по этой причине JAX-RS не работает из коробки на Oracle Java Service. Но вы, возможно, знаете, что команда Weblogic прекрасно осознает тот факт, что они запаздывают с внедрением EE, и поэтому они разворачивают функции, которые будут постепенно добавляться в базовый сервер со следующей версией спецификации до более ранних версий. То же самое произошло с JAX-RS еще в начале 2011 года. Начиная с 10.3.4, вы смогли упростить Джерси в качестве реализации JAX-RS, просто добавив библиотечную зависимость или упаковав ее в свое приложение. Это также работает для службы Java. Просто запустите новый проект Maven в вашей любимой среде IDE (может быть, это последняя версия NetBeans 7.3, которая уже давно вышла из печати) и добавьте
1
2
3
4
5
6
|
< dependency > < groupId >com.sun.jersey</ groupId > < artifactId >jersey-server</ artifactId > < version >1.9</ version > < scope >provided</ scope > </ dependency > |
Джерси как зависимость с предоставленной областью. Другой указатель — версия Java, с которой вы должны скомпилировать. Убедитесь, что SE 7 где-то не проскальзывает, и установите плагин компилятора mavven для использования исходной и целевой версии 1.6. Как это ни печально … Следующее, что нужно добавить, — ссылка на библиотеку weblogic.xml для Джерси:
1
2
3
4
5
|
< library-ref > < library-name >jax-rs</ library-name > < specification-version >1.1</ specification-version > < implementation-version >1.9</ implementation-version > </ library-ref > |
Который просто говорит контейнеру добавить это к загрузчику классов. Как правило, вам придется сначала развернуть его в своем домене. Но поверьте мне: он уже есть, и вы просто можете его использовать. Если вы используете NetBeans и начинаете с нового мастера «RESTful Web Services from Patterns», у вас может возникнуть пара дополнительных (ненужных) зависимостей, но это избавит вас от добавления конфигурации Jersey в ваш файл web.xml, который должен выглядеть как следующее:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
< servlet > < servlet-name >ServletAdaptor</ servlet-name > < servlet-class >com.sun.jersey.spi.container.servlet.ServletContainer</ servlet-class > < init-param > < description >Multiple packages, separated by semicolon(;), can be specified in param-value</ description > < param-name >com.sun.jersey.config.property.packages</ param-name > < param-value >net.eisele.primeui.cloud</ param-value > </ init-param > < init-param > < param-name >com.sun.jersey.api.json.POJOMappingFeature</ param-name > < param-value >true</ param-value > </ init-param > < load-on-startup >1</ load-on-startup > </ servlet > < servlet-mapping > < servlet-name >ServletAdaptor</ servlet-name > < url-pattern >/webresources/*</ url-pattern > </ servlet-mapping > |
И просто регистрирует сервлет REST вместе с путем сканирования пакетов для вашей аннотированной реализации. Выберите то, что вам нравится. Внимательно следуя этому примеру, вы должны знать, что позже я собираюсь жестко закодировать URL-адрес службы в JavaScript. Остерегайтесь части ‘/ webresources’.
Добавление некоторого JSON
Вы наверняка заметили ссылку на пакет et.eisele.primeui.cloud. Давайте посмотрим на класс:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
@Path ( 'countries' ) public class RestResource { //... @GET @Produces ( 'application/json' ) public String getJson( @QueryParam ( 'query' ) String query) { String[] raw = { 'Albania' , 'Algeria' , //... }; List<ValueHolder> countries = new ArrayList<ValueHolder>(); for ( int i = 0 ; i < raw.length; i++) { countries.add( new ValueHolder(raw[i])); } Gson gson = new Gson(); return gson.toJson(countries); } } |
01
02
03
04
05
06
07
08
09
10
|
public class ValueHolder { public ValueHolder() {} public ValueHolder(String label) { this .label = label; this .value = 'v_' + label; } private String label; private String value; } |
Это в основном содержит строку [] из стран. Каждая запись преобразуется в объект ValueHolder и добавляется в ArrayList, который преобразуется в JSON с помощью библиотеки Google gson. Это вторая зависимость, которую мы должны включить в pom.xml.
1
2
3
4
5
6
|
< dependency > < groupId >com.google.code.gson</ groupId > < artifactId >gson</ artifactId > < version >2.2.2</ version > < scope >compile</ scope > </ dependency > |
Убедитесь, что это включено в ваше приложение, используя область компиляции. В основном сделано сейчас. Вы заметили @QueryParam (‘запрос’). Я строю еще немного логики вокруг выбора правильных записей из String [], чтобы решить, какой ValueHolder вернуть. Для полного примера обратитесь к RestResource на github . Теперь нам нужен хороший внешний интерфейс.
Prime-UI на помощь
Все говорят о JavaScript в эти дни, и я подумал, что это может быть хорошим способом показать некоторые вещи с последним потомком Primefaces под названием Prime-UI. Эти ребята проделали большую работу, вытеснив свою уже известную и широко используемую библиотеку JSF PrimeFaces в мир jQuery, предоставив библиотеку виджетов. Получите все необходимое на веб-сайте PrimeFaces , загрузив zip-файл prime-ui. Если вы начали с веб-проекта в NetBeans и не добавили JSF, у вас получится симпатичный маленький файл jsp в папке webapp. Откройте его и внесите в него некоторые изменения и настройки. Наиболее важными из них являются объявление типа документа HTML5 и необходимый импорт JavaScript:
1
2
3
4
5
|
<%@page contentType='text/html' pageEncoding='UTF-8'%> <! DOCTYPE html> <!-- header, title, all the other stuff you need --> <!-- jQuery --> < script src = 'js/vendor/jquery.js' ></ script > |
1
2
|
<!-- jQuery UI --> < script src = 'js/vendor/jquery-ui.js' ></ script > |
1
2
|
<!-- Prime UI Core --> < script src = 'js/core/core.js' ></ script > |
1
2
|
<!-- Prime UI Input Text --> < script src = 'js/inputtext/inputtext.js' ></ script > |
1
2
|
<!-- Prime UI Autocomplete --> < script src = 'js/autocomplete/autocomplete.js' ></ script > |
Пример автозаполнения привязывает поле ввода текста к бэкэнду и предоставляет функции опережающего ввода. Предположим, у вас есть служба отдыха, запущенная выше, теперь вы просто добавляете следующий JavaScript-код в ваш головной раздел:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
< script type = 'text/javascript' > $(function() { $('#remote').puiautocomplete({ effect: 'fade', effectSpeed: 'fast', completeSource: function(request, response) { $.ajax({ type: 'GET', url: './webresources/countries', data: {query: request.query}, dataType: 'json', context: this, success: function(data) { response.call(this, data); }, error: function(jqXHR, textStatus, errorThrown) { console.log(textStatus, errorThrown); } }); } }); }); </ script > |
И добавьте тег ввода в ваш раздел тела страницы:
1
|
< input id = 'remote' name = 'remote' type = 'text' /> |
Это все, что вам нужно сделать. Одно маленькое замечание. Если вы собираетесь развернуть приложение как есть, перед вами появится экран входа в систему. Для того, чтобы открыть его для публики, вы должны добавить пустой
1
|
< login-config /> |
элемент к вашему web.xml. Теперь добавьте облако в вашу среду IDE и разверните приложение в пробном экземпляре. Если вы используете мои исходники github , это должно выглядеть так:
в зависимости от запроса он возвращает более точные результаты. Поступая так, почтальон выглядит так:
Увезти
Надеюсь, вы вообще не ожидали, что это будет ракетостроение. Это основной пост, напоминающий о том, что большинство разработчиков серверов WebLogic, возможно, уже знали. Это одно из самых больших преимуществ, но также и большой недостаток Oracle Java Cloud Service. Если вы знаете WebLogic, вам, скорее всего, он понравится. Если вы на стороне Open Source, вы можете столкнуться с проблемами, которые хорошо известны ребятам из Oracle Middleware, но не вам. EE 5 не настолько завершен, как EE 6, и EE 7 будет лишь немного лучше в закрытии специфических отличий вендора между всеми различными реализациями. Но опять же: это не что-то новое для вас, верно? А теперь иди: проведи тест-драйв и поделись своим опытом! Ждем чтения о них!
Ссылка: Prime-UI, JAX-RS с Джерси и Gson на Oracle Cloud от нашего партнера по JCG Маркуса Эйзела ( Markus Eisele) из блога « Разработка программного обеспечения для предприятий с использованием Java» .