Может ли файл тегов 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.