为什么doGet(),doPost()方法是“受保护的”?

时间:2013-01-28 06:04:44

标签: java

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

为什么他们protected

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

6 个答案:

答案 0 :(得分:11)

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

  1. 所以外部类不能像你推理的那样只调用它们。从技术上讲,有一些方法可以使用Java Reflection来解决方法可见性修饰符(如果安全管理器允许或没有),但通常情况下,受保护的方法只能由同一个包中的类或子类访问,这带来了我指向#2。
  2. 因此HttpServlet的子类或具体实现可以覆盖它们。好吧,如果它们是公开的,它们也可以被覆盖,但是请看第1点。
  3. 现在你的另一个问题是,“那么调用JSP或Container将如何访问它?”

    HttpServlet实现了Servlet接口,该接口声明了service(ServletRequest, ServletResponse)方法。当然,这在public中默认为HttpServlet。这是调用HttpServlet实现的主要入口点(用于容器)。

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

答案 1 :(得分:3)

这是来自官方javadoc

  

提供要子类化的抽象类,以创建适合Web站点的HTTP Servlet。 HttpServlet的子类必须至少覆盖一个方法,通常是以下方法之一:

     

doGet,如果servlet支持HTTP GET请求

     

doPost,用于HTTP POST请求

     

doPut,用于HTTP PUT请求

     

doDelete,用于HTTP DELETE请求

     

初始化和销毁​​,以管理为servlet生命周期所持有的资源

     

getServletInfo,servlet用来提供有关自身的信息

  

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

doGet方法的文档中:

  

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

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

答案 2 :(得分:2)

doGet和doPost是生成和发送HttpResponse到客户端的基本方法(即通常是Browser或HttpClient)

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

答案 3 :(得分:1)

假设我有一个不是servlet的类MyClass,那么我希望我的类有方法doGetdoPost吗?好吧,如果它不是servlet,那么它如何响应或捕获任何基于Web的请求。

只有servlet可以捕获并响应基于Web的请求。

因此,只有当我的班级延伸Servlet并且因此我才能使用doGetdoPost时,我才能捕获并回复基于网络的请求。和variuos其他方法。

答案 4 :(得分:0)

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

实际上有一个名为javax.servlet.Servlet的界面。名为GenericServlet的类实现接口。 HTTPServlet类扩展了这个GenericServlet。

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

答案 5 :(得分:0)

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