开发步骤:
- 在web.xml文件中定义Spring 的前端控制器DispatcherServlet来拦截用户请求.web应用是基于请求/响应架构的应用,不管哪个MVC Web框架,都需要在web.xml中配置该框架的核心控制器Servlet或Filter,这样才能让框架介入web应用中。
- 如果需要以post方式提交请求,则需要定义包含表单数据的jsp。如果是以get方式发送请求,则无须。
- 定义处理用户请求的handle类,可以实现Controller接口或者使用@Controller注解。这一步也是MVC框架必不可少的,控制器接受请求后将其分发给对应的Handle即是实现了Controller接口的Java类,而该Java类负责调用后台业务逻辑代码来处理请求。
- 配置Handle。可以在xml文件中进行配置也可以使用注解进行配置。
- 编写视图资源。Handle处理完用户请求之后,通常会返回一个ModelAndView对象,对象中包含了返回的视图名或视图名和模型,这个视图名就代表要显示的物理视图资源。如果Handle需要把一些数据传给视图资源,则可以通过模型对象。
web.xml中配置核心控制器的代码:
<!-- 定义Spring MVC的前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<!-- 配置文件的位置 -->
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-config.xml</param-value>
</init-param>
<!-- 设置web应用启动时立即加载servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- servlet映射声明,让Spring MVC的前端控制器拦截所有请求 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Spring MVC 配置文件代码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<!-- 配置Handle,映射"/hello请求" -->
<!-- <bean name="/hello" class="com.xing.controller.HelloController"/> -->
<!-- 以下是不使用注解时,所需要配置的 -->
<!-- 处理映射器将bean的name作为URL进行查找,需要在配置Handle时指定name(即URL) -->
<!-- <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> -->
<!-- SimpleControllerHandlerAdapter是一个处理适配器,所有处理适配器都要实现HandlerAdapter接口 -->
<!-- <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> --> <!-- 视图解析器 -->
<!-- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/> -->
<!-- 以下是使用注解开发时所需要的配置 -->
<!-- spring自动扫描base-pack下面的包或者子包下面的Java文件,如果如果扫描到有 spring的相关注解的类,则把这些类注册为Spring的bean -->
<!-- 扫描对应的包 -->
<context:component-scan base-package="com.xing.controller" />
<!-- 配置 annotation类型的处理映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- 配置annotation类型的处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>
不使用注解的话,对每一个请求都要在配置文件中进行配置,当项目足够大的时候会使配置文件看起来臃肿,还是使用注解的方式比较方便。。
Spring MVC的执行流程:
- 用户向服务器发送请求,请求被Spring的前端控制器DispatcherServlet拦截。
- 前端控制器DispatcherServlet对请求URL进行解析,得到URL。之后根据该URL调用HandlerMapping获得该Handler配置的所有相关对象,包括Handle对象以及Handle对象对应的拦截器,这些对象会被封装到一个HandlerExecutionChain对象中返回。
- DispatcherServlet根据获得的Handler选择一个合适HandlerAdapter(设计符合面向对象的单一职责原则,代码结构清晰便于维护可重用性高)。HandlerAdapter会被用于处理多种Handler调用Handler实际处理请求的方法。
- 提取请求中的模型数据,开始执行Handler(Controller),再填充Handler的入参过程中根据配置Spring会做以下工作:
- 消息转换:将请求消息(如json、xml等数据)转换成一个对象,将对象转换为指定的响应信息。
- 数据转换:对请求消息进行数据转换,如String转换成Integer、Double、Float等。
- 数据格式化:对请求消息进行数据格式化,如将字符串转化成数字或格式化日期等。
- 数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。
- Handler执行完成后,像DispatcherServlet返回一个ModelAndView对象,该对象中包含视图名或视图名和模型。
- 根据返回的ModelAndView对象,选择一个合适的ViewResolver(视图解析器)返回给DispatcherServlet。
- ViewResolver结合Model和View来渲染视图。
- 将视图渲染结果返回给客户端。