Как данные передаются в Struts2? - PullRequest
3 голосов
/ 01 февраля 2012

Я пытаюсь понять путь данных в Struts2, как данные помещаются в ValueStack? Как я могу узнать, какой объект в настоящее время присутствует в ValueStack? К каким другим данным я могу получить доступ из разных областей приложения, сеанса, запроса, страницы? Как решить, какие области должны иметь мои переменные?

Ответы [ 2 ]

3 голосов
/ 01 февраля 2012

Это много вопросов.

Стек значений - это просто структура данных, своего рода комбинация карты и стека.Именованные объекты (доступ к которым осуществляется с помощью тега # в OGNL) находятся на карте (например, например, область запроса), объекты для поиска свойств / методов находятся в стеке.

Тег <s:debug>это самый простой способ узнать, что находится в стеке значений.Вы также можете получить доступ к произвольным объектам в стеке, используя «чистую» нотацию массива в JSP, например, "[0]" - самый верхний объект, "[1]" - следующий и т. Д. В реальной жизни это почти никогда не является хорошей идеей.

Вы можете получить доступ ко всему, что есть в каждой из областей.

Ваши собственные объекты почти всегда должны помещаться в стек значений через само действие или, если вы реализуете ModelDriven, черезмодель.Кроме того, оно такое же, как и в любом другом приложении Java EE - объекты, необходимые для продолжительности сеанса клиента, должны находиться в области сеанса, объекты, общие для всего приложения, должны находиться в области приложения и т. Д.

Сам стек значений находится в области запроса.

1 голос
/ 02 февраля 2012

Я специально расскажу об элементе «Как перемещаются данные» и о стеке ValueStack. Что касается информации о том, какие данные доступны, это может меняться в зависимости от контекста, и весь смысл наличия «стека» заключается в поддержке контекстных изменений в данных, находящихся в области видимости. Кроме того, конкретные данные в стеке лучше отражены в справочных материалах, таких как на веб-сайте Struts.

Struts 2 имеет очень чистую архитектуру. Это делает большую работу по разделению проблем программного обеспечения на отдельные компоненты. Одним из главных признаков этого является тот факт, что Действие является POJO. Как pojo, основной обязанностью действия является перенос данных. Это основной объект передачи данных; его свойства получают данные входящего запроса, при условии что все имена совпадают. Задача перемещения данных и размышления о том, когда перемещать данные, заключена в другом компоненте: перехватчике.

Перемещение данных в ValueStack выполняется почти исключительно с помощью перехватчиков. Одна из первых вещей, которую платформа делает при обработке запроса, - поместить вновь созданный объект действия в верхнюю часть стека значений. Это поддерживает доступ OGNL к свойствам вашего действия. Затем перехватчики перемещают данные в стек значений, и поскольку ваше действие присутствует, его свойства будут получать данные о соответствующих установщиках. Другие перехватчики также будут перемещать вещи в стек значений аналогичным образом, например, перехватчики проверки; если они находят ошибку, это сообщение об ошибке также отправляется в стек.

Помимо того, что ValueStack является централизованным контейнером данных, он, конечно же, является стеком. Эта стопка, которая позволяет свойствам в верхней части стека скрывать свойства в нижней части стека, вступает в действие, когда вы рассматриваете такие вещи, как тег итератора. Например, если вы перебираете коллекцию пользователей, каждый пользователь переходит на вершину стека и остается там в течение тела итерации. Это позволяет вашим ссылкам на свойства OGNL обращаться к свойствам каждого отдельного пользователя по очереди. Что еще более важно, если что-то еще с аналогично названным свойством было найдено далее в стеке, оно будет скрыто пользовательским объектом сверху. Обратите внимание, что с учетом этого, push-тег, который позволяет помещать в стек любой объект, который вам нравится, обеспечивает хорошую гибкость, когда вам нужно создать собственный контекст.

...