Как получить доступ к неявным объектам JSP внутри пользовательских классов Java taglib?

Здесь я изучил различные вопросы о taglibs и неявных объектах. Хотя во многих ответах представлены интересные идеи, мне не удалось найти ответ, прямо отвечающий на этот вопрос.

Итак, чтобы проиллюстрировать мою дилемму, скажем, у меня есть класс Java, который реализует интерфейс javax.servlet.jsp.tagext.Tag...

import javax.servlet.ServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;

class MyTag implements Tag {
    private PageContext _pageContext;

    public void setPageContext(PageContext pageContext) {
        _pageContext = pageContext;
    }
    .
    .
    .

Это дает мне доступ к объекту PageContext, который предоставляет некоторую полезную информацию о вызывающем JSP. Проблема в том, что PageContext, похоже, не предоставляет доступ ко многим неявным объектам фактических JSP...

.
.
.
public int doEndTag() throws JspException {
    ServletRequest req = _pageContext.getRequest();
    .
    .
    .
    return EVAL_PAGE;
}

Изображенный выше объект ServletRequest сильно отличается от HttpServletRequest, который реализуется неявным объектом «запрос» в самой JSP. Это делает вызов таких удобных методов, как HttpServletRequest.getRequestURI(), внутри моего класса проблематичным.

Итак, прочитав здесь ответы на несколько других вопросов, у меня сложилось впечатление, что не существует нестандартного способа получить фактические неявные объекты. Я либо должен передать их явно как атрибуты пользовательского тега в моем JSP...

<mc:mytag request="<%=request%>"/>

...или, возможно, сохранить их в хеше какого-то другого неявного объекта, к которому у меня есть доступ...

<% session.setAttribute("request", request); %>

Что, если это правда, естественно, приводит меня к вопросу... ты что, черт возьми, издеваешься надо мной? Должно быть что-то ключевое, что я здесь упускаю. Доступ к неявным объектам JSP кажется достаточно распространенным явлением, которое мне нужно в моих пользовательских классах taglib. Мне кажется чрезвычайно глупым предпринимать такие шаги каждый раз, когда они мне нужны, особенно когда мне передают что-то вроде объекта PageContext, который предположительно мог бы предоставить их для меня, но, похоже, не делает этого.

Я действительно чувствую, что мне здесь не хватает чего-то базового, но я не могу понять, что это может быть. Может ли кто-нибудь пролить свет на это?


person Syndog    schedule 12.11.2010    source источник


Ответы (1)


PageContext действительно дает вам доступ к текущему HttpServletRequest, вам просто нужно применить его:

HttpServletRequest req = (HttpServletRequest )_pageContext.getRequest();

Это не очень хорошо, но восходит к тому времени, когда люди думали, что однажды в Servlet API могут появиться вещи, не связанные с HTTP.

Что касается использования термина "неявные объекты", это имеет смысл только в контексте самой страницы JSP. Термин не имеет никакого другого значения. «Неявный объект», представляющий текущий HttpServletRequest, — это тот же объект, который вы получаете из PageContext.

person skaffman    schedule 12.11.2010
comment
[ударяется головой о стол] Гах! Я знал, что упускаю что-то основное: HttpServerRequest расширяет ServerRequest. Должен был это видеть. Спасибо за ответ, скафман! - person Syndog; 12.11.2010
comment
И да, неявный объект имеет значение только внутри самого JSP. Мне интересно, что я сказал, что вдохновило вас указать на это...? - person Syndog; 12.11.2010