MVC 框架提供了模型-视图-控制的体系结构和可以用来开发灵活、松散耦合的 web 应用程序的组件。MVC 模式导致了应用程序的不同方面(输入逻辑、业务逻辑和 UI 逻辑)的分离,同时提供了在这些元素之间的松散耦合。
springMvc学习笔记_xml

Spring MVC是当前最优秀的MVC框架,自从Spring 2.5版本发布后,由于支持注解配置,易用性有了大幅度的提高。Spring 3.0更加完善,实现了对Struts 2的超越。现在越来越多的开发团队选择了Spring MVC。

Struts2也是非常优秀的MVC构架,优点非常多比如良好的结构,拦截器的思想,丰富的功能。但这里想说的是缺点,Struts2由于采用了值栈、OGNL表达式、struts2标签库等,会导致应用的性能下降,应避免使用这些功能。而Struts2的多层拦截器、多实例action性能都很好。可以参考我写的一篇关于Spring MVC与Struts2与Servlet比较的文章《Struts2、SpringMVC、Servlet(Jsp)性能对比 测试》。
一、springMVC 的介绍
spring MVC是一种基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动的,也就是使用请求-响应模型,框架的目的就是帮助我们简化开发
特点:

  1. SpringMVC为展现层提供的基于MVC设计理念的优秀WEB框架,是目前最主流的MVC框架之一。
  2. Spring3.0之后全面超越Struts2,成为最优秀的MVC框架。
  3. SpringMVC通过一套MVC注解,让POJO成为处理请求的控制器,而无须实现任何接口。
  4. 支持RESTFUL风格的URL请求。
  5. 采用了松散耦合可插拔组件结构,比其他MVC框架更具扩展性和灵活性

二、通过HelloWrold实例详细介绍
<1>导包
springMvc学习笔记_技术_02
<2>添加Web.xml配置文件中关于SpringMVC的配置

<servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup> 
  </servlet>

  <servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      <url-pattern>/</url-pattern>
  </servlet-mapping>

<3>在src下创建springmvc.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">                    

    <!-- scan the package and the sub package -->
    <context:component-scan base-package="test.SpringMVC"/>
    <!-- don't handle the static resource -->
    <mvc:default-servlet-handler />
    <!-- if you use annotation you must configure following setting -->
    <mvc:annotation-driven />
    <!-- configure the InternalResourceViewResolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
            id="internalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/jsp/" />
        <!-- 后缀 -->
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

<4>在WEB-INF文件夹下创建名为jsp的文件夹,用来存放jsp视图。创建一个hello.jsp,在body中添加“Hello World”.
<5>编写Controller代码

@Controller
public class mvcController {

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

打开浏览器输入: http://localhost:8080/项目名/helloworld 。这样就完成了一个helloworld 的案例。接下来我们详细解释一下原理。

原理详解

Dispatcherservlet
Spring Web 模型-视图-控制(MVC)框架是围绕 DispatcherServlet 设计的,DispatcherServlet 用来处理所有的 HTTP 请求和响应。Spring Web MVC DispatcherServlet 的请求处理的工作流程如下图所示:
springMvc学习笔记_技术_03

下面是对应于 DispatcherServlet 传入 HTTP 请求的事件序列:
收到一个 HTTP 请求后,DispatcherServlet 根据 HandlerMapping 来选择并且调用适当的控制器。
控制器接受请求,并基于使用的 GET 或 POST 方法来调用适当的 service 方法。Service 方法将设置基于定义的业务逻辑的模型数据,并返回视图名称到 DispatcherServlet 中。
DispatcherServlet 会从 ViewResolver 获取帮助,为请求检取定义视图。
一旦确定视图,DispatcherServlet 将把模型数据传递给视图,最后呈现在浏览器中。
上面所提到的所有组件,即 HandlerMapping、Controller 和 ViewResolver 是 WebApplicationContext 的一部分,而 WebApplicationContext 是带有一些对 web 应用程序必要的额外特性的 ApplicationContext 的扩展。

这里结合源码和图分析:

springMvc学习笔记_spring_04

1. 当一个请求(request)过来,进入DispatcherServlet中,里面有个方法叫 doDispatch方法 里面包含了核心流程
springMvc学习笔记_spring_05

我们看try里第一行mapperHandler是 HandlerExecutionChain (处理器调用链) 类。下面是获得 HandlerExecutionChain对象
springMvc学习笔记_spring_06

如下,如果经过noHandlerFound方法,表示没有找到页面,如果存在映射,则执行HandlerAdapter(Handler适配器)
springMvc学习笔记_spring_07
这里呢 底层 调用了拦截器的 PreHandle方法,如图:
springMvc学习笔记_spring_08
继续执行,下面ModelAndView,如果所示.
springMvc学习笔记_xml_09

这里 调用了 拦截器的 PostHandler方法 ,然后调用 ProcessDispatchResult方法。
进入 ProcessDispatchResult方法:
springMvc学习笔记_技术_10
接下来:
springMvc学习笔记_xml_11
进入render这里就是已经在渲染视图了render() 方法:
springMvc学习笔记_spring_12
这里通过在applicationcontext.xml中配置的视图解析器 进行了引用 然后将页面进行了转发,这样流程就完了。
大家可以根据上边的流程图和源码分析。