2015-01-18 2 views
0

У меня есть некоторые данные, которые мне нужно выполнить с помощью нескольких действий в моем приложении Grails. Из-за характера данных я бы предпочел не хранить данные в сеансе. Вот пример того, что я хотел бы сделать.Grails передают объект на вид и обратно

class MyController{ 
    def index(){ 
    MyObject object = MyObject.new(params.first, params.second, params.third) 
    [gspObject:object] 
    } 

    def process(){ 
    MyObject object = params.gspObject 
    //continue from here 
    } 
} 

В моей GSP, если я делаю

<g:form action="process" params="[gspObject:gspObject]"> 

Тогда я получаю ошибку

Cannot cast object '[email protected]' with class 'java.lang.String' to class 'net.package.MyObject' 

Мой вопрос, если я хочу, чтобы получить объект назад, что я послал к GSP , как я могу это получить? Есть ли какой-то объем, который я могу сохранить в этом объекте, будет немного более безопасным, чем сеанс? Есть ли способ передать объект в саму страницу и передать ее обратно в следующем запросе?

ответ

5

У Grails много слоев, но внизу у вас простой HTTP-протокол, как в любом веб-приложении. Это протокол без учета состояния, и вы отправляете текстовый или двоичный ответ и получаете текстовые или текстовые + двоичные запросы. Но вы не можете ожидать, что сможете отправить произвольный объект в веб-браузер в HTML и получить его обратно в том же состоянии, что и при его отправке - где этот объект Java/Groovy JVM будет храниться в браузера?

У вас есть в основном два варианта. Один из них заключается в том, чтобы хранить его на сервере, что меньше работает, потому что оно остается одним и тем же объектом все время. Сессия - хорошее место, потому что она связана с пользователем, создается по требованию и может автоматически тайм-аут и быть удаленной и т. Д. Другой - делать то, что вы пытаетесь сделать - отправить его клиенту и получить его назад - но вам придется сериализовать его из объекта (который может быть сложным объектом, содержащим произвольно много других объектов), и десериализировать его из формата, который вы использовали на клиенте, обратно в объекты Java/Groovy.

JSON - хороший вариант для сериализации/сортировки. Вы можете сохранить стробированный объект в скрытом элементе формы, если ваша страница использует форму или в аргументе querystring, если вы нажмете ссылку с этой страницы на следующую в рабочем процессе. Не отправляйте все данные объекта, но только то, что вам нужно, чтобы перестроить его. Все, что доступно в базе данных, должно ссылаться на id и перезагружаться.

Что-то вроде

[gspObject: object as JSON] 

или

[gspObject: [first: object.first, first: object.firstsecond, ...] as JSON] 

получите его в правильном формате для отправки, а затем вы можете разобрать JSON из запроса на reinstantiate экземпляр.

+0

Думаю, я просто использую сессию. Я немного беспокоился о захвате сеанса, но это не так, как кто-то просто читает страницу. Я знал, что протокол http не будет обрабатывать то, что я пытаюсь сделать, но я надеялся, что граф будет достаточно умен, чтобы это сделать. +1 и принять. –

Смежные вопросы