手写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. ...
随机推荐
- python打包工具distutils、setuptools的使用
python中安装包的方式有很多种: 源码包:python setup.py install 在线安装:pip install 包名(linux) / easy_install 包名(window) ...
- Appium Desired Capabilities-General Capabilities
Desired Capabilities are keys and values encoded in a JSON object, sent by Appium clients to the ser ...
- Linux系统管理常用命令
Linux系统管理常用命令 分类: Linux2011-01-10 18:26 1538人阅读 评论(0) 收藏 举报 linuxcommandservicenginxuserunix 目录(?)[+ ...
- springboot2.0入门(四)----mock模拟测试+单元测试
一.本节主要记录模拟测试.单元测试: 二.mock 测试 1.1什么是Mock? 在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象 ...
- HDU 6046 - hash | 2017 Multi-University Training Contest 2
思路来自题解和一些博客 最麻烦的是样例没啥用- - /* HDU 6046 - hash [ hash,鸽巢 ] | 2017 Multi-University Training Contest 2 ...
- nginx反向代理tomcat 时,出现https redirect后变成http的问题解决方法
需要修改两个配置 1.nginx配置 location / { proxy_pass http://test-server; proxy_set_header Host $host; proxy_se ...
- Java项目出现的问题--学习--SSM
01 反向工程正常运行但是没有出现应该有的包 进行反向工程时记得要刷新一下才能看到的 03 复制包只有当前目录的包,目录下的文件不包含 当sec下的包以hierarcical形式排布时复制只能复制当前 ...
- no suitable method found to override
no suitable method found to override http://bbs.csdn.net/topics/200001058
- plupload+上传文件夹
文件夹数据库处理逻辑 publicclass DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject(); ...
- OSI七层参考模型
一.OSI七层模型简述 二.每层的作用 三.数据封装的过程 四.数据解封的过程