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

标签 java jsp servlets jsp-tags

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

为了说明我的困境,假设我有一个实现 javax.servlet.jsp.tagext.Tag 接口(interface)的 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); %>

哪个,如果是真的,自然会引出我的问题...你他妈的在开玩笑吗??我一定错过了一些关键的东西。访问 JSP 的隐式对象对我来说似乎是在我的自定义 taglib 类中想要的相当普遍的事情。每次我需要时都必须采取这样的步骤,这让我觉得非常笨拙——尤其是当我被传递给像 PageContext 对象这样的东西时,可以想象它可以为我提供它们,但似乎没有。

我真的觉得我在这里缺少一些基本的东西,但我终究无法弄清楚那可能是什么。有人可以阐明这一点吗?

最佳答案

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

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

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

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

关于java - 如何访问自定义 taglib Java 类中的 JSP 隐式对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4165333/

相关文章:

java - String 类的哪些方法用于获取空格后的字符串?

java - 使用枚举与 boolean 值?

jsp - JSP 和自动刷新属性的最佳缓冲区大小

java - 更改默认 Servlet 响应

java - 使用带有时区的 SimpleDateTimeFormatter 时获取错误的解析日期

java - 如何将txt文件中的数据输入到数组列表中。涉及多种数据类型和作为其他类的变量的类对象

java - 显示 JSP 内渲染的 Spring Boot buildInfo() 版本

JSP 标签生命周期

java - 动态表单,带或不带多部分/表单数据

java - 在 servlet (Java/Tomcat/Linux) 中使用我自己的类