• 手写web框架之加载Controller,初始化框架


    1,加载Controller
         我们需要创建 一个ControllerHelper类,让它来处理下面的逻辑:
          通过ClassHelper我们可以获取所有定义了Controller注解的类,可以通过反射获取该类中所有带有Action注解的方法,获取Action注解中的请求表达式,进而获取请求方法与请求路径,封装一个请求对象(Request)和处理对象(Handler),最后将Request与Handler建立一个映射关系,存入一个Action Map中,并提供一个可以根据请求方法与请求路径获取处理对象的方法。

     1 package org.smart4j.framework.helper;
     2  
     3 import org.smart4j.framework.annotation.Action;
     4 import org.smart4j.framework.bean.Handler;
     5 import org.smart4j.framework.bean.Request;
     6 import org.smart4j.framework.org.smart4j.framework.util.ArrayUtil;
     7 import org.smart4j.framework.org.smart4j.framework.util.CollectionUtil;
     8  
     9 import java.lang.reflect.Method;
    10 import java.util.HashMap;
    11 import java.util.Map;
    12 import java.util.Set;
    13  
    14 /**
    15  * Created by liangboqun on 2017/5/24.
    16  */
    17 public final class ControllerHelper {
    18     /**
    19      * 用于存放请求与处理器的映射关系(简称Aciotn Map)
    20      */
    21     private static final Map<Request,Handler> ACTION_MAP = new HashMap<Request, Handler>();
    22     static {
    23         /**
    24          * 获取所有的Controller类
    25          */
    26         Set<Class<?>> controllerClassSet = ClassHelper.getControllerClassSet();
    27         if (CollectionUtil.isNotEmpty(controllerClassSet)){
    28             //遍历这些Controller
    29             for (Class<?> controllerClass : controllerClassSet) {
    30                 //获取Controller类中定义的方法
    31                 Method [] methods = controllerClass.getDeclaredMethods();
    32                 if (ArrayUtil.isNotEmpty(methods)){
    33                     //遍历Controller类中的方法
    34                     for (Method method : methods) {
    35                         //判断当前方法是否有Action注解
    36                         if (method.isAnnotationPresent(Action.class)){
    37                             //从Action注解中获取URL映射规则
    38                             Action action = method.getAnnotation(Action.class);
    39                             String mapping = action.value();
    40                             //验证URL映射规则
    41                             if (mapping.matches("\w+:/\w*")){
    42                                 String [] array = mapping.split(":");
    43                                 if (ArrayUtil.isNotEmpty(array) && array.length ==2){
    44                                     //获取请求方法与请求路径
    45                                     String requestMethod = array[0];
    46                                     String requestPath = array[1];
    47                                     Request request = new Request(requestMethod,requestPath);
    48                                     Handler handler = new Handler(controllerClass,method);
    49                                     //初始化Action Map
    50                                     ACTION_MAP.put(request,handler);
    51                                 }
    52                             }
    53                         }
    54                     }
    55                 }
    56             }
    57         }
    58     }
    59     /**
    60      * 获取Handler
    61      */
    62     public static Handler getHandler(String requestMethod,String requstPath){
    63         Request request = new Request(requestMethod,requstPath);
    64         return ACTION_MAP.get(request);
    65     }
    66 }

    可见,我们在ControllerHelper中封装了一个ActionMap,通过它来存放Request与Handler之间的映射关系,然后通过ClassHelper来获取所有带有Controller注解的类,接着遍历这些Controller类,从Action注解中提取URL,最后初始化Request与Handler之间的映射关系

    2,初始化框架
            通过上面的过程,我们创建了ClassHelper,BeanHelper,IocHelper,ControllerHelper这四个Helper类,需要通过一个入口程序来加载它们,实际上式加载它们的静态代码库,这个加载程序时HelperLoader,代码如下:

    package org.smart4j.framework;
     
    import org.smart4j.framework.helper.BeanHelper;
    import org.smart4j.framework.helper.ClassHelper;
    import org.smart4j.framework.helper.ControllerHelper;
    import org.smart4j.framework.helper.IocHelper;
    import org.smart4j.framework.org.smart4j.framework.util.ClassUtil;
     
    /**
     * Created by jack on 2017/5/24.
     * 加载相应类的,帮助类
     */
    public final class HelperLoader {
        //初始化,加载类
        public static void init(){
            Class<?> [] classList = {ClassHelper.class, BeanHelper.class, IocHelper.class, ControllerHelper.class};
            for (Class<?> cls: classList) {
                ClassUtil.loadClass(cls.getName(),true);
            }
        }

    现在可以直接调用HelperLoader的init方法来加载这些Helper类了。实际上当我们第一次访问类时,就会加载static块,这里只是为了加载更加集中,所以写了这个加载类。

  • 相关阅读:
    java pojo类
    web(一)
    java通过配置文件(Properties类)连接Oracle数据库代码示例
    java数组排序(插入排序、冒泡排序、选择排序)与递归 代码示例
    匿名内部类
    java反射机制
    ubuntu安装kvm流程
    squid代理服务问答
    ftp nfs samba比较
    Samba服务问答
  • 原文地址:https://www.cnblogs.com/duan2/p/11749201.html
Copyright © 2020-2023  润新知