HttpServlet
是一个包含所有实现方法的抽象类。为什么是抽象的?
我得到的最常见的答案是,限制HttpServlet
的实例化。但是还有其他方法,比如私有构造函数将限制实例化。
我能理解,他们遵循的是模板方法设计模式。如果某些方法是抽象的,那么用户最终将实现所有这些方法,即使他的业务逻辑不需要这些方法。
但是,如果HttpServlet
不是抽象的,用户仍然可以扩展它并覆盖require方法。
至少根据“摘要”这个词的字典意思,它对我来说没有任何意义,它有一个带有所有实现方法的抽象类。
是的,抽象方法和具体方法的结合是可以的。
但是,如果要使类抽象,为什么不使这些方法抽象,子类必须重写这些方法呢?或者根本不声明它是抽象的?
比如doGet()
或doPost()
就是这种情况。
发布于 2013-09-19 21:14:09
要有任何有用的行为,预计您必须重写这些方法。HttpServlet本身没有有用的功能。
将其构造函数设置为私有将限制创建子类的能力。
HttpServlet的设计可能并不理想--特别是在许多页面上,GET和POST逻辑至少应该沿着共同的路径进行。然而,HttpServlet的设计思想是提供doGet()
、doPost()
等实现,根据HTTP版本回答“不受支持”的错误。如果您需要返回这样的答案,这些存根对于继承将是有用的。
总之,API/接口已经完成--但功能肯定不是。因此,它被宣布为抽象的。
发布于 2013-09-19 21:37:03
HTTPServlet是一个包含所有实现方法的抽象类。那为什么它是抽象的呢?
它是抽象的,因为关键方法的实现必须由自定义servlet类(例如,重写)提供。正如javadoc所述:
HttpServlet的子类必须覆盖至少一个方法,通常是其中一个:
如果您扩展类而不覆盖任何方法,您将得到一个无用的servlet,即为所有请求提供错误响应的servlet。类似地,如果类不是abstract
,那么HttpServlet
的任何直接实例都是无用的。
因此,创建HttpServlet
类abstract
的原因是为了防止(天真的)程序员错误。
作为记录,提供所有方法的实现的原因是通过提供默认行为使程序员的生活变得更简单。例如,如果我不希望servlet支持删除请求,doDelete
的默认实现将方便地用“不支持的方法”响应代码发送响应。
发布于 2014-11-24 12:39:55
您被迫扩展HttpServlet,因为您需要向它添加特定于应用程序的逻辑。以下是根据甲骨文部下的抽象类的定义:
抽象类是一个被声明为抽象的类,它可能包含抽象方法,也可能不包含抽象方法。抽象类不能实例化,但可以被子类化。
http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
原因:我们都知道HttpServlet没有任何抽象的方法。它包含了所有具体的methods.But,但是这个类是保持的,abstract.The的原因很简单。我们自己的类只能充当Servlet,只有当它扩展HttpServlet或GenericServlet类时,或者实现Servlet接口时,如果HttpServlet类不保持抽象,您就不会被限制来扩展这个类,而且您的类也不会充当Servlet。
ServletContainer使用instanceOf()来了解您的类是HttpServlet、GenericServlet或Servlet接口的子类。由于您的类不是HttpServlet、GenericServlet类或已实现的Servlet接口的子类,所以instanceOf()将失败。
https://stackoverflow.com/questions/18909206
复制相似问题