一.引言
在java体系中,说起架构,spring不可不谈,而它的一个子产品-springMVC在web开发中有着举足轻重的地位。由于spring不在讲解之列,就默认大家已经知晓。
二.架构
对于springmvc架构,相信很多人都有自己的一套理解。但是都绕不过HttpServlet这个类。那也就是说springmvc是一个servlet。先看一下该类的继承层次。
httpServlet 集成GenericServlet这个类。servlet容器启动的时候,会调用GennericServlet类的init方法来完成容器的初始化。springmvc也是采用这种方法,当然pmvc也是如此。在韩哥的《看透springMvc源代码分析与实践》书中,对springmvc的架构图描述如下:
看懂了上图,对springmvc的理解也就差不多了。顺着这个图,大致讲解一下springmvc的请求流程吧!
步骤:
1.获取请求
2.根据请求获得处理器
3.如果没有找到 抛出notfound异常
4.找到先执行拦截器的preHandler方法
5.处理请求
6.执行拦截器的postHandler方法
7.处理视图
8.执行拦截器的afterCompletion方法
9.发布,释放资源
三.pmvc简介
pmvc是一个简版的mvc学习框架。目前还没有做视图这块的逻辑。请求,拦截器,响应等功能均可正常使用。
client : 使用pmvc框架示例代码,可理解为demo。
core: pmvc的核心代码.包括请求转发,字段赋值,方法调用.......
四.pmvc使用介绍
4.1基础配置
pmvc目前是基于web.xml配置
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>com.pmvc.framework.core.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> //指定servlet参数,通过这个名字拿到配置文件 <param-value>classpath:pmvc.properties</param-value> //定义配置文件路径位置这里用的是properties文件 </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> //拦截所有请求 </servlet-mapping>
pmvc.properties放在resource资源文件下。
scan-package=com.client
注:读取文件基于scan-package属性名称,不可写错。等号右边指定包名。
通过@Controller注解标注类是控制层;
通过@Service注解标注类是服务层;
通过@Param注解指定前端请求的字段名;
通过@RequestMapping注解指定前端请求的路径;
4.2拦截器的使用
通过@RequestInterceptor可以指定拦截器的名称和拦截的请求路径,然后实现HttpRequestInterceptor接口的preHandler和afterHandler方法。
@com.pmvc.framework.anno.RequestInterceptor(name = "carInterceptor", url = {"car/getAll"}) //url是数组类型,可以拦截多个路径 public class CarInterceptor implements HttpRequestInterceptor { private final static Logger LOGGER = LoggerFactory.getLogger(CarInterceptor.class); @Override public boolean preHandler(HttpServletRequest request, HttpServletResponse response, Map map) { LOGGER.info(String.format("request[{}] enter PersonInterceptor!", request.getRequestURI())); return true; } @Override public <T> T afterHandler(HttpServletRequest request, HttpServletResponse response, Map map) { LOGGER.info(String.format("request[{}] left PersonInterceptor!", request.getRequestURI())); return null; } }
五.小结
pmvc是一个通过springmvc源码抽离出来的简版mvc框架,实现了基础的mvc功能(当然还有很多功能尚未实现)。作为一个springmvc学习框架,相信掌握它对理解springmvc运行机制非常有用。其中大量使用了注解,提供java高级特性的参考示例。
六.题外话
内部有诸多不完善的地方,还望各位多多指教!
码云:https://gitee.com/YiHaiFeng/pmvc.git