SpringMVC核心源码解析(一)

传统的web编程

在了解SpringMVC源码之前,我们需先关注SpringMVC解决了什么问题,在原来的web编程中,我们会基于servlet实现web编程,我们简单回顾下,首先新建一个类实现HttpServlet

public class MyHttpServlet extends HttpServlet {

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   // 写逻辑
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    super.doGet(req, resp);
}

}
然后在web.xml文件对我们配置我们的类



HelloWorld
MyHttpServlet


    HelloWorld
    /MyHttpServlet 


简单介绍下它的工作流转,其实很简单就是通过我们配置的url-pattern找到servlet-name,再根据servlet-name找到我们继承HttpServlet的MyHttpServlet类,了解过web编程方式的读者们一定都知道,这种东西带来的开发效率太低,重复工作太多,并且代码结构混乱,难以维护,那么Spring又是如何解决这样的问题呢?

SpringMVC应用

相信大家对SpringMVC的应用都不太陌生,我们还是先简单用实例的方式介绍,创建一个UserController 类,然后加上注解@Controller

@Controller
public class UserController{

@RequestMapping("/home")
public String home(){
    return "home";
}

}
然后在web.xml配置


SpringMVC
org.springframework.web.servlet.DispatcherServlet

contextConfigLocation
classpath:spring-mvc.xml

1
true


SpringMVC
/

在新建一个spring-mvc.xml作为mvc的配置文件


xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">





    
        
        
            
                
                    text/html;charset=UTF-8
                    application/json;charset=UTF-8
                
            
        
    






当然这里还需要对Spring进行配置,对于Spring的文件配置就不说了,这里重点对SpringMVC进行描述,好了我们将一些SpringMVC必要的配置搞定后运行一下,在浏览器注入http://localhost:8080/user

通过运行结果我们可以看出我们的方法已经成功映射到了我们的url链接上,那么我们对比一下传统的Servlet和SpringMVC,随着业务的繁琐和复杂,你会发现传统的Servlet带来的问题,以及SpringMVC的便利,相信但凡是接触过这两者的区别的人都有所认同,那么SpringMVC是如何做到如此简便就完成了Servlet操作的呢?

SpringMVC原理

我们思考一下,在传统的Servlet中我们是通过创建不同的类来区分不同的url请求,如果采用SpringMVC后,只需要在方法或类上加上@RequestMapping()注解,就能实现对传统创建类的方式运转,这样的框架设计极其简化了在开发时候复杂操作,也符合项目分层设计,个人认为Spring的成功原因之一就在于此,好了废话了那么多,下面就简单介绍下SpringMVC设计的基本思路。

在SpringMVC之前,其实还有一种框架叫Struct,可能现在大家都没怎么接触这哥们儿了,但有些古董项目基于架构庞大,还是依旧采用的Struct,为什么会提到Struct呢?笔者认为Struct和我们传统的Servlet很像,都是基于配置和类进行关联,然后每一个Servlet都是一个单独的对象,举个例子我们系统有个登录接口,然后采用传统的Servlet或者Struct就会创建一个登录类然后配置映射到我们的url上,就像上文传统web编程的实例一样,然后Tomcat容器就会根据你的每一个类创建一个单独的Servlet,然后如果你有10个功能,那么就是十个Servlet,每一次访问、跳转、重定向其实对JVM来说都是不小的开销,因为总是存在对象创建和销毁。这个时候Spring看不下去了,Spring就推出了SpringMVC,后面Struct虽然出现了Struct2但依旧没有摆脱它原来带来的问题,甚至还出现了许多漏洞,SpringMVC就逐渐占领了市场,那么SpringMVC是怎样设计的呢?我们来看一张图

这里笔者详细介绍一下, 我们再次对比一下原生的Servlet配置和SpringMVC配置的web.xml

传统的Servlet配置


HelloWorld
MyHttpServlet


    HelloWorld
    /MyHttpServlet 

SpringMVC的web.xml配置信息


SpringMVC
org.springframework.web.servlet.DispatcherServlet

contextConfigLocation
classpath:spring-mvc.xml

1
true


SpringMVC
/

我们通过对比后可以看出,SpringMVC将一个普通的类org.springframework.web.servlet.DispatcherServlet和/映射,目的就是想通过自己创建的DispatcherServlet作为一个全局的Servlet,然后用这个全局的Servlet来匹配请求和方法,如果还不明白结合上面的图一起自行思考,那么SpringMVC通过这种方式就实现了Servlet单例的方式,因为所有请求都是同一个类DispatcherServlet作为Servlet处理请求,好了,本章内容结束,下一章节将对SpringMVC底层源码进行分析。

你可能感兴趣的:(SpringMVC核心源码解析(一))