一、Spring Web MVC简介
1.1、MVC模式简介
*M-Model模型
模型(Model)的职责是负责业务逻辑。包含两层:业务数据和业务处理逻辑。比如实体类、DAO、Service都属于模型层。
*V-View视图
视图(View)的职责是负责显示界面和用户交互(收集用户信息)。属于视图的组件是不包含业务逻辑和控制逻辑的JSP。
*C-Controller控制器
控制器是模型层M和视图层V之间的桥梁,用于控制流程比如:在Servlet项目中的单一控制器ActionServlet。
1.2、什么是Spring Web MVC
Spring Web MVC是spring框架一个非常重要的功能模块。实现了MVC结构,便于简单、快速开发MVC结构的web程序。Spring Web MVC提供的API封装了web开发中常用的功能,简化了web过程。
1.3、Spring Web MVC的核心组件
Spring Web MVC提供了M、V和C相关的主要实现组件,具体如下
*DispatcherServlet(控制器,请求入口)
*HandlerMapping(控制器,请求派发)
*Controller(控制器,请求处理流程)
*ModelAndView(模型,封装业务处理结果和视图)
*VeiwResolver(视图,视图显示处理器)
1.4、Spring Web MVC的处理流程
Spring Web MVC的主要处理流程如下
*浏览器向Spring发出请求,请求交给前段控制器DispatcherServlet处理。
*控制器通过HandlerMapping找到相应的Controller组件处理请求。
*执行Controller组件约定方法处理请求,在约定方法调用模型组件完成业务处理。约定方法可以返回一个ModelAndView对象,封装了处理结果数据和视图名称信息。
*控制器接收ModelAndView之后,调用V诶我Resolve让自己,定位View(JSP)并传递数据信息,生成响应界面结果。
二、基于XML配置的MVC应用
2.1、搭建Spring Web MVC环境
搭建Spring Web MVC开发环境的主要步骤如下
*创建Web工程,导入Spring Web MVC相关开发包
例如 Spring API、Web、webmvc等开发包
*在src下添加Spring的XML配置文件
名称可以自定义,例如spring-mvc.xml
*在web.xml中配置DispatcherServlet前段控制器组件
DispatcherServlet组件在spring mvc中已提供,只需要配置即可。
配置DispatcherServlet时,同时指定xml配置文件。
2.2、DispatcherServlet控制器配置
2.3、HandlerMapping组件
通过HandlerMapping组件,DispatcherServlet控制器可以将客户HTTP请求映射到Controller组件上。
*SimpleURLHandlerMapping
维护一个HTTP请求和Controller映射关系列表(map),根据列表对应关系调用Controller。
*RequestMappingHandlerMapping
RequestMappingHandlerAdapter
在Controller类和方法使用@RequestMapping注解指定对应的客户HTTP请求(后续注解配置部分将信息介绍)。
2.4、Controller组件
Controller组件负责执行具体的业务处理,可调用DAO等组件,编写时需要Controller借口及约定方法。
2.5、ModelAndView组件
Controller组件约定的HandlerMapping方法执行后返回一个ModelAndView对象,该对象可封装模型数据和视图名响应信息。ModelAndView构造器如下
ModelAndView(string viewName)
ModelAndView(String viewName,Map model)
viewName是jsp页面的名字
model的数据存储到request的attribute中
2.6、ViewResolver组件
所有Controller组件都返回一个ModelAndView实例,封装了视图名。Spring中的视图一名字为标识,视图解析器ViewResolver通过名字来解析视图。
Spring提供了多种视图解析器,具体如下
InternalResourceViewResolver使用实例如下
如:视图名hello通过以上配置可以映射到/WEB-INF/jsp/hello.jsp
三、基于注解配置的MVC应用
3.1、@RequestMapping注解应用
@RequestMapping可以用在类定义和方法定义上。
@RequestMapping标记这个类或方法与哪一个客户请求对应
@Controller @RequestMapping("day01") public class HelloController{ @RequestMapping("/hello.form") public String execute() threws Exeception{ return "hello"; } }
*开启@RequestMapping注解映射,需要在Spring的XML配置文件中定义RequestMappingHandlerMapping(类定义前)和RequestMappingHandlerMapping(方法定义前)两个bean组件。
RequestMappingHandlerMapping和RequestMappingHandlerAdapter两个bean组件定义示例
从spring3.2版本开始可以使用下面xml配置简化
RequestMappingHandlerMapping和RequestMappingHandlerAdapter定义
<mvc:annotation-driven/>
3.2、@Controller注解应用
推荐使用@Controller注解声明Controller组件,这样可以使得Controller定义更加灵活,可以不用实现Controller接口,请求处理的方法也可以灵活定义。
@Controller @RequestMapping("/day01") public class HelloController{ @RequestMapping("/hello.form") public String execute() throws Exception{ return "hello"; } }
为了使@Controller注解生效,需要在Spring的xml配置文件中开启组件扫描定义,并指定Controller组件所在的包。
<context:component-scan base-package="com.tarena.controller"/>