Как сделать модели домена на стороне сервера доступными для веб-браузера на стороне клиента?

В моем веб-приложении, использующем Spring MVC, у меня есть богатая модель предметной области. Я хотел бы сделать эту модель домена доступной для клиентского веб-браузера. Например, поскольку моя модель предметной области включает класс Person с методами Set<Person> getFriends() и DateTime getBirthday(), я хотел бы использовать эти методы на стороне клиента. Сценарии использования включают

  • динамическое обновление HTML-кода посещающего браузера для отображения списка всех друзей по запросу пользователя, или
  • отсортировать persons в HTML по дню рождения.

Обратите внимание, что я не ищу здесь доступ к моей модели предметной области на «этапе рендеринга просмотра» (например, JSP). Я ищу здесь для доступа к моей модели домена в браузерах пользователей моего веб-приложения. Так, например, я не хочу сортировать Person экземпляров на «этапе рендеринга просмотра». Я хочу, чтобы эта сортировка произошла позже, в браузере моего пользователя.

Каковы решения моей задачи?


person Abdull    schedule 04.03.2013    source источник
comment
вы можете использовать инфраструктуру javascript MVC для воссоздания своих моделей в js   -  person Muhammad Bekette    schedule 12.03.2013
comment
1. Убедитесь, что для вашего API требуется аутентификация. 2. Посмотрите на HATEOAS и REST. Я слышал, что раскрытие вашей модели домена может быть опасным.   -  person Jess    schedule 19.03.2013


Ответы (5)


Javascript — есть фреймворки, которые могут помочь облегчить это бремя. Описанный вами сценарий представляет собой вызов Ajax к какой-либо службе. Вы можете представить данные в виде json, который будет легким и достаточно простым для добавления на страницу с помощью javascript.

person Romski    schedule 04.03.2013
comment
Насколько я понимаю, с этим решением мне нужно будет воссоздать мою уже существующую модель предметной области Java в JavaScript. Кроме того, мне нужно убедиться, что оба представления остаются синхронизированными. И, наконец, мне нужно убедиться, что существует мост JSON-JVM для взаимодействия обоих миров. Существуют ли инструменты, которые автоматически генерируют JavaScript-эквивалентности моим классам предметной области Java и автоматически генерируют для меня мосты JSON-JVM? - person Abdull; 04.03.2013
comment
@Abdull Чтобы действительно иметь модель домена в браузере «как есть», вам понадобится апплет и отправить его по сети - это не то, что вы описали. Я думал, что у вас будет веб-сервис, который возвращает данные json. Затем вы можете преобразовать эти данные в любую структуру, подходящую для вашей страницы. Я не уверен, что вам нужно точно воспроизвести модель вашей предметной области, но я думаю, это зависит от ваших требований. Я не знаю никаких инструментов, чтобы сделать это для вас, но поскольку языковые конструкции разные, я ожидаю, что это будет сложно - person Romski; 04.03.2013
comment
Grails имеет мост JSON-JVM, который вам нужен, встроенный в модель предметной области. Ember.js автоматически синхронизирует данные между браузером и серверной частью. Не существует инструмента, который автоматически брал бы ваши доменные классы Java и генерировал эквиваленты Javascript, но использование Ember делает это до глупости тривиальным (см. мой ответ ниже). - person Zach Riggle; 13.03.2013

Ember.js (особенно его Модели) и Grails делают точно то, что вы хотите, когда используются вместе. Я уверен, что для этого можно использовать любую среду Java, но Grails делает это глупо простым. Ниже приведены несколько шаблонов для начала, но вот полный пример приложения!

Класс домена:

class Person {
    String name
}

Контроллер:

class PersonsController {
    def index() { render (["person": Person.list()] as JSON) }
}

Приложение Ember.js:

App.Store = DS.Store.extend({
   revision: 11,
   adapter:  DS.RESTAdapter.create({
    namespace: 'app'
  })
)};
App.Person = DS.Model.extend({
    name: DS.attr('string')
)};

В вашем браузере эта единственная команда заполнит хранилище данных в браузере, выбрав /app/persons из бэкэнда. Изменение экземпляров в браузере автоматически POST по протоколу HTTP отправит обновленный экземпляр на ваш контроллер.

App.Person.list()

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

person Zach Riggle    schedule 12.03.2013

Абдулл, вы смотрели GWT (Google Web ToolKit) http://bit.ly/YYz2Yx?

Вот пример кода, который иллюстрирует создание клиентских компонентов.

например загрузка контактов

            VerticalPanel contactsPanel = new VerticalPanel();
            contactsPanel.setSpacing(4);
            String[] contactNames = constants.cwStackPanelContacts();
            String[] contactEmails = constants.cwStackPanelContactsEmails();
            for (int i = 0; i < contactNames.length; i++) {
              final String contactName = contactNames[i];
              final String contactEmail = contactEmails[i];
              final Anchor contactLink = new Anchor(contactName);
              contactsPanel.add(contactLink)

http://bit.ly/12MOhZQ (для фактического примера кода)

person David Muruli    schedule 12.03.2013

Если бы вы не были ограничены браузером - и, следовательно, javascript, я бы сейчас кричал RMI. К счастью, похоже, есть решение, позволяющее заставить его работать. Я не пробовал, но может быть полезно:

jabsorb — это простая и легкая библиотека JSON-RPC для взаимодействия между Javascript, работающим в браузере, и Java, работающим на сервере. Это позволяет вам вызывать методы Java на сервере из Javascript, как если бы они были локальными, с автоматической сериализацией параметров и результатов.

https://code.google.com/p/jabsorb/

person Mike Adler    schedule 12.03.2013

Два популярных фреймворка javascript MVC:

http://backbonejs.org/
http://knockoutjs.com/

Вы можете попробовать их лично. Предложение всегда субъективно, ваш выбор также всегда субъективен. так что просто почувствуй это сам.

person Henry Leu    schedule 19.03.2013