我对 doGet()
、doPost()
和 HttpServlet
类的其他方法的访问修饰符感到困惑。
为什么它们受到保护
?
根据我的理解,doGet()
的 protected
修饰符意味着客户端必须在同一个包中(或子包 - 通过继承)才能访问doGet()
。那么调用 JSP 或容器将如何访问它呢?
最佳答案
它们受到保护主要有两个原因。
- 这样外部类就不能像您推理的那样只调用它们。从技术上讲,有一些方法可以使用 Java 反射来绕过方法可见性修饰符(如果安全管理器允许或没有),但通常情况下, protected 方法只能由同一包中的类或子类访问,这让我点 #2。
- 以便
HttpServlet
的子类或具体实现可以覆盖它们。好吧,如果它们是公开的,它们也可以被覆盖,但请参见第 1 点。
现在你的另一个问题,“那么调用 JSP 或容器将如何访问它?”
HttpServlet
实现了 Servlet
接口(interface),它声明了一个 service(ServletRequest, ServletResponse)方法。当然,这在 HttpServlet
中默认成为 public
。这是调用 HttpServlet
实现的主要入口点(对于容器)。
我的猜测(我没有深入研究源代码)是 HttpServlet
的默认实现检查传入的 ServletRequest
对象,它实际上是一个 HttpServletRequest
并且它定义了一个 getMethod()
返回使用的 HTTP 方法的方法。然后根据 HTTP 请求方法分派(dispatch)到 doGet()
或 doPost()
。
关于java - 为什么 doGet(), doPost() 方法是 "protected"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14556304/