我对doGet()
,doPost()
以及HttpServlet
类的其他方法的访问修饰符感到困惑。
为什么他们protected
?
根据我的理解,protected
的{{1}}修饰符意味着客户必须位于同一个包(或通过继承的子代)中才能访问doGet()
。那么调用JSP或容器将如何访问它呢?
答案 0 :(得分:11)
他们受到保护主要有两个原因。
HttpServlet
的子类或具体实现可以覆盖它们。好吧,如果它们是公开的,它们也可以被覆盖,但是请看第1点。现在你的另一个问题是,“那么调用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
,那么我希望我的类有方法doGet
和doPost
吗?好吧,如果它不是servlet,那么它如何响应或捕获任何基于Web的请求。
只有servlet可以捕获并响应基于Web的请求。
因此,只有当我的班级延伸Servlet
并且因此我才能使用doGet
,doPost
时,我才能捕获并回复基于网络的请求。和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
派生一个类,因此这些方法是要覆盖的方法。它们都有默认操作,因此您可以覆盖应用程序感兴趣的方法。