【问题标题】:When does the ServletContext return a null RequestDispatcher?ServletContext 什么时候返回 null RequestDispatcher?
【发布时间】:2011-04-18 10:04:11
【问题描述】:

ServletContext#getRequestDispatcher() 的 api 说:

如果 ServletContext 无法返回 RequestDispatcher,则此方法返回 null。

返回: 一个 RequestDispatcher 对象,它充当指定路径中资源的包装器,如果 ServletContext 无法返回 RequestDispatcher,则为 null

ServletContext 不能返回 RequestDispatcher 的原因是什么?起初我认为如果传递了无效路径但不返回 null,它会在浏览器上导致 404。

我在调用 forward() 方法之前检查 null 并且在日志中我可以看到有时 RequestDispatcher 为 null 但我不知道为什么并且我不知道如何复制它。

谢谢

更新

就像 Fazal 建议的那样,我尝试创建一个 RequestDispatcher 到“http://www.google.com/”,看看会发生什么。这导致了 IllegalArgumentException

java.lang.IllegalArgumentException:路径http://www.google.com/ 不以“/”字符开头

异常在我的 try/catch 块中被捕获,所以我从来没有机会检查 RequestDispatcher 是否为空或调用 forward() 方法。

那么 ServletContext#getRequestDispatcher() 方法必须有另一种方法来返回 null 而不会抛出异常?

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    Tomcat 为当前上下文之外的路径返回 null,例如 /../foo(但 Jetty 没有,因此它是特定于实现的)。

    【讨论】:

    • 啊,我知道我错过了“../”。我在Tomcat上运行,你是对的,它确实返回了null。我还注意到,如果传递给 getRequestDispatcher() 的路径为 null,那么它也会返回 null。
    【解决方案2】:

    我间歇性地看到了这个问题。但对我来说,只有当您尝试访问不在文档根目录中的有效补丁时才会发生这种情况。 例如。您的服务器在http://localhost/ 运行 我转发到像http://www.google.com 这样的URL。不知道你是否遇到这个问题

    【讨论】:

    • 嗯,我决定尝试为 google.com 创建一个 RequestDispatcher,但它抛出了 IllegalArgumentException,因为路径不是以“/”字符开头的。
    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多