在HttpServlet类中没有抽象方法,那为什么还要将HttpServlet类声明为抽象类呢?
当一个类被声明为抽象方法有两个原因:
1.有抽象方法
2.没有抽象方法,但是不想此类被实例化
所以HttpServlet就是不想让我们new出它的实例。
一、那为什么设计者不想让我们new出它的实例呢?
1.如果将HttpServlet中的方法设置为抽象方法
,那么我们就不得不去实现这些方法,但是很多时候大部分方法对我们来说是用不上的,因此我们可能需要实现很多无意义的方法,所以设置成抽象方法并不是一个优雅的做法。
2.HttpServlet如果不设置为抽象类
,那么我们就可以new出其实例,但是这个实例内部方法如doGet()、doPost()并没有任何实现(业务逻辑的代码只有自己知道怎么写),所以new出来的这个实例是没有意义的一个实例
,它不能做任何事情,所以为了防止我们做这种没有意义的事情,将其设置为抽象类是优雅的做法。
二、如果我们继承了HttpServlet,但是不重写里面的方法直接用继承的类调用父类方法会发生什么呢?
这是HttpServlet内的doPost()方法,其他请求方法和这个差不多:
public static final int SC_METHOD_NOT_ALLOWED = 405;
public static final int SC_BAD_REQUEST = 400;
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_post_not_supported");
if (protocol.endsWith("1.1")) {
//协议为Http/1.1,直接调用该方法将会返回错误405
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
} else {
//协议不为Http/1.1,直接调用该方法将会返回错误400
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
}
}
因为不重写的方法调用没有任何意义,所以设计为如果直接调用方法将直接返回错误。