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块,这里只是为了加载更加集中,所以写了这个加载类。