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

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

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

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 () внутри моего класса проблематичным.

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

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

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

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

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

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

1 Ответ

10 голосов
/ 12 ноября 2010

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

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

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

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

...