Может ли сервер создавать и возвращать объекты GWT клиенту? - PullRequest
1 голос
/ 28 ноября 2009

Все еще борюсь с GWT и App Engine, и я пришел к этой проблеме:

У меня есть движок приложения, заполненный различными данными, которые я хотел бы представить на клиенте с помощью GWT RPC.

Я обнаружил, что из-за того, что мои объекты Model аннотированы с помощью JDO, я не могу просто отправить их обратно клиенту, потому что они не сериализуемы. Это означает, что мне придется создать слой промежуточных классов для извлечения данных из объектов моей модели и отправки их обратно клиенту для асинхронного использования.

Мне вот интересно, возможно ли построить объект GWT в сервлете и отправить его обратно для использования? Например, сервлет будет получать мой асинхронный запрос, извлекать нужные мне данные из базы данных, создавать GWT VerticalPanel () с соответствующими дочерними элементами для данных и отправлять этот VerticalPanel обратно клиенту для инъекции.

Мое понимание взаимодействия Java / Javascript, которое здесь происходит, все еще туманно, и я думаю, что отправка объекта Java, который не скомпилирован в Javascript, после удаления приложения не будет работать. Кто-нибудь может уточнить это для меня?

Ответы [ 3 ]

6 голосов
/ 28 ноября 2009

Нет, сервер не может создавать объекты пользовательского интерфейса GWT (например, вертикальные панели) для использования на уровне представления, и не должен этого делать, поэтому он называется «сервером», а «уровень представления» - для обслуживания данных и обработки. вся бизнес-логика, другая отображает вещи на экране и позволяет пользователю взаимодействовать с ними.

Тем не менее, вы можете отправлять аннотированные POJO в JPA на интерфейс очень хорошо (мы делаем это во всех наших приложениях). Вам просто нужно включить исходный код для самих аннотаций, чтобы GWT знал, как их скомпилировать. Вы также должны убедиться, что ваши POJO находятся в пакете, на который ссылается файл NameOfXmlFile.gwt.xml, например:

<module>
    <inherits name='com.google.gwt.user.User'/>
    <source path="domain" />
</module>

Этот файл в моем случае находится в папке над пакетом под названием «домен», где живут все мои POJO, аннотированные JPA. Затем на стороне клиента вы говорите ему наследовать этот файл .gwt.xml:

<module>
        <inherits name='com.google.gwt.user.User'/>
        <!-- Domain layer references -->
        <inherits name='your.package.structure.NameOfXmlFile'/>
</module>

Существуют ограничения на то, что вы можете поместить в эти классы (например, BigDecimal не поддерживается и т. Д.), Но все, что может быть скомпилировано компилятором GWT (и, конечно, могут быть аннотации JPA), может быть отправлено без необходимости какого-либо вида передачи объектов. Это одна из реальных сильных сторон GWT, в которой вы можете использовать одни и те же JPA Pojos во всем приложении, даже не создавая других подобных объектов.

Редактировать: Я только что заметил, что вы сказали JDO , а не JPA . Я полагаю, что то же самое применимо и там, хотя они просто аннотации?

2 голосов
/ 25 августа 2010

Я видел хорошие ответы, поэтому сам не буду их повторять ..

В любом случае мое простое, но жизненно важное предложение: единственный способ пройти через объекты POJO. НО ИМХО, чтобы избежать проблем, помните, что ваши объекты POJO ДОЛЖНЫ быть действительно PLAIN

В любом случае, я могу предложить вам также немного фреймворка, который я недавно сделал (несколько часов работы, так что не ждите ракеты!).

Это Пойо-инжектор : http://code.google.com/p/pojo-injector

Он помогает вам переводить ваши модели данных в POJO и обратно ... Он основан на аннотациях (только на стороне POJO!).

Надеюсь, это поможет.

0 голосов
/ 28 ноября 2009

Это (imho) одна из проблем с GWT.

В основном, в веб-приложениях Java довольно распространено иметь объекты данных или предметной области (которые будут вашими объектами JDO) и объекты представления, которые отправляются в представление. Некоторые идут намного дальше, чем это, и могут иметь намного больше уровней абстракции («давай, добавь еще один слой»).

Я вижу аргумент для этого, но он добавляет много шаблонов, когда вы переводите объекты между слоями.

В любом случае, в GWT вам нужно сделать это, если ваши доменные объекты являются POJO (и, как и в случае с JPA, даже если они утверждают, что являются POJO, аннотации делают их не такими в реальности).

GWT сделает это за вас для объектов, возвращаемых вашим RPC-интерфейсом, но есть определенные классы, которые вы не можете использовать (например, BigDecimal), так как нет эквивалента в Javascript (поэтому, чтобы использовать BigDecimals, вы передаете Strings для создания BigDecimals самостоятельно на стороне сервера, когда вы их вводите и конвертируете обратно в строки, когда отправляете их клиенту).

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