如何访问自定义taglib Java类中的JSP隐式对象?

时间:2010-11-12 13:56:08

标签: java jsp servlets jsp-tags

我在这里研究了关于taglib和隐含对象的各种问题。虽然许多答案都提出了有趣的想法,但我找不到直接回答这个问题的答案。

为了说明我的困境,请说我有一个实现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的实际隐式对象......

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

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

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

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

...或者可能将它们存储在我可以访问的其他隐式对象的哈希中...

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

如果这是真的,那自然会引出我的问题... 你是不是在开玩笑吧?我必须要有一些我在这里缺少的钥匙。在我的自定义taglib类中,访问JSP的隐式对象似乎是一件相当普遍的事情。每次我需要这些步骤时都必须采取这些步骤,这让我感到非常愚蠢 - 尤其是当我传递类似于PageContext对象的东西时,可以想象为我提供它们,但似乎并没有。

我真的觉得我在这里缺少一些基本的东西,但我不能为我的生活找出可能的东西。有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:10)

PageContext 可以让您访问当前的HttpServletRequest,只需要投射它:

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

这不是很好,但可以追溯到人们认为有一天可能会在Servlet API中出现非HTTP内容的时候。

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