手写springmvc--PMVC

一.引言

      在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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值