java - 为什么 doGet(), doPost() 方法是 "protected"?

标签 java

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

为什么它们受到保护

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

最佳答案

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

  1. 这样外部类就不能像您推理的那样只调用它们。从技术上讲,有一些方法可以使用 Java 反射来绕过方法可见性修饰符(如果安全管理器允许或没有),但通常情况下, protected 方法只能由同一包中的类或子类访问,这让我点 #2。
  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/

相关文章:

java - 如何对ArrayList中的数组进行排序?

java - DOM模型中html的标签

java - 使用 java ireport : net. sf.jasperreports.engine.JRException 生成报告时出错:编译报告 java 源文件时出错

java - 检查字符串中的特定值

java - 如何从包含任何字符的文本文件中查找最长的单词?

java - 如何将参数的类传递给另一个方法调用?

java - 为什么我会陷入无限循环

java - Calendar.WEEK_OF_YEAR 返回错误值?

java - 更改 ImageButton Src 图像 OnClick

java - 如何获取堆转储中使用的对象 ID