概述
web应用一般都运行于web容器中,比如Tomcat服务器,Spring MVC框架定义了一个Servlet叫DispatcherServlet,
传统的做法就是在web.xml配置文件中将该Servlet配置到Servlet容器中,并拦截所有的请求/或者/*。
我自定义了一个Servlet,拦截所有的请求,它继承HttpServlet,重写了父类GenericServlet的init(),做一些初始化的工作;重写了HttpServlet的service(),完成请求的分发,功能类似Spring MVC的DispatcherServlet,但是没有它那么强大。项目地址在这里。
- 初始化并缓存所有处理器
- 拦截所有请求
- 静态资源特殊处理
- 请求分发
初始化并缓存所有处理器
通过Servlet的init()初始化项目中所有的控制器类,并把它们缓存在一个Map中,key是URI,value是封装了处理该URI的处理器类、方法等信息。
拦截所有请求
在自定义的DispatcherServlet类上使用Servlet 3.0的@WebServlet注解,并指定urlPatterns属性,值为/或者/*,多说一句,查阅资料发现,/和/*其实表示的意思是一样的,都表示任意的URL,Servlet的urlPattern不是简单的通配符,也不是正则表达式,而是具有自己的匹配规则。
静态资源特殊处理
判断请求是否为静态资源,项目中直接判断URI是否为/,如果是,将返回根目录下的index.html文件
请求分发
根据请求的URI,在处理器缓存中查找对应的处理器,如果找不到,则返回404,如果找到了,就利用反射机制,让处理器类的实例来处理请求,最后将结果使用fastjson做序列化并响应请求。