Статьи

Prime-UI, JAX-RS с Джерси и Гсоном в Oracle Cloud

Облако Оракула сегодня везде. Это началось с того, что Ларри отрицал необходимость в облаке в течение очень (слишком) долгого времени и некоторых очень ранних объявлений и очень плохой доступности после прошлогоднего Открытого мира, который, кажется, больше не интересует. Но для меня у него все еще есть свои скрытые сокровища, и я верю, что у него есть все шансы завоевать своих клиентов. Прежде чем углубиться в пример, который покажет вам, как использовать JAX-RS с Джерси в облачной службе Oracle, я хочу немного познакомить вас с этой службой. Не стесняйтесь пропустить этот первый раздел.

Что, черт возьми, Oracle Cloud, и почему вы заботитесь?
Oracle Cloud — это маркетинговый термин. Он пытается захватить пару разных сервисов, использующих общую базу, называемую сервисами платформы. Эти два в основном являются Javaи служба базы данных . Технически это не слишком ново. Мы говорим об Oracle Cloud Foundation, который существует некоторое время назад.

Oracle Cloud Application 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, которая уже давно вышла из печати) и добавьте

  <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 для Джерси:

 <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, который должен выглядеть как следующее:

 <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. Давайте посмотрим на класс:

@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);
    }
}

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.

<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:

<%@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>
  <!-- jQuery UI -->
  <script src="js/vendor/jquery-ui.js"></script>   <!-- Prime UI Core -->
  <script src="js/core/core.js"></script> <!-- Prime UI Input Text -->
<script src="js/inputtext/inputtext.js"></script>   <!-- Prime UI Autocomplete -->
  <script src="js/autocomplete/autocomplete.js"></script>

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

<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>

И добавьте тег ввода в ваш раздел тела страницы:

<input id="remote" name="remote" type="text"/>

Это все, что вам нужно сделать. Одно маленькое замечание. Если вы собираетесь развернуть приложение как есть, перед вами появится экран входа в систему. Для того, чтобы открыть его для публики, вы должны добавить пустой

 <login-config/>

элемент к вашему web.xml. Теперь добавьте
облако в вашу среду IDE  и разверните приложение в пробном экземпляре. Если вы используете мои
исходники github , это должно выглядеть так:

в зависимости от запроса он возвращает более точные результаты. Поступая так, почтальон выглядит так:

Убери,

я надеюсь, ты вообще не ожидал, что это будет ракетостроение. Это основной пост, напоминающий о том, что большинство разработчиков серверов WebLogic, возможно, уже знали. Это одно из самых больших преимуществ, но также и большой недостаток Oracle Java Cloud Service. Если вы знаете WebLogic, вам, скорее всего, он понравится. Если вы на стороне Open Source, вы можете столкнуться с проблемами, которые хорошо известны ребятам из Oracle Middleware, но не вам. EE 5 не настолько завершен, как EE 6, и EE 7 будет лишь немного лучше в закрытии специфических отличий вендора между всеми различными реализациями. Но опять же: это не что-то новое для вас, верно? А теперь иди: проведи тест-драйв и поделись своим опытом! Ждем чтения о них!