我正在使用Tomcat。我在<error-page>
中定义了一些web.xml
,并将404
错误映射到了页面/error/error.jsp
。我需要检测资源是否存在,如果资源不可用,则将响应状态设置为404。
response.setStatus(404);
但是Tomcat没有重定向到我定义的404页面,所以我的问题是,是否有任何API来获取web.xml
中定义的页面位置?我不想自己解析web.xml
。
答案 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响应。