概述
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
做序列化并响应请求。