Может ли файл тегов JSP обращаться к вызывающему JSP PageContext?

Если я это сделаю:

<% pageContext.setAttribute("foo", "bar"); %>
<custom:myTag/>

похоже, что я должен это сделать:

<%= pageContext.getAttribute("foo") %>

внутри myTag.tag... но, конечно, я не могу, потому что файл тега не имеет доступа к pageContext (вместо этого он имеет доступ к jspContext... который не имеет таких же атрибутов, как вызывающая страница pageContext).

Теперь вы можете получить доступ к страницеContext через ELScript:

${pageContext}

но это не помогает, потому что ELScript не имеет возможности передавать аргументы, поэтому вы не можете делать:

${pageContext.getAttribute("foo")}

Однако тот факт, что ELscript может получить доступ к контексту страницы, и тот факт, что тег может обращаться ко всем видам переменных, таких как jspContext, должен быть каким-то образом для доступа к тегу (в логике сценариев/не только в ELScript) атрибут из вызывающего JSP pageContext.

Есть ли?

Ответ 1

Что касается EL, то ${pageContext.getAttribute("foo")} работает только в EL 2.2. До этого правильный синтаксис ${pageContext.foo} или просто ${foo}. См. Также нашу страницу EL wiki.

Однако ${pageContext} не разделяется между родительским JSP файлом и тегом JSP. Каждый из них имеет свой собственный экземпляр.

Вместо этого вы можете установить его как атрибут запроса:

<% request.setAttribute("foo", "bar") %>
<custom:myTag />

с тегом

<%= request.getAttribute("foo") %>

или, при EL

${requestScope.foo}

или

${foo}

Или, лучше, вы можете передать его как полноценный атрибут тега

<custom:myTag foo="bar" />

с тегом

<%@attribute name="foo" required="true" %>
${pageContext.foo}

или просто

<%@attribute name="foo" required="true" %>
${foo}

Ответ 2

Похоже, что в WebLogic 10 по крайней мере неявный объект приложения доступен в файлах тегов и является экземпляром ServletContext. Возможно, используйте это, когда это действительно ServletContext, после чего, и не обязательно для более высокого уровня pageContext.