Как сделать серверные доменные модели доступными для клиентского веб-браузера?
В моем веб-приложении, использующем Spring MVC, у меня модель богатого домена. Я хотел бы сделать эту модель домена доступной для веб-браузера клиента. Например, поскольку моя модель домена включает в себя класс Person
с методами Set<Person> getFriends()
а также DateTime getBirthday()
Я хотел бы использовать эти методы на стороне клиента. Сценарии использования включают
- динамически обновлять HTML-код браузера для просмотра списка всех друзей по запросу пользователя или
- Сортировать
persons
в HTML к их дню рождения.
Обратите внимание, что я не ищу здесь доступ к моей доменной модели на "этапе рендеринга вида" (например, JSP). Я ищу здесь доступ к моей доменной модели в браузерах пользователей моего веб-приложения. Так, например, я не хочу сортировать Person
экземпляры во время "этапа визуализации представления". Я хочу, чтобы эта сортировка произошла позже, в браузере моего пользователя.
Каковы решения моей проблемы?
5 ответов
Javascript - есть рамки, которые могут помочь облегчить бремя. Сценарий, который вы описали, - это вызов Ajax какой-то службе. Вы можете представить данные в виде json, который будет легким и достаточно простым для добавления на страницу с помощью javascript.
Ember.js (особенно его Модели) и Grails делают то, что вы хотите, когда используются вместе. Я уверен, что вы можете использовать любой Java-фреймворк для этого, но Grails делает это глупо легко. Ниже приведены несколько шаблонов для начала, но вот полный пример приложения!
Класс домена:
class Person {
String name
}
контроллер:
class PersonsController {
def index() { render (["person": Person.list()] as JSON) }
}
Ember.js App:
App.Store = DS.Store.extend({
revision: 11,
adapter: DS.RESTAdapter.create({
namespace: 'app'
})
)};
App.Person = DS.Model.extend({
name: DS.attr('string')
)};
В вашем браузере эта единственная команда заполнит хранилище данных в браузере путем извлечения /app/persons
из бэкэнда. Изменение экземпляров в браузере будет автоматически HTTP POST
обновленный экземпляр для вашего контроллера.
App.Person.list()
Вы можете проверить мой ответ о том, как заставить их играть вместе в идеальной гармонии для более сложных приложений.
Абдул, вы смотрели на 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 (для фактического примера кода)
Если бы вы не были ограничены браузером - и, таким образом, javascript, я бы кричал об RMI сейчас. К счастью, кажется, что есть решение, чтобы заставить его работать. Я не пробовал это, но это могло бы стоить:
jabsorb - это простая и легкая библиотека JSON-RPC для связи между Javascript, работающим в браузере, и Java, работающим на сервере. Это позволяет вам вызывать методы Java на сервере из Javascript, как если бы они были локальными, с автоматической сериализацией параметров и результатов.
Два популярных JavaScript-фреймворка для JavaScript:
http://backbonejs.org/
http://knockoutjs.com/
Вы можете попробовать их лично. предложение всегда субъективно, ваш выбор всегда субъективен. так что просто почувствуй это сам.