Я специально расскажу об элементе «Как перемещаются данные» и о стеке ValueStack. Что касается информации о том, какие данные доступны, это может меняться в зависимости от контекста, и весь смысл наличия «стека» заключается в поддержке контекстных изменений в данных, находящихся в области видимости. Кроме того, конкретные данные в стеке лучше отражены в справочных материалах, таких как на веб-сайте Struts.
Struts 2 имеет очень чистую архитектуру. Это делает большую работу по разделению проблем программного обеспечения на отдельные компоненты. Одним из главных признаков этого является тот факт, что Действие является POJO. Как pojo, основной обязанностью действия является перенос данных. Это основной объект передачи данных; его свойства получают данные входящего запроса, при условии что все имена совпадают. Задача перемещения данных и размышления о том, когда перемещать данные, заключена в другом компоненте: перехватчике.
Перемещение данных в ValueStack выполняется почти исключительно с помощью перехватчиков. Одна из первых вещей, которую платформа делает при обработке запроса, - поместить вновь созданный объект действия в верхнюю часть стека значений. Это поддерживает доступ OGNL к свойствам вашего действия. Затем перехватчики перемещают данные в стек значений, и поскольку ваше действие присутствует, его свойства будут получать данные о соответствующих установщиках. Другие перехватчики также будут перемещать вещи в стек значений аналогичным образом, например, перехватчики проверки; если они находят ошибку, это сообщение об ошибке также отправляется в стек.
Помимо того, что ValueStack является централизованным контейнером данных, он, конечно же, является стеком. Эта стопка, которая позволяет свойствам в верхней части стека скрывать свойства в нижней части стека, вступает в действие, когда вы рассматриваете такие вещи, как тег итератора. Например, если вы перебираете коллекцию пользователей, каждый пользователь переходит на вершину стека и остается там в течение тела итерации. Это позволяет вашим ссылкам на свойства OGNL обращаться к свойствам каждого отдельного пользователя по очереди. Что еще более важно, если что-то еще с аналогично названным свойством было найдено далее в стеке, оно будет скрыто пользовательским объектом сверху. Обратите внимание, что с учетом этого, push-тег, который позволяет помещать в стек любой объект, который вам нравится, обеспечивает хорошую гибкость, когда вам нужно создать собственный контекст.