Java servlet中 service()方法的小疑问
在抽象类HttpServlet的源码中存在service()方法,
其中service()方法中也调用了doGet()方法;
现在我自定义一个继承了HttpServlet抽象类的servlet程序,覆盖了doGet()方法,
为什么在浏览器中访问的时候,调用的是我的doGet()方法,
而不是HttpServlet抽象类的doGet()方法
例如,下面的程序能否模拟 真正的servlet程序调用service()方法时的情景,
但下面的程序调用的却是HttpServlet类的doGet()方法
应该去掉除main方法外的static修饰符,见后图
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
servlet
容器通过解析你的http
请求路由找到对应的servelt
对象即yourHttpServlet
, 因为这个对象继承了HttpServlet
类所以就继承了service()
和doGet()
。当你覆盖了doGet()
,yourHttpServlet
拥有的就是覆盖后的doGet()
,所以调用yourHttpServlet.service()
就会调用yourHttpServelt.doGet()
没毛病啊。----针对你的问题修改后----
你怎么都写成了静态(static)方法啊,静态方法的成员方法在类的继承中是有一些区别的,建议你在网上查查。针对你这个模拟主要是作用域不同,就是说静态方法的作用域是在类级别上的。
MyServlet
继承了HttpServlet
后就继承了service()
和doGet()
,但是这两个方法是静态的,所以不会被子类的方法覆盖(这是和成员方法的区别),即你在MyServlet
中定义的doGet()
是没有覆盖HttpServlet
中的doGet()
的。myServlet.service()
和Myservlet.service()
效果是一样的,建议使用类去调研静态方法。这个service()
调用的是HttpServlet.doGet()
。如果你想在里面调用MyServlet
的doGet()
就要在该类里面重新定义service()
。你这种模拟是不对的,因为在真正的
HttpServlet
里的service()
和doGet()
都不是静态的。Web容器会读取你的web.xml,然后得到你的Servlet的位置,用Servlet对象来接收你的Servlet实例(大概是反射获得吧),Web容器只需调用Servlet接口里的方法,不管具体实现。实际上调用的是你复写的方法。