java怎么重写get方法_自定义servlet重写doGet或doPost方法是如何实现多态的

我们知道,如果我们自定义一个servlet继承HttpServlet,并且重写HttpServlet中的doGet或doPost方法,那么从浏览器发送过来的request请求将调用HttpServlet中的service方法,在service方法中,根据获得的method是get还是post,将调用我们自定义servlet中的doGet或doPost方法,这里用到了多态技术,因为基类HttpServlet中service方法调用的不是基类的doGet或doPost方法,而是子类的doGet或doPost方法。

我们举一个例子来说明:

1 public class HelloServlet extendsHttpServlet{

2 @Override

3 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {

4 System.out.println("请求已收到。。。");

5 }

6 }

这是正常情况下的程序。但是这里的多态是怎么实现的呢,我们并没有看见子类对象赋给基类的代码。这里我们不得不提java中很重要的概念:反射。反射不是这里研究的重点,所以不过多阐述。

那利用反射是怎样实现上面代码的多态呢?

我们看下面这个例子:

1 public class HelloServlet extendsHttpServlet{

2 public HelloServlet(inti) {

3 }

4

5 @Override

6 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {

7 System.out.println("请求已收到。。。");

8 }

9 }

这个代码只是在第一个代码的基础上加上了一个HelloServlet的带参构造器,当我们运行上述代码时,会报如下错误:

HTTP Status 500 – Internal Server Error

--------------------------------------------------------------------------------

Type Exception Report

Message Error instantiating servlet class [com.itheima.a_hello.HelloServlet]

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

javax.servlet.ServletException: Error instantiating servlet class [com.itheima.a_hello.HelloServlet]

org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)

org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)

org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)

org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)

org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407)

org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)

org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)

org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)

org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)

java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)

java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)

org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

java.base/java.lang.Thread.run(Thread.java:844)

Root Cause

java.lang.NoSuchMethodException: com.itheima.a_hello.HelloServlet.()

java.base/java.lang.Class.getConstructor0(Class.java:3322)

java.base/java.lang.Class.getConstructor(Class.java:2108)

org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)

org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)

org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)

org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)

org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407)

org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)

org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)

org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)

org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)

java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)

java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)

org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

java.base/java.lang.Thread.run(Thread.java:844)

Note The full stack trace of the root cause is available in the server logs.

在Message中我们看到,原理时实例化servlet类时出错,那为什么会这样呢?

原来,我们没有看到的子类对象赋给基类的代码正式反射帮我们做的。还记得我们在创建HelloServlet时会在web.xml中需要配置HelloServlet的全限定名吗,这正是给反射用的,通过这个类名,反射技术可以得到该类的Class对象,并由Class对象的newInstance方法创建该类的实例,并把该子类对象赋给了基类,由此产生多态。

Class对象的newInstance方法需要根据无参构造器去创建实例,由于我们用带参构造器覆盖了无参构造器,所以,HelloServlet没有了无参构造器,因此不能创建实例,报出以上错误信息。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值