手写web框架之加载Controller,初始化框架
1,加载Controller
     我们需要创建 一个ControllerHelper类,让它来处理下面的逻辑:
      通过ClassHelper我们可以获取所有定义了Controller注解的类,可以通过反射获取该类中所有带有Action注解的方法,获取Action注解中的请求表达式,进而获取请求方法与请求路径,封装一个请求对象(Request)和处理对象(Handler),最后将Request与Handler建立一个映射关系,存入一个Action Map中,并提供一个可以根据请求方法与请求路径获取处理对象的方法。
package org.smart4j.framework.helper; import org.smart4j.framework.annotation.Action;
import org.smart4j.framework.bean.Handler;
import org.smart4j.framework.bean.Request;
import org.smart4j.framework.org.smart4j.framework.util.ArrayUtil;
import org.smart4j.framework.org.smart4j.framework.util.CollectionUtil; import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Set; /**
* Created by liangboqun on 2017/5/24.
*/
public final class ControllerHelper {
/**
* 用于存放请求与处理器的映射关系(简称Aciotn Map)
*/
private static final Map<Request,Handler> ACTION_MAP = new HashMap<Request, Handler>();
static {
/**
* 获取所有的Controller类
*/
Set<Class<?>> controllerClassSet = ClassHelper.getControllerClassSet();
if (CollectionUtil.isNotEmpty(controllerClassSet)){
//遍历这些Controller
for (Class<?> controllerClass : controllerClassSet) {
//获取Controller类中定义的方法
Method [] methods = controllerClass.getDeclaredMethods();
if (ArrayUtil.isNotEmpty(methods)){
//遍历Controller类中的方法
for (Method method : methods) {
//判断当前方法是否有Action注解
if (method.isAnnotationPresent(Action.class)){
//从Action注解中获取URL映射规则
Action action = method.getAnnotation(Action.class);
String mapping = action.value();
//验证URL映射规则
if (mapping.matches("\\w+:/\\w*")){
String [] array = mapping.split(":");
if (ArrayUtil.isNotEmpty(array) && array.length ==2){
//获取请求方法与请求路径
String requestMethod = array[0];
String requestPath = array[1];
Request request = new Request(requestMethod,requestPath);
Handler handler = new Handler(controllerClass,method);
//初始化Action Map
ACTION_MAP.put(request,handler);
}
}
}
}
}
}
}
}
/**
* 获取Handler
*/
public static Handler getHandler(String requestMethod,String requstPath){
Request request = new Request(requestMethod,requstPath);
return ACTION_MAP.get(request);
}
}
可见,我们在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块,这里只是为了加载更加集中,所以写了这个加载类。
手写web框架之加载Controller,初始化框架的更多相关文章
- [jQuery插件]手写一个图片懒加载实现
		教你做图片懒加载插件 那一年 那一年,我还年轻 刚接手一个ASP.NET MVC 的 web 项目, (C#/jQuery/Bootstrap) 并没有做 web 的经验,没有预留学习时间, (作为项 ... 
- 一起写一个Android图片加载框架
		本文会从内部原理到具体实现来详细介绍如何开发一个简洁而实用的Android图片加载缓存框架,并在内存占用与加载图片所需时间这两个方面与主流图片加载框架之一Universal Image Loader做 ... 
- web.xml的加载过程配置详解
		一:web.xml加载过程 简单说一下,web.xml的加载过程.当我们启动一个WEB项目容器时,容器包括(JBoss,Tomcat等).首先会去读取web.xml配置文件里的配置,当这一步骤没有 ... 
- web.xml文件加载顺序
		1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ... 
- web.xml组件加载顺序
		在配置项目组件的过程中, 了解Tomcat加载组件顺序很有必要. 例如某些框架如Quartz的集群功能需要数据库的支持, 数据库的加载肯定要在框架组件加载之前. 经过查阅和Debug发现, web.x ... 
- Spring 加载Controller逻辑的源码笔记
		org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#initHandlerMethods 进行加载Controll ... 
- web相关文件加载顺序
		WEB相关文件的加载顺序 一. 1.启动一个WEB项目,WEB容器会先去读取它的配置文件web.xml,读取<context-param>和<listener>两个节点. ... 
- JavaSE 手写 Web 服务器(二)
		原文地址:JavaSE 手写 Web 服务器(二) 博客地址:http://www.extlight.com 一.背景 在上一篇文章 <JavaSE 手写 Web 服务器(一)> 中介绍了 ... 
- ASP.NET Ajax 客户端框架未能加载、"Sys"未定义
		在Windows Server 2003 系统上部署asp.net项目出现以下问题: IIS为6.0 导致菜单控件的图片显示不出来: WebSite:程序中的图片显示正常. 但用到ASP.net 2. ... 
随机推荐
- oracle exp 导出前执行分析计划
			记录一下小小问题: 当作为一个dmp 库导出的时候.如果我们在之前进行 对用户下的所有表进行分析. 那么在导入的时候 会连同分析计划数据一并导入 imp 导入dmp文件报错 IMP-00017: ... 
- TensorFlow 拾遗
			1..Here None in placeholder means that a dimension can be of any length. 2.. 3.. 4.. 5.. tf.mul ... 
- linux程序编译过程
			大家肯定都知道计算机程序设计语言通常分为机器语言.汇编语言和高级语言三类.高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类 ... 
- BZOJ 2527 [Poi2011]Meteors (整体二分+树状数组)
			整体二分板题,没啥好讲的-注意是个环-还有所有贡献会爆longlong,那么只要在加之前判断一下有没有达到需要的值就行了- CODE #include <set> #include < ... 
- git + idea  配置   github设置ssh免登陆方式提交拉取代码
			1.下载安装git,官网:https://git-scm.com/download/win 安装默认配置安装 git2.20版本地址百度网盘地址: 链接:https://pan.baidu.com/ ... 
- 题解 【NOIP2003】神经网络
			[NOIP2003]神经网络 Description 问题背景: 人工神经网络( Artificial Neural Network )是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷 ... 
- PHP mysqli_info() 函数
			定义和用法 mysqli_info() 函数返回有关最近执行查询的信息. 该函数作用于下列查询类型: INSERT INTO...SELECT... INSERT INTO...VALUES (... ... 
- @Autowired   @Primary @Qualifier
			1 2 3 4 5 
- 【java设计模式】-06原型模式
			原型模式简述 定义: 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象 ,也就是通过复制现有对象实例产生新的对象,也就是所谓的"克隆" 实现方式: 1.实现Cl ... 
- php原生导出简单word表格(TP为例) (原)
			后台: # 菲律宾名单word导出 public function export_word(){ $tids = $_GET['tids']; $userinfo=M("philippi ... 
