【问题标题】:How do I access JSP implicit objects inside custom taglib Java classes?如何访问自定义 taglib Java 类中的 JSP 隐式对象?
【发布时间】:2011-05-09 02:20:06
【问题描述】:

我在这里检查了有关标记库和隐式对象的各种问题。虽然许多答案都提出了有趣的想法,但我一直无法找到直接回答这个问题的答案。

为了说明我的困境,假设我有一个实现 javax.servlet.jsp.tagext.Tag 接口的 Java 类...

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 的 actual 隐式对象的访问...

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

上面描述的 ServletRequest 对象与 HttpServletRequest 完全不同,后者是由 JSP 本身中的隐式对象“request”实现的。这使得在我的类中调用诸如 HttpServletRequest.getRequestURI() 这样方便的方法会出现问题。

因此,通过阅读此处对其他几个问题的答案,我留下的印象是,没有开箱即用的方法可以获取实际的隐式对象。我要么必须将它们明确地作为我的 JSP 中自定义标记的属性传递...

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

...或者也许将它们存储在我确实有权访问的其他一些隐式对象的哈希中...

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

如果属实,这自然会引出我的问题... 你在开玩笑吗?? 一定有一些我在这里遗漏的关键。在我的自定义 taglib 类中,访问 JSP 的隐式对象似乎是一件相当普遍的事情。每次我需要这些步骤时都必须采取这些步骤,这让我感到非常笨拙——尤其是当我被传递给我可以想象为我提供它们但似乎没有提供它们的 PageContext 对象之类的东西时。

我真的觉得我在这里遗漏了一些基本的东西,但我一生都无法弄清楚那可能是什么。有人可以对此有所了解吗?

【问题讨论】:

    标签: java jsp servlets jsp-tags


    【解决方案1】:

    PageContext确实让你可以访问当前的HttpServletRequest,你只需要转换它:

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

    这不是很好,但可以追溯到人们认为有一天 Servlet API 中可能会有非 HTTP 的东西。

    至于术语“隐式对象”的使用,这仅在 JSP 页面本身的上下文中才有意义。除此以外,这个词没有任何意义。表示当前HttpServletRequest 的“隐式对象”与您从PageContext 获得的对象相同。

    【讨论】:

    • [刘海头放在桌子上] 啊!我知道我缺少一些基本的东西:HttpServerRequest 扩展了 ServerRequest。应该看过感谢您的回复,斯卡夫曼!
    • 是的,“隐式对象”仅在 JSP 本身内部才有意义。我想知道我说了什么启发了你指出这一点......?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 2015-09-01
    • 2011-02-26
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多