Java 为什么doGet()、doPost()方法是;受保护的;?

Java 为什么doGet()、doPost()方法是;受保护的;?,java,Java,我对doGet()、doPost()和HttpServlet类的其他方法的访问修饰符感到困惑 为什么它们受到保护 根据我的理解,doGet()的protected修饰符意味着客户端必须在同一个包(或通过继承的子包)中才能访问doGet()。那么调用JSP或容器将如何访问它呢?假设我有一个不是servlet的类MyClass,那么我希望我的类有方法doGet和doPost?如果它不是servlet,那么它如何响应或捕获任何基于web的请求呢 只有servlet可以捕获和响应基于web的请求 因此,

我对
doGet()
doPost()
HttpServlet
类的其他方法的访问修饰符感到困惑

为什么它们受到保护


根据我的理解,
doGet()
protected
修饰符意味着客户端必须在同一个包(或通过继承的子包)中才能访问
doGet()
。那么调用JSP或容器将如何访问它呢?

假设我有一个不是servlet的类
MyClass
,那么我希望我的类有方法
doGet
doPost
?如果它不是servlet,那么它如何响应或捕获任何基于web的请求呢

只有servlet可以捕获和响应基于web的请求

因此,只有当我的类扩展了
Servlet
时,我才能捕获和响应基于web的请求,因此我将能够使用
doGet
doPost
和其他各种方法

提供一个要子类化的抽象类,以创建适用于网站的HTTP servlet。HttpServlet的子类必须重写至少一个方法,通常是以下方法之一:

doGet,如果servlet支持HTTP GET请求

doPost,用于HTTP POST请求

doPut,用于HTTP PUT请求

doDelete,用于HTTP删除请求

init和destroy,以管理在servlet生命周期内保留的资源

getServletInfo,servlet使用它来提供关于自身的信息

而且

几乎没有理由重写服务方法。服务通过将标准HTTP请求分派给每个HTTP请求类型的处理程序方法(上面列出的doXXX方法)来处理这些请求

doGet
方法的文档中:

由服务器调用(通过服务方法调用),以允许servlet处理GET请求


因此
HttpServlet
是为继承而设计的,入口点是
service
方法。因此,
doGet
受到保护,以强制执行清晰的API。

doGet和doPost是生成HttpResponse并将其发送到客户端(即通常是浏览器或HttpClient)的基本方法


此外,容器调用
Servlet.service()
方法,该方法是
public
。然后调用受保护的
HttpServlet.service()
方法,然后调用
doGet()
/
doPost()
方法

我认为您想知道servlet容器如何调用受保护的方法doGet和doPost

实际上有一个名为的接口。名为的类实现接口。HTTPServlet类扩展了这个GenericServlet


当存在对HTTPServlet的http请求时,容器只需使用接口中声明的方法服务(…)。这种方法是公开的。然后在GenericServlet中,服务方法称为doGet和doPost。如果servlet类扩展了HTTPServlet类并重写了doPost方法,那么最终将调用此方法

将受保护的
视为覆盖方法的邀请。您正在从
HttpServlet
派生一个类,因此这些方法是要重写的方法。它们都有一个默认操作,因此您可以覆盖应用程序感兴趣的方法。

它们受到保护主要有两个原因

  • 所以外部类不能像你所说的那样直接调用它们。从技术上讲,有一些方法可以使用Java反射绕过方法可见性修饰符(如果安全管理器允许或没有),但通常,受保护的方法只能由同一包中的类或子类访问,这就引出了第2点
  • 因此
    HttpServlet
    的子类或具体实现可以覆盖它们。如果它们是公共的,它们也可以被覆盖,但请参见第1点
  • 现在是另一个问题,“那么调用JSP或容器将如何访问它?”

    HttpServlet
    实现接口,该接口声明一个方法。当然,默认情况下,它在
    HttpServlet
    中成为
    public
    。这是调用
    HttpServlet
    实现的主要入口点(对于容器)


    我的猜测(我没有深入到源代码中)是
    HttpServlet
    的默认实现检查传入的
    ServletRequest
    对象,该对象实际上是一个,它定义了一个返回所使用的HTTP方法的方法。然后根据HTTP请求方法将其分派到
    doGet()
    doPost()

    好吧,我了解类和servlet!我认为服务方法在通用Servlet类中仍然是抽象的!方法签名是-public abstract void service(ServletRequest-request,ServletResponse-response)是的,它是抽象的,我认为HttpServlet覆盖了它。很好的尝试,非常感谢!没有链接,请只回答。你能在这里引用相关部分吗?