调戏源码之Spring MVC(三)

调戏源码之Spring MVC(三)

前面花两篇文章分析了SpringMVC的源码,其实很多东西都只是皮毛.接下来尝试手写SpringMVC以在这个过程中加深对源码的理解.
先来回顾下SpringMVC的步骤:
1. 获取HandlerExecutionChain对象;
2. 通过HandlerAdapter执行真正的Handler获得ModelAndView对象;
3. 用ViewResolver将逻辑视图解析成View视图对象;
4. 渲染视图.

环境搭建

前面已经说了,SpringMVC是基于Servlet实现的.我们就创建一个MyDispatcherServlet对象来当作t前端控制器吧!

public class MyDispatcherServlet extends HttpServlet{
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        doDisPatch(req,res);
    }

    private void doDisPatch(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
            //1.获取HandlerExecutionChain对象;
            //2.通过HandlerAdapter执行真正的Handler获得ModelAndView对象; 
            //3.用ViewResolver将逻辑视图解析成View视图对象;
            //4.渲染视图.
        RequestDispatcher dispatcher = req.getRequestDispatcher("test.jsp");    // 使用req对象获取RequestDispatcher对象
        dispatcher.forward(req, res); 
    }
}

在web.xml中配置MyDispatcherServlet:

<servlet>
    <servlet-name>myDisPatcher</servlet-name>
    <servlet-class>my_mvc.MyDispatcherServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>myDisPatcher</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

test.jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    这是test.jsp页面
</body>
</html>

启动Tomcat打开浏览器输入http://localhost:8080/my_mvc/as.action即可看到页面显示文字”这是test.jsp页面”.这里的as.action可以随便写,只要以.action结束就行.
到目前为止,还只是实现Servlet拦截请求执行doDispatch方法.接下来就是在doDisPatch方法中获得HandlerExecutionChain对象啦!

获取Handler

源码doDisPatch中,通过本类getHandler获取HandlerExecutionChain对象.该对象包行Handler和拦截器.既然手写,未免去麻烦,我们就忽略拦截器吧!

// Determine handler for the current request.
mappedHandler = getHandler(processedRequest);

《调戏源码之Spring MVC(三)》
要用注解实现,我们的目标是拿到DefaultAnnotationHandlerMapping对象.持续追踪getHandler方法最终来到AbstractUrlHandlerMapping类的getHandlerInternal方法.其中两行代码就是获取Handler的关键:

String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);
Object handler = lookupHandler(lookupPath, request);

1. 截取Url获得lookupPath;
2. 通过lookupPath和request获得Handler

先说lookupPath吧,lookupPath最终是一个”/*.action”,所以只要以”/”开始截取Url字符串就行了.

String requestURI = req.getRequestURI();
String lookupPath = requestURI.substring(requestURI.lastIndexOf("/"));

然后就是根据lookupPath来匹配了,看看源码是怎么做的:
《调戏源码之Spring MVC(三)》
最后返回时调用了buildPathExposingHandler方法,它就是用handlerName初始化了一个HandlerExecutionChain对象.不用管他.我们只要handler对象.

    原文作者:Spring MVC
    原文地址: https://blog.csdn.net/guitarrain/article/details/78012343
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞