一、 MVC模型:
MVC是一种软件开发模式。遵循MVC开发模式的WEB应用程序把一个应用的输入、处理、输出流程按照Model、View、Controller的方
式进行分离,这样一个应用被分成了三个层——模型层、视图层、控制层。
1)Model(模型):表示业务数据和业务处理。对于Java Web应用来说,模型主要是由JavaBean来充当。
2)View(视图):负责进行模型的展示,一般就是用户看到并与之交互的页面。对于Java Web应用来说,视图主要由JSP来充当。
3)Controller(控制器):接受用户请求,委托给模型进行处理,处理完毕后把返回的模型数据返回给视图,由视图展示。对于Java
Web应用来说,控制器主要有Servlet来充当。
二、 Spring MVC
Spring MVC是一种基于Java实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,使用了MVC架构模型的思想,将Web层进行职责解耦。基于驱动指的是使用请求—响应模型。
1、核心类与接口
1)DispatcherServlet:前端控制器;
2)HandlerMapping接口:处理请求的映射,它有两实现类:HandlerMapping和SimpleUrlhandlerMapping,分别是通过配置文件和注
解,把一个URL映射到Controller类上。
3)HandlerAdapter接口:处理请求的映射,有实现类AnnotationMethodHandlerAdapter,该类通过注解,把一个URL映射到Controller类
的方法上
4)Controller接口:控制器
5)HandlerInterceptor接口:拦截器,由程序员实现这个接口,来完成拦截工作
6)ViewResolver接口:视图解析器,其实现类UrlVaseViewResolver通过配置文件,把一个视图名交到一个view来处理;
InternalResourceViewResolver类比上面的类添加了JSTL支持
7)HandlerExceptionResolver接口:异常处理,有一实现类SimpleMappingExceptionResolver
2、处理请求的流程
1)用户发送请求—>前端控制器,前端控制器根据请求信息来决定选择哪个页面控制器进行处理并把请求委托给他
2)页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在Spring MVC中叫命令对象,
并进行验证,然后命令对象委托给业务对象进行处理,处理完毕后返回一个ModelAndView(模型数据和逻辑视图名)
3)前端控制器回收控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染。
4)前端控制器再次回收控制权,将响应返回给用户。
3、核心框架的具体流程:
1)用户发送请求—>DispatcherServlet(前端控制器),前端控制器收到请求后自己不进行处理,而是委托给其他解析器进行处
理,作为统一访问点,进行全局的流程控制。
2)DispatcherServlet—>HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象,
多个HandlerInterceptor拦截器),通过这种策略模式,很容易添加新的映射策略
3)DispatcherServlet—>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模
式的应用,从而很容易支持很多类型的处理器
4)HandlerAdpter—>处理器功能处理方法的调用,HandlerAdapter将会根据设配的结果调用真正的处理器功能处理方法,完成功能处
理,并返回一个ModelAndView对象。
5)ModelAndView的逻辑视图名—>ViewResolver,ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换
其它视图技术
6)View—>渲染,View会根据传进来的Model模型数据进行渲染,此处Model实际是一个Map数据结构,因此很容易支持其它视图技
术
7)返回控制权给DispatcherServlet,用DispatcherServlet返回响应给用户
三、 入门例子
1、创建Web工程并添加jar包
注:commons-logging、jstl并不属于spring配置包里
2、在web.xml中配置前端控制器(DispatcherServlet)
<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:spring_mvc.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>
<servlet-name>表示相应配置文件的名字,而配置文件的位置在<init-param>中的<param-value>中配置,如果我们不配置<init-param>时,
spring会自动的在web应用的WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml的配置文件。比如我这里不配置<init-param>,那spring
会在WEB-INF文件夹下寻找sprigMVC-servlet.xml。
<load-on-startup>表示在容器启动时初始化Servlet,其值表示初始化的顺序。
<url-pattern>表示哪些请求交给spring MVC处理,用“/”来定义默认的Servlet映射。
3、在src下创建spring_mvc.xml
1)添加命名空间
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
</beans>
2)定义视图解析器viewResolver
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
prefix和suffix分别表示查找视图的前缀和后缀,如我们逻辑视图“helloWorld”,那么该视图是“/”目录下的helloWorld.jsp
3)编写处理器/页面控制器:创建controller包,包下有SpringController类
package controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
publicclass SpringControllerimplements Controller{
public ModelAndView handleRequest(HttpServletRequest arg0,
HttpServletResponse arg1)throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("message","spring MVC");
mv.setViewName("/helloWorld");
return mv;
}
这里SpringController实现了Controller,Controller有一个方法ModelAndView handleRequest(),用于实现相应的功能。ModelAndView
包含了视图要实现的数据模型和逻辑视图名,这里用addObject()和setViewName()两个方法将值注入。
4)配置springController Bean,将其交给spring容器管理。
<beanname="/helloWorld"class="controller.SpringController"/>
5)创建视图页面helloWorld.jsp
<body>
$(message)
</body>
6)开启服务器,在浏览器中输入:http://localhost:8080/springMVC/helloWorld
此时helloWorld.jsp页面输出spring MVC