停止从'ServletContextListener`方法`contextInitialized`启动Web应用程序

时间:2016-04-13 23:41:19

标签: servlets production-environment java-ee-7

我已通过ServletContextListener注释在Java Servlet网络应用中实施了@WebListener。在我的contextInitialized方法中,我会进行一些设置工作并验证预期的资源是否可用。

如果我在javascript:(document.getElementsByName("q")[0].value = "New Value"); 方法中确定出现了问题,那么如何阻止Web应用程序继续执行servlet?如果环境不合适(例如没有可用的数据库),则不应执行这些servlet。

如何优雅地处理基于servlet的Web应用程序的错误环境?

1 个答案:

答案 0 :(得分:3)

不,似乎ServletContextListener界面而非设计的目的是为了阻止启动网络应用。

正如this Answer所述,Servlet规范称ServletContextListener 可能在遇到异常时以某种方式禁止访问Web应用。该单词may表示可选,不是必需的。规范也没有准确定义停止访问Web应用程序的含义。

显然,各种Web容器中实现的行为差异很大。有些人什么都不做,有些人记录并继续前进,有些人阻止了网络应用的部署。

我使用Tomcat 8.0.33的经验...在throw new RuntimeException ( "bogus stop servlet " );方法中放置contextInitialized会阻止部署应用程序。在IDE报告中部署期间,控制台报告“FAIL - 在上下文路径上部署的应用程序/但上下文无法启动”。不幸的是,控制台和日志都没有捕获实际异常的报告。因此,如果您从一个或多个侦听器中抛出多个Exception,则调试将不会很明显。

如Stack Overflow中其他地方所述,最可靠的解决方案可能是使ServletContextListener标记成功或失败,并在servlet会话中存储标记变量。然后让您的servlet代码检索并检查该标志。然后,您的servlet代码将确定适当的操作过程。您的Web应用程序将被部署,但您自己的servlet可以选择不执行任何操作并发回一些HTTP错误代码。

类似的问题:

附注:添加或编辑ServletContextListener时,您可能需要对项目执行“清理并构建”操作。 IDE的热插拔或部署时开发功能可能无法在新的或已更改的侦听器上进行拾取。跟踪您的代码或进行一些日志验证。