Как данные передаются в Struts2?

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

2 ответа

Решение

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам