目录
一、传统MVC模式
既然要了解SpringMVC,就应该了解MVC架构的模型。其架构图如下:
该图大致描述了MVC的运行流程:
- 用户通过在view视图上操作产生事件;
- 事件经过controller控制层进行处理,也可以直接请求model模型层;
- 接受控制层的处理操作模型层,或者通过模型层来反向影响控制层;
- 最后更新视图层事件。
也可以看下图来更直观的感受MVC各个模块的功能:
二、SpringMVC对MVC的改变以及封装
SpringMVC对MVC改动的大致流程图:
可以清楚地看到SpringMVC通过一个自己写的Servlet来做中转,从而延续到框架的其他的功能。接下来大致分析一下各个流程所对应的显式配置。
1.servlet-name的配置注入
那么从(一)SpringMVC集成原理解析之项目搭建文章中的配置流程来看,配置完jar包后,在web.xml文件中配置的如下代码,就对应了图中servlet-name的配置注入:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
可以看到这个配置是非常常规的Servlet应用配置,因此DispatcherServlet初步可以推断为其就是Servlet的实现子类。
2.编写的@Controller注解类
@Controller
@RequestMapping(path = "/")
public class TestController {
@Autowired
private TestService testService;
@RequestMapping(path = "/test")
public String getTestPage() {
System.out.println("test");
return "/WEB-INF/views/test";
}
@RequestMapping(path = "/")
public String defaultMethod() {
System.out.println("hello");
testService.testPrint();
return "hello";
}
@RequestMapping(path = "/json")
@ResponseBody
public JsonDto jsonTest() {
JsonDto jsonDto = new JsonDto();
jsonDto.setResultCode("0");
jsonDto.setMessage("success");
System.out.println("jsonDto:" + jsonDto);
return jsonDto;
}
}
可以看到其中的大部分方法就是有一个请求URL路径,然后返回了指定的路径String,此过程我们可以看做图中2-5的流程。
3.指定ViewResolver
再接着看spring-mvc.xml文件中的配置:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="suffix" value=".html"/>
</bean>
其就对应了步骤6,对视图的解析,从而判断具体要返回到哪个视图上。
至此,SpringMVC的大致流程就走完了,相较于普通的servlet开发每增加一个serlvet都需要指定servlet-name和servlet-mapiing,SpringMVC对该流程进行了封装,使MVC开发模式更加简单便捷。