通过注解 , 反射 , xml配置来接收特定的请求
以模块为单位创建Servlet
传统方式的开发一个请求对应一个Servlet:这样的话会导致一个模块的Servlet过多,导致整个项目的Servlet都会很多.能不能做一个处理?让一个模块都用一个Servlet处理请求. 用户模块, 创建UserServlet
注册:http://localhost:8080/day36/userServlet?method=regist
登录:http://localhost:8080/day36/userServlet?method=login
激活:http://localhost:8080/day36/userServle?method=active
但是这样会存在着一个Servlet有多个方法,想要修改就会很难,而且程序很庞大,不好维护
优化一
在doGet方法里面,有大量的if语句,可以通过反射来进行优化获得方法调用
1 | class UserServlet extend HttpServlet{ |
优化二
通过进行模块化拆分,每一个模块对应一个Servlet,发现doGet()方法里面,代码都是重复的,所以抽取一个通用的BaseServlet基类, 让各个模块Servlet继承BaseServlet.通用的BaseServlet
1 | "/base") ( |
优化三
BaseServlet中,可以灵活的处理客户端的请求,应对部分项目开发没有问题。这种实现要求客户端的每个请求都必须传递一个method参数,否则无法找到对应的web方法,另外这个控制器也必须要继承父类BaseServlet,因为是在父类的service()中完成请求解析与调用。这种方式不是很便捷并且耦合度比较高。
为了让BaseServlet用起来更方便更便捷,让它们的耦合关系更松散,比如写一个总控制器类,这个总控制器继承HttpServlet类,其他的控制器(子控制器)是普通Java类,不需要间接继承HttpServlet,然后由总控制器动态的去调用子控制器的业务方法,这种动态调用是采用在参数中不加入method的方式来实现的
1 | //思路: |
因为优化三与优化四有些重复 , 转至优化四
优化四
优化三存在着如下问题:
- controller包里面任何一个类都会扫描(获得类里面的Method), 加载 –> 扫描太多
- 等来了请求再去解析,再去反射创建对象调用 —> 影响处理请求的速度的
- 扫描的包名写死了
思路
- 服务器启动的时候,扫描controller包下面的所有的类 获得字节码对象集合
- 遍历字节码对象集合, 获得method对象数组
- 遍历method对象数组, 获得method上面的RequetMapping注解的MappingPath
- 把MappingPath和method关联存到容器里面
- 在DispacherServlet的service()方法里面
web配置及项目结构
扫描包工具类
1 | public class ClassScannerUtils { |
注解类
1 | //这个类是为了注明方法上的特定路径 |
javaBean类
1 | public class MvcMethod implements Serializable { |
Servlet类
1 | package xiaoliu.main; |
控制类
1 | package xiaoliu.main; |