Spring MVC全称是Spring Web MVC,是spring框架中的一部分,与struts一样是一个表现层框架。
Spring MVC是当前最优秀的MVC框架,自从Spring2.5版本发布后,由于支持注解配置,易用性有了大幅度的提高。Spring3.0更加完善,实现了对Struts2的超越。现在越来越多的开发团队选择了Spring MVC。
1、Spring MVC与Struts2对比!
- 加载机制:SpringMVC入口是servlet,Struts2入口是filter;servlet与filter区别
- 性能:SpringMVC优于Struts2
Struts2基于类设计,每次请求实例化一个action对象,对应一个request上下文;
SpringMVC基于方法设计,每次请求实例化一个方法对象,每个方法独享request上下文。 - 参数传递:
Struts2使用类变量接收参数,多个方法共享;
SpringMVC使用请求参数获取,方法独享 - 框架继承:spring MVC和Spring是无缝(无缝:无须数据格式转换,直接访问来自数据源数据格式)的。从这个项目的管理和安全上也比Struts2高。
- 拦截机制:spring mvc用的是独立的AOP方式实现,而struts2有自己的interceptor机制,这样导致了struts2的配置文件量又比spring mvc大。
- Restful架构实现:
spring mvc用的是独立的AOP方式实现,而struts2有自己的interceptor机制,这样导致了struts2的配置文件量又比spring mvc大;
spring mvc用的是独立的AOP方式实现,而struts2有自己的interceptor机制,这样导致了struts2的配置文件量又比spring mvc大。
2、SpringMVC运行流程
- 用户发送请求至前端控制器DispatcherServlet
- DispatcherServlet收到请求调用HandlerMapping处理器映射器查找Handler。
- 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
- HandlerAdapter调用处理器Handler
- Handler执行完成返回ModelAndView
- HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器,ViewReslover根据逻辑视图名解析View
- ViewReslover返回View
- DispatcherServlet对View进行渲染视图(即将模型数据填充至request域)。
- DispatcherServlet响应用户
从以上流程可以看出几个主要的部件:
- 前端控制器DispatcherServlet(SpringMVC提供)
作用:接收请求,相应结果
有了前端控制器减少各各组件之间的耦合性,前端控制器相关于中央调度器 - 处理器映射器HandlerMapping(SpringMVC提供)
作用:根据url查找Handler,比如:根据xml配置、注解方式查找Handler - 处理器适配器HandlerAdapter(SpringMVC提供)
作用:执行Handler
不同类型的Handler有不同的HandlerAdapter,好处可以通过扩展HandlerAdapter支持更多类型的Handler。 - 处理器Handler(由程序员开发)
作用:业务处理
实现开发中又称为controller即后端控制器
Handler的开发按照HandlerAdapter的接口规则去开发。
Handler处理后的结果是ModelAndView,是springmvc的底层对象,包括Model和view两个部分。view中只包括一个逻辑视图名(为了方便开发起一个简单的视图名称)。 - ViewReslover视图解析(springmvc框架提供)
作用:根据逻辑视图名创建一个View对象(包括真实视图物理地址)
针对不同类型的view有不同类型的ViewReslover,常用的有jsp视图解析器即jstlView - View视图(由程序员开发)
作用:将模型数据填充进来(将model数据填充到request域)显示给用户
view是一个接口,实现类包括:jstlView、freemarkerView,pdfView
3、案例搭建
使用maven构建基本工程结构
3.1 创建web项目
3.2 设置jdk版本及servlet环境
细节参见Maven学习与基本使用
3.3 导入jar包,设置pom
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
3.4 配置前端控制器
关键:在web.xml配置springmvc的前端控制器
1 | <?xml version="1.0" encoding="UTF-8"?> |
3.5 配置处理器映射器
在3.4设置的地址下新建对应的xml文件,一般在classpath下新建springmvc.xml
在springmvc.xml中配置处理器映射器。(有多种)
1 | <?xml version="1.0" encoding="UTF-8"?> |
3.6 配置处理器适配器
开发Handel必须按照处理器适配器接口规则去开发,先要确定使用哪个处理器适配器。
此处使用SimpleControllerHandlerAdapter。
1 | <!-- 处理器适配器 --> |
通过源码分析得出:1
2
3public boolean supports(Object handler) {
return (handler instanceof Controller);
}
只要实现了Controller接口的bean,SimpleControllerHandlerAdapter都可以去执行。
还有一个非注解适配器HttpRequestHandlerAdapter,只要实现HttpRequestHandler接口即可。
3.7 开发及配置Handel
1 | public class ItemsController1 implements Controller { |
3.8 配置视图解析器
使用jsp视图解析器,在springmvc.xml中配置如下:
1 | <!-- ViewResolver --> |
更改Handle代码,使用逻辑视图名:
1 | //指定视图地址 |
3.9 配置jsp视图
在web-inf/jsp下,创建itemList.jsp
4、注解开发
4.1 注解的处理器映射器和适配器
注解的处理器映射器:
spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
注解的处理器适配器:
spring3.1之前使用
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
3.1之后使用
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
在springmvc.xml中配置:
1 | <!-- 注解的处理器映射器和适配器 --> |
4.2 注解开发Handle
注解处理器映射器和注解处理器适配器要配对使用,对标记@controller注解类中的标记有@RequestMapping方法进行映射和执行。
@controller标记此类是一个控制器
@RequestMapping:对url和Handler中的方法进行映射。
1 |
|
4.3 在spring容器中配置Handle
为方便配置,采用注解扫描的方式。
1 | <!-- 可以扫描标记有@controller、@service、@repository、@component的bean --> |