Статьи

Пример Backbone.js, JAX-RS, JPA-приложение

Backbone.js  предоставляет структуру веб-приложениям, предоставляя модели с привязкой значения ключа и настраиваемыми событиями, коллекции с богатым API перечислимых функций, представления с декларативной обработкой событий и соединяет все это с существующим API через интерфейс RESTful JSON. JAX-RS  предоставляет стандартизированный API для создания веб-сервисов RESTful в Java. В этом примере показано, как создать простое приложение для каталога домашних животных с использованием Backbone.js и JAX-RS.

Клиентская архитектура Backbone.js

Модели содержат данные и определяют методы, связанные с данными. Вы расширяете  Backbone.Model  с помощью методов, специфичных для вашего домена, а  Model  предоставляет базовый набор функций для управления изменениями.

Вот исходный код для Item.js:

var ItemModel = Backbone.Model.extend({
  urlRoot: "resources/items",

  defaults: {
  id: null,
  name: "",
  description:"",
  }

});

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

Вот исходный код для Items Collection Items.js:

var ItemList = Backbone.Collection.extend({
  model: ItemModel,
  url: "resources/items",
 }
});

var Items = new ItemList();

Свойство  модели  определяет класс модели, который содержит коллекция.

Свойство  url  (или функция) в коллекции ссылается на ее расположение на сервере.

Backbone.sync — это функция, которую Backbone вызывает каждый раз, когда пытается прочитать или сохранить модель на сервере. По умолчанию он использует (jQuery / Zepto) .ajax для выполнения запроса RESTful JSON.  Обработчик синхронизации по умолчанию  отображает запросы Fetch, Save, Destroy CRUD в REST, используя URL-адрес коллекции:

  • Сохранить (новое)   создать → HTTP POST   / url
  • Выбрать   прочитать → GET   / url / id
  • Сохранить →  обновить → PUT  / url / id
  • Уничтожить →  удалить → УДАЛИТЬ  / URL / ID

Вид

  • Представление привязано к модели / коллекции
  • Манипулирует данными модели в DOM
  • Делегаты DOM событий
  • Функция Render использует данные модели для визуализации шаблона.

С помощью представления Backbone вы можете связать функцию рендеринга вашего представления с событием «изменения» модели, тогда везде, где данные модели отображаются в пользовательском интерфейсе, они будут обновляться.

Вот исходный код для Item View ItemView.js:

window.ItemView = Backbone.View.extend({
    initialize: function () {
        this.render();
    },
    render: function () {
        $(this.el).html(this.template(this.model.toJSON()));
        return this;
    },
    events: {
        "change"        : "change",
        "click .save"   : "beforeSave",
        "click .delete" : "deleteItem"
    },
});

В представлении вы переопределяете функцию рендеринга, указываете события и в этом примере указываете шаблон. В приведенном выше коде функция initialize связывает представление с событиями изменения своей модели, которые вызывают функцию рендеринга при возникновении события. Функция  рендеринга   визуализирует шаблон представления из данных модели и обновляет this.el новым HTML.

Это представление отображает данные модели в HTML, используя шаблонизатор.

  <script type="text/template" id="item-template">
  <h3>Name: {{name}}</h3>
  <p>{{description}}</p>
  </script>
  • Атрибуты модели: {«name»: «Sneaky Cat», «Description»: «my cat is soney» «}
  • Метод рендеринга: this. $ El.html (this.template (this.model.toJSON ()));
  • Вывод шаблона: <h3> Имя: подлый кот </ h3> <p> мой кот такой подлый </ p>

Таблица базы данных элементов каталога

Элементы каталога содержатся в таблице базы данных:

  • Элемент содержит заголовок и текст для каждого элемента в каталоге.
CREATE TABLE item (
 id INT NOT NULL,
 productid VARCHAR(10) ,
 name VARCHAR(30) ,
 description VARCHAR(500) ,
 imageurl VARCHAR(155),
 imagethumburl VARCHAR(155),
 price DECIMAL(14,2) ,
 primary key (id)
);

Модель — классы сущностей JPA

Модель — это постоянные объекты бизнес-домена вашего приложения. Экземпляр сущности JPA представляет строку в таблице базы данных. Item — это  Entity класс — типичный объект сущности Java Persistence, который отображается в таблицу Item, в которой хранятся экземпляры элемента.

Пример кода из Item .java:

   package model;

   ...

   @Entity
   @Table(name = "item")
   @XmlRootElement

   public class Item implements Serializable {
       @Id
       private Integer id;
       private String description;
       ...

       //getters and setters
       ...

Веб-сервисы RESTful с JAX-RS

Класс  Item FacadeREST является корневым ресурсным классом. Корневые классы ресурсов — это POJO, которые либо аннотированы @Path, либо имеют хотя бы один метод, аннотированный @Path, или указатель метода запроса, такой как @GET, @PUT, @POST или @DELETE. Методы ресурса — это методы класса ресурса, аннотированные указателем метода запроса. В этом разделе объясняется, как использовать JAX-RS для аннотирования классов Java для создания веб-сервисов RESTful.


Метод get ItemFacadeREST возвращает список объектов Post в формате JSON.
  • Для адресации ресурса в REST вы указываете его URI. @Path является аннотацией JAX-RS, которая идентифицирует путь URI для ресурса. Для ItemsResource путь URI/items/.
  • @GET указывает, что  get метод поддерживает метод HTTP GET.
  • @Produces определяет типы MIME, которые может создавать метод. В  @QueryParam аннотации указать входные параметры для  get() метода
  • @QueryParam задает входные параметры для  get() метода

Вот часть исходного кода для класса ItemsResource:

@Stateless
@Path("/items")
public class ItemFacadeREST extends AbstractFacade<Item> {
  @PersistenceContext(unitName = "itemPU")
  private EntityManager em;

   @GET
  @Produces({"application/xml", "application/json"})
  public List<Item> findAll() {
    CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
  cq.select(cq.from(Item.class));
  return getEntityManager().createQuery(cq).getResultList();
  }

Метод findAll () использует EntityManager для создания объекта Query для выполнения операторов языка запросов Java Persistence, которые могут возвращать список элементов. Item.class аннотируется @XmlRootElement, что делает его аннотированным классом   Java Architecture для привязки XML (JAXB), который будет маршалироваться как список  Item объектов в формате XML или JSON.

Вот пример HTTP-запроса для этой веб-службы:

Request: GET  http://localhost:8080/blog/resources/items/1?

Вот пример ответа HTTP для этой веб-службы:


Получено:

 {"id":1,
"productid":"feline01",
"name":"Friendly Cat",
"description":"This black and white colored cat is super friendly. Anyone passing by your front yard will find him puring at their feet and trying to make a new friend. His name is Anthony, but I call him Ant as a nickname since he loves to eat ants and other insects.",
"imageurl":"anthony.jpg",
"imagethumburl":"anthony-s.jpg",
"price":307.10}

Загрузка исходного кода:

Пример кода