Может ли файл тегов JSP получить доступ к вызывающему JSP-файлу PageContext? - PullRequest
11 голосов
/ 17 августа 2011

Если я сделаю:

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

похоже, что я должен быть в состоянии сделать:

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

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

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

${pageContext}

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

${pageContext.getAttribute("foo")}

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

Есть?

Ответы [ 2 ]

8 голосов
/ 17 августа 2011

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

Однако ${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}
1 голос
/ 23 мая 2013

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

...