我在面试中被问到一个问题,你如何阻止Servlet实例化一个servlet对象?
我说容器决定销毁servlet对象。
他再次说容器将首先创建servlet对象然后销毁它。我的问题是还没有创建servlet对象,所以没有必要销毁它。当你试图在严重问题中实例化陷阱时,你将如何编写servlet类?我们的代码(或任何其他方式)应该阻止它实例化?
答案 0 :(得分:1)
我猜他希望你从javax.servlet.UnavailableException
init()
public class UnavailableException 扩展ServletException 此异常表示servlet不可用。 Servlet可以随时报告此异常,并且运行servlet的网络服务应该正常运行。有两种类型的不可用性,而复杂的服务将以不同的方式处理这些:
永久不可用。在采取某些管理操作来纠正servlet问题之前,servlet将无法处理客户端请求。例如,servlet可能配置错误,或者servlet的状态可能已损坏。编写良好的servlet将记录错误和管理员必须执行的纠正操作,以使servlet可用。
暂时不可用。由于系统范围的问题,servlet目前无法处理请求。例如,可能无法访问第三层服务器,或者可能没有足够的内存或磁盘存储来处理请求。问题可能是自我纠正,例如由于负载过重导致的问题,或者管理员可能需要采取纠正措施。
答案 1 :(得分:1)
您可以通过三种方式阻止容器创建Servlet实例:
在web.xml中删除对Servlet的引用。如果您的容器正在处理注释,则还需要删除@WebServlet
注释。
在构造函数中,抛出异常。
在init()方法中,抛出异常。
答案 2 :(得分:0)
你说得对,容器负责servlet的创建和生命周期。它首先使用默认的公共构造函数创建servlet的实例,然后调用其init()
方法。当容器想要销毁servlet时,它调用它的destroy()
方法,通常是(恕我直言)为空。
当部署可能是您的应用程序的新版本时,容器可以在热重新部署期间首先销毁然后创建新的servlet。这可能是你的面试官想要听到的。