上两章我们进行了IOC和DI, 接下来我们进行servlet类录入的url路径的存储, 并将它放入模块上下文中
我们根据键值对的形式进行存储
键: url路径和访问的方式如get, post.
值: 哪一个servlet类和这个servlet类的哪个方法.
所以新建一个类Request, 用来存放 键.
public class Request { private ActionMethod actionMethod; private String requestPath; public Request (ActionMethod actionMethod, String requestPath) { this.actionMethod = actionMethod; this.requestPath = requestPath; } }
再新建一个枚举类ActionMethod, 用来表示访问的方式(GET, POST, DELETE, UPDATE......)
public enum ActionMethod { GET,POST,DELETE,UPDATE }
再新建一个类Handler, 用来存放 值.
public class Handler { private Class<?> cls; private Method method; public Handler (Class<?> cls, Method method) { this.cls = cls; this.method = method; } }
然后于模块上下文中定义一个容器, 用来存放这些
private static final Map<Request,Handler> HANDLER_MAP = new HashMap<>();再新建一个帮助类 ControllerHelper, 用来专门处理这些.
我们知道, Spring框架是通过注解定义的, 新建一个自定义注解 Controller, 用来标记 Servlet类
@Target(ElementType.TYPE) // 规定注解位置: 在类上 @Retention(RetentionPolicy.RUNTIME) public @interface Controller { String url() default ""; }
这样, 我们可以通过类上有没有这个注解来判别这个类是否是Controller类, 然后通过反射的方式获取Controoller注解上的url值.
我们知道, 类里面的方法上面同样有注解, 这样才可以知道到底执行哪个方法.
所以接着一个个扫描这些Controller类的方法, 找出方法上含有指定注解的, 进行遍历, 取得方法上注解里面的url值 和 访问的方式, 将这些作为 键, 把这个类和这个类里的这个方法作为 值 , 存储进模块上下文中去.