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覆盖了它。很好的尝试,非常感谢!没有链接,请只回答。你能在这里引用相关部分吗?