# 7.6　小结

在 Spring 中，总是会有“还没有结束”的感觉：更多的特性、更多的选择以及实现开发目标的更多方式。Spring MVC 有很多功能和技巧。

当然，Spring MVC 的环境搭建是有多种可选方案的一个领域。在本章中，我们首先看了一下搭建 Spring MVC 中 DispatcherServlet 和 ContextLoaderListener 的多种方式。我们还看到了如何调整 DispatcherServlet 的注册功能以及如何注册自定义的 Servlet 和 Filter。如果你需要将应用部署到更老的应用服务器上，我们还快速了解了如何使用 web.xml 声明 DispatcherServlet 和  ContextLoader-Listener。

然后，我们了解了如何处理 Spring MVC 控制器所抛出的异常。尽管带有 @RequestMapping 注解的方法可以在自身的代码中处理异常，但是如果我们将异常处理的代码抽取到单独的方法中，那么控制器的代码会整洁得多。

为了采用一致的方式处理通用的任务，包括在应用的所有控制器中处理异常，Spring 3.2 引入了 @ControllerAdvice，它所创建的类能够将控制器的通用行为抽取到同一个地方。

最后，我们看了一下如何跨重定向传递数据，包括 Spring 对 flash 属性的支持：类似于模型的属性，但是能在重定向后存活下来。这样的话，就能采用非常恰当的方式为 POST 请求执行一个重定向回应，而且能够将处理 POST 请求时的模型数据传递过来，然后在重定向后使用或展现这些模型数据。

如果你还有疑惑的话，那么可以告诉你，这就是我所说的“更多的功 能”！其实，我们并没有讨论到 Spring MVC 的每个方面。我们将会在第 16 章中重新讨论 Spring MVC，到时你会看到如何使用它来创建 REST API。

但现在，我们将会暂时放下 Spring MVC，看一下 Spring Web Flow，这是一个构建在 Spring MVC 之上的流程框架，它能够引导用户执行一系列向导步骤。
