JSP.10.4 Кооперирующиеся Акции
Акции могут кооперироваться с другими акциями и с кодом скриптинга разными способами.
PageContext
Часто две акции в JSP-странице нужно скооперировать: когда, возможно, одна акция создаёт серверный объект, доступ к которому осуществляет вторая акция. Один из механизмов реализации этого - дать объекту имя внутри JSP-страницы; первая акция создаст объект и ассоциирует имя с ним, а вторая акция будет использовать это имя для запроса объекта.
Например, в следующем JSP-фрагменте акция foo может создать серверный объект и дать ему имя “myObject”. Затем акция bar может получить доступ к этому серверному объекту и выполнить какое-нибудь действие.
<x:foo id=“myObject” />
<x:bar ref=“myObjet” />
В JSP-реализации отображение “имя”->значение хранится в неявном объекте pageContext. Этот объект передаётся по кругу через экземпляры обработчика Tag так, что он (объект) может использоваться для передачи информации: всё, что необходимо, это знать имя, под которым информация хранится в pageContext.
Стэк Времени Прогона/Runtime Stack
Альтернативой явной передаче информации через именованный объект является неявная координация на базе синтаксической видимости. Например, в следующем JSP-фрагменте акция foo могла бы создать серверный объект; затем вложенная акция bar могла бы получить доступ к этому серверному объекту. Этот объект не именован внутри pageContext: он может быть найден, поскольку конкретный элемент foo является ближайшим содержащим экземпляром известного типа элемента.
<foo>
<bar/>
</foo>
Эта функциональность поддерживается через
BodyTagSupport.findAncestorWithClass(Tag, Class), который использует ссылку на родительский тэг, сохраняемую каждым экземпляром Tag, что эффективно представляет стэк выполнения времени/этапа прогона.