对于方法调用的优化:
从前面的例子可以看到,所有的方法都被单独列出来了,比较分散
我们可以把所有user方法放在一起,通过类似/user/add,/user/get的模式进行调用
基本思想:
因为响应请求是通过servlet来实现的,所以必须要继承servlet接口类。
但是单纯的继承不能实现分发,所以同过继承拥有分发(自写的)功能的BaseServlet
来完成方法的分发(而且也很便捷,只要写一个就能满足任何的方法分发)
类似UserServlet继承了Baseservlet就可以调用其service方法,所以只要在BaseServlet的Service方法内写方法分发的逻辑即可
具体实现:
为了防止乱码问题,可以通过如图配置来解决。
首先获得请求路径,之后进行最后一个 / 后的字符的截取,因为类似/user/add 前面的都是一直的,是通过后面字符的不同来调用不同的方法的
之后调用的是getClass(获得的是具体的类),这里的this(谁调用方法this就表示谁)
getMethod第二个开始之后的参数表示methodName这个类中方法的参数类型!
Invoke方法执行具体方法(这个方法我不是很理解),但是作用是执行方法
之后执行方法会报错,首先可以看到后面两个箭头指向的是参数,即上面说到的getMethod方法的参数设置!
这里错误的原因是方法是protected类型,外部不能访问,有两个方法解决:
①:
通过getDeclaredMethod方法可以获得该类中的所有方法包括私有方法,同时要设置setAccessible为true
但是这个操作明显不是十分合适,因为这样一个类就没有隐私了
②:
所以可以把一般的方法设置为public,这样一般类就可以直接调用到了,同时也可以设置protected方法。
整合到一个servlet中后,对于继承调用的部分可以提取出来单成一行
同时对于一些路径也要更改,如