如何将servlet响应发送到web.xml配置的错误页面

时间:2010-01-12 07:26:55

标签: tomcat servlets custom-error-pages

我正在使用Tomcat。我在<error-page>中定义了一些web.xml,并将404错误映射到了页面/error/error.jsp。我需要检测资源是否存在,如果资源不可用,则将响应状态设置为404。

response.setStatus(404);

但是Tomcat没有重定向到我定义的404页面,所以我的问题是,是否有任何API来获取web.xml中定义的页面位置?我不想自己解析web.xml

2 个答案:

答案 0 :(得分:4)

只需将HttpServletResponse#sendError()status code一起使用即可。 E.g。

File resource = new File(path, name);
if (!resource.exists()) {
    response.sendError(HttpServletResponse.SC_NOT_FOUND); // Sends 404.
    return;
}

然后,servletcontainer将显示合适的errorpage。

注意:return语句不适用于装饰。它将避免同一方法块中的代码重新生成将继续运行,并可能在appserver日志中生成IllegalStateException s!初学者通常认为像sendRedirect()forward()sendError()等方法在调用时会以某种方式自动退出方法块。因此是真的;)

答案 1 :(得分:1)

不,没有API。该设置是Tomcat的内部设置,它不直接向外界公开。 (正如你所说,你可以解析web.xml - 因为它是XML,编写一个XQuery来简化它会很简单。)

此外,我认为你似乎对这应该如何工作感到困惑。您向Tomcat提供了一个URI,它将用于提供404响应的HTML正文。它需要能够将此URI解析为实际资源,就像它在请求中提供一样。因此,在许多情况下,您不需要servlet来检测资源是否存在 - 您需要一个servlet来包含要提供的资源。例外情况是,如果您使用Tomcat为某些URL提供静态文件系统数据,我认为这可能很少使用。

如果您设置的Tomcat没有任何servlet,那么您还期望它能够提供什么服务呢?您希望从哪里获取error.jsp页面?你怎么期望它知道呢?您需要做的是将至少一个servlet添加到Tomcat(包含error.jsp文件),然后确保web.xml将/error/error.jsp URL映射到此servlet(并且资源已定位)在servlet的error子目录中。)

完成此操作后,您应该可以手动转到例如http://localhost:8080/<context>/error/error.jsp并提供响应(可能有一些奇怪的内容,因为没有实际的异常,但应该找到该文件)。同样,如果您在web.xml中正确设置了错误页面指令,那么转到umapped网址(例如http://localhost:8080/<context>/asdfghjasgh)应该会将您的错误页面显示为404响应。