четверг, 10 июля 2014 г.

struts multi mvc

struts multi mvc

Работаю над расчётным  web-приложением. Основой приложения является struts. Возникла проблема что нельзя отобразить несколько разных документов в браузере в разных вкладках.

Поскольку struts и browser строят модель MVC на текущей сессии, то возникает желание основные данные о документе тоже хранить в сессии. Что обычно и реализуется в примерах и справочниках. Но как только возникает желание перейти к многодокументному MVC, то возникают вопросы - а как различать документы, когда все данные хранятся в одной сессии? Суть отличия в ответе на вопрос - а как сервер должен отличить одну вкладку браузера от другой? Сервер работает только с cookie и не отличает запросы от разных вкладок, т.к. вкладки отдают серверу запросы с одинаковым набором cookie. Остаётся только одно решение - в каждой вкладке должны быть написаны get-параметры вида ?documentIndex=NNNNNNNNNNNN. Но у struts есть особенность - при работе с со стеком компонентов mvc он "режет" всё, что идёт после знака "?". В конце концов, после выполнения action никаких следов о documentIndex не остаётся в принципе.

Технически, следует искать ответ на вопрос: как сохранить get-параметры при выполнении action?

Решение:

Пример открытого документа с get-параметром:


Если нажать на кнопку "save and calculate md5", то страница "обновит" содержимое документа через POST-запрос и вернётся обратно. Может быть имело смысл именно это действие делать с помощью ajax, но решено именно как указано в документе, чтобы было нагляднее на простом примере. К тому же всегда можно захотеть нажать F5 и если не будет documentIndex, то редактор не будет знать, какой документ открыть.


Взаимодействующие части MVC:


Описание решения:

  1. Изначально документ открывается по ключу, называющемуся documentIndex и передающегося в параметре get-запроса.
  2. struts обрабатывает get-запрос и сохраняет его в скрытом поле формы document-index, а адресная строка браузера только констатирует факт открытия документа с этим индексом. Очень важно обратить внимание на вид с отладочной информацией описания html-формы, где видно, что в форме form['edit'] в поле action не прописаны атрибуты get, а это значит, что при отправке submit-от POST-запросов get-параметра documentIndex не случится.
  3. Чтобы сохранить параметр documentIndex нужно, чтобы в модели документа был такой член-класса документа как documentIndex со своим get и set, тогда struts его туда запишет.
  4. После обработки запроса на сервере struts формирует сообщение для перехода в другой action и для этого указывает параметр documentIndex в атрибутах соответствующего result.
  5. После этого struts перенаправит браузер на страницу get-запросом, в котором будет содержаться get-параметр documentIndex=NNNNN
Проблема решена!