MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
Model(模型)表示应用程序核心(比如数据库记录列表)。是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。View(视图)显示数据(数据库记录)。是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。Controller(控制器)处理输入(写入数据库记录)。是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据
MVC从逻辑上把应用分为模型组件,视图组件和控制器组件。其中控制器组件又可以细分为:前端控制器组件和后端控制器组件。
MVC的基本工作流程:
首先是客户端(通常是浏览器)发出一个请求。第一个接受这个请求的组件一般是一个前端控制器。它将不同的请求交给不同的后端控制器来处理,而在后端控制器里面又可以调用相应的模型对象来处理具体的业务逻辑,最后再返回一个特定的视图响应给客户端。
第一个接受这个请求的前端控制器叫DispatcherServlet
后端控制器叫Controller
负责处理请求URL和后端控制器映射的叫HandMapping(它有多种类型,比较灵活,也是在一个xml文件上进行配置)
负责业务逻辑处理的模型对象一般也是我们平常写的DAO/DTO组件(只是它最后的返回更灵活,Controller返回一个ModelAndView对象给DispatcherServlet,ModelAndView可以携带一个视图对象,也可以携带一个视图对象的逻辑名。如果携带的是一个视图对象的逻辑名,那DispatcherServlet需要一个ViewResolver来查找用于渲染回应的视图对象。最后,DispatcherServlet将请求分派给ModelAndView对象指定的视图对象。视图对象负责渲染返回给客户的回应。)
跑一个最简单的例子,让大家对构建SpringMVC的基本步骤有个直观的认识
(1)建立动态web工程,导入spring的jar包。(2)配置DispatcherServlet
DispatcherServlet是SpringMVC的核心,将下面Servlet的注册信息登记在web.xml中
(3)编写Controller,做核心配置文件,并配置url和Controller的映射
上面可能有人奇怪,为什么不用id属性,而设置name属性。这里是因为URL中含有XMLid属性非法字符——特别是斜杠(/);
(4)配置一个视图解析器将控制器与JSP结合起来。
将解析器的配置片段加到上面的test-servlet.xml中
InternalResourceViewResolver在ModelAndView返回的视图名前加上prefix属性配置的前缀,再在最后加上suffix属性配置的后缀。如HelloController返回的ModelAndView中视图名为welcome,所以InternalResourceViewResolver将在/WEB-INF/jsp/welcome.jsp处查找视图。
(5)编写呈现给用户的jsp文件。
/WEB-INF/jsp/welcome.jsp
mvc中的映射关系HandlerMapping
springMVC里有个映射处理器(HandlerMapping)的概念。它实际上是一个处理器映射Bean,用来将一个控制器指定到一个URL上。Spring提供了三种有用的HandlerMapping的实现:
BeanNameUrlHandlerMapping根据控制器的名字将控制器映射到URLSimpleUrlHandlerMapping用上下文配置文件中定义的属性集合将控制器映射到URLCommonsPathMapHandlerMapping使用控制器代码中的元数据将控制器映射到URL
mvc中的试图解析器ViewResolver
springMVC里还有个视图解析器(ViewResolver)的概念。它决定了ModelAndView对象的逻辑视图名如何解析成一个用于将结果渲染给用户的视图Bean..Spring有四种ViewResolver实现:
InternalResourceViewResolver将逻辑视图名解析成一个用模板文件(如JSP和Velocity模板)渲染的视图对象BeanNameViewResolver将逻辑视图名解析成一个DispatcherServlet应用上下文中的视图BeanResourceBundleViewResolver将逻辑视图名解析成一个ResourceBundler中的视图对象XmlViewResolver从一个XML文件中解析视图Bean,这个文件是从DispatcherServlet应用上下文中分离出来的。