我正在使用Tomcat。我定义了一些<error-page>
inweb.xml
并将错误映射404
到 page /error/error.jsp
。我需要检测资源是否存在,如果资源不可用,则将响应状态设置为 404。
response.setStatus(404);
但是Tomcat不会重定向到我定义的404页面,所以我的问题是,是否有任何API可以获取定义的页面位置web.xml
?我不想web.xml
自己解析。
我正在使用Tomcat。我定义了一些<error-page>
inweb.xml
并将错误映射404
到 page /error/error.jsp
。我需要检测资源是否存在,如果资源不可用,则将响应状态设置为 404。
response.setStatus(404);
但是Tomcat不会重定向到我定义的404页面,所以我的问题是,是否有任何API可以获取定义的页面位置web.xml
?我不想web.xml
自己解析。
只需HttpServletResponse#sendError()
与状态代码一起使用。例如
File resource = new File(path, name);
if (!resource.exists()) {
response.sendError(HttpServletResponse.SC_NOT_FOUND); // Sends 404.
return;
}
然后 servlet 容器将显示合适的错误页面。
注意:return
声明不是用来装饰的。它将避免同一方法块中的剩余代码继续运行并可能IllegalStateException
在应用服务器日志中产生 s!初学者通常认为像sendRedirect()
, forward()
,sendError()
等这样的方法在调用时会以某种方式自动退出方法块。因此这是不正确的;)
不,没有 API。该设置是 Tomcat 内部的,它不会直接将其暴露给外界。(正如您所说,您可以解析 web.xml - 因为它是 XML,所以编写一个 XQuery 来提取它会很简单)。
另外,我认为您似乎对这应该如何工作感到困惑。您向 Tomcat 提供一个 URI,它将用于提供 404 响应的 HTML 正文。它需要能够将此 URI 解析为实际资源,就好像它是在请求中提供的一样。因此,在许多情况下,您不需要 servlet 来检测资源是否存在——您需要一个 servlet 来包含要服务的资源。例外情况是,如果您使用 Tomcat 为某些 URL 提供静态文件系统数据,我相信这是可能的,尽管很少使用。
如果您有一个没有任何 servlet 的 Tomcat 设置,您希望它提供什么服务?您究竟希望它从哪里获取您的error.jsp
页面?你指望它怎么知道?您需要做的是向 Tomcat(包含文件)添加至少一个 servlet error.jsp
,然后确保 web.xml 将/error/error.jsp
URL 映射到该 servlet(并且资源位于 servlet 的错误子目录中)。
完成此操作后,您应该能够手动转到 eghttp://localhost:8080/<context>/error/error.jsp
并提供响应(可能包含一些奇怪的内容,因为没有实际异常,但应该找到该文件)。同样,如果您在 web.xml 中正确设置了 error-page 指令,则转到映射的 URL(例如http://localhost:8080/<context>/asdfghjasgh
)应该会显示您的错误页面作为 404 响应。