MVC模型中的控制器负责解析用户的输入信息,并将之变换处理后传入一个model,而这个model则可能被呈现给发起请求的用户。Spring以非常抽象的方式体现了控制器的理念,从而开发人员在创建controller时将有多种选择。Spring包含了3类controller:处理HTML表单的controller,基于command的controller,和向导风格的controller。
 

      Spring中Controller的基本类是org.springframework.web.servlet.mvc.Controller,这是一个相当简洁的接口,源代码如下:

package org.springframework.web.servlet.mvc;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import org.springframework.web.servlet.ModelAndView;
 public interface Controller {
     ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
 }

 
        Controller接口仅仅定义了一个方法用于负责处理客户请求,并返回适当的模型和视图,这也是所有控制器都需要完成的职责。ModelAndView与Controller,这便是Spring  MVC框架实现的基础。尽管Controller相当抽象,但Spring提供了多种Controller接口实现类。
1.  AbstractController  类
        AbstractController是WebContentGenerator的子类,并实现了Controller接口。AbstractController是最重要的Controller接口实现之一  ,它提供了一些很基本的功能特征,例如生成HTTP协议的缓存头标数据,设定GET/POST动作等等。
        考察一下AbstratorController所在的类层次:

java.lang.Object
 |_ org.springframework.context.support.ApplicationObjectSupport
   |_ org.springframework.web.context.support.WebApplicationObjectSupport
     |_   org.springframework.web.servlet.support.WebContentGenerator
         |_ org.springframework.web.servlet.mvc.AbstractController


        AbstratorController从其超类中继承许多属性,这些属性可以通过配置文件注入:
*  supportedMethods  :指明本Controller应该接受的方法,缺省值“GET,POST”,开发人员也可以自己修改本属性以反应欲支持的方法。若一个请求带有该方法设定,但Controller并不支持,那么这个信息将被通知客户。
*  requiresSession:指明本Controller是否需要一个HTTP会话以完成它的工作,若Contrller在接收一个请求时并没有HTTP会话存在,那么将抛出一个ServletException。本属性的缺省值是false。
*  synchronizeSession:若在客户的HTTP会话中,需要以同步方式处理Controller,则使用本属性。
*  cacheSeconds:当需要Controller为客户的HTTP响应生成一个缓存指令时,可以为cacheSeconds指定一个正整数。本属性缺省值为-1,即不设定缓存。
*  useExpiresHeader:指示Controller为客户的HTTP响应指定一个兼容HTTP  1.0版本中的"Expires"头标数据。本属性缺省值是true。
*  useCacheHeader:指示Controller为客户的HTTP响应指定一个兼容HTTP  1.1版本中的"Cache-Control"头标数据。本属性缺省值是true。
        我们阅读一下Spring  src目录中的AbstractController的源代码:

package org.springframework.web.servlet.mvc;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.support.WebContentGenerator;
 import org.springframework.web.util.WebUtils;
 public abstract class AbstractController extends WebContentGenerator implements Controller {
     private boolean synchronizeOnSession = false;
     public final void setSynchronizeOnSession(boolean synchronizeOnSession) {
         this.synchronizeOnSession = synchronizeOnSession;
     }
     public final boolean isSynchronizeOnSession() {
         return synchronizeOnSession;
     }
     public final ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
               throws Exception {
         checkAndPrepare(request, response, this instanceof LastModified);
         if (this.synchronizeOnSession) {
               HttpSession session = request.getSession(false);
               if (session != null) {
                   Object mutex = WebUtils.getSessionMutex(session);
                   synchronized (mutex) {