MVC模型中的控制器负责解析用户的输入信息,并将之变换处理后传入一个model,而这个model则可能被呈现给发起请求的用户。Spring以非常抽象的方式体现了控制器的理念,从而开发人员在创建controller时将有多种选择。Spring包含了3类controller:处理HTML表单的controller,基于command的controller,和向导风格的controller。
<wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px">Spring中Controller的基本类是org.springframework.web.servlet.mvc.Controller,这是一个相当简洁的接口,源代码如下:<br><span style="line-height:1.3em"><br>
package<wbr>org.springframework.web.servlet.mvc;<br>
import<wbr>javax.servlet.http.HttpServletRequest;<br>
import<wbr>javax.servlet.http.HttpServletResponse;<br>
import<wbr>org.springframework.web.servlet.ModelAndView;<br>
public<wbr>interface<wbr>Controller<wbr>{<br><wbr><wbr><wbr><wbr>ModelAndView<wbr>handleRequest(HttpServletRequest<wbr>request,<wbr>HttpServletResponse<wbr>response)<wbr>throws<wbr>Exception;<br>
}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px"><br></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px">Controller接口仅仅定义了一个方法用于负责处理客户请求,并返回适当的模型和视图,这也是所有控制器都需要完成的职责。ModelAndView与Controller,这便是Spring</span><wbr><span style="font-size:16px">MVC框架实现的基础。尽管Controller相当抽象,但Spring提供了多种Controller接口实现类。<br>
1.</span><wbr><span style="font-size:16px">AbstractController</span><wbr><span style="font-size:16px">类<br></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px">AbstractController是WebContentGenerator的子类,并实现了Controller接口。AbstractController是最重要的Controller接口实现之一</span><wbr><span style="font-size:16px">,它提供了一些很基本的功能特征,例如生成HTTP协议的缓存头标数据,设定GET/POST动作等等。<br></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px">考察一下AbstratorController所在的类层次:<br><span style="line-height:1.3em">java.lang.Object<br>
|_<wbr>org.springframework.context.support.ApplicationObjectSupport<wbr><br><wbr><wbr>|_<wbr>org.springframework.web.context.support.WebApplicationObjectSupp<wbr>ort<br><wbr><wbr><wbr><wbr>|_<wbr><wbr><wbr>org.springframework.web.servlet.support.WebContentGenerator<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>|_<wbr>org.springframework.web.servlet.mvc.AbstractController</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px"><br></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px">AbstratorController从其超类中继承许多属性,这些属性可以通过配置文件注入:<br>
*</span><wbr><span style="font-size:16px">supportedMethods</span><wbr><span style="font-size:16px">:指明本Controller应该接受的方法,缺省值“GET,POST”,开发人员也可以自己修改本属性以反应欲支持的方法。若一个请求带有该方法设定,但Controller并不支持,那么这个信息将被通知客户。<br>
*</span><wbr><span style="font-size:16px">requiresSession:指明本Controller是否需要一个HTTP会话以完成它的工作,若Contrller在接收一个请求时并没有HTTP会话存在,那么将抛出一个ServletException。本属性的缺省值是false。<br>
*</span><wbr><span style="font-size:16px">synchronizeSession:若在客户的HTTP会话中,需要以同步方式处理Controller,则使用本属性。<br>
*</span><wbr><span style="font-size:16px">cacheSeconds:当需要Controller为客户的HTTP响应生成一个缓存指令时,可以为cacheSeconds指定一个正整数。本属性缺省值为-1,即不设定缓存。<br>
*</span><wbr><span style="font-size:16px">useExpiresHeader:指示Controller为客户的HTTP响应指定一个兼容HTTP</span><wbr><span style="font-size:16px">1.0版本中的"Expires"头标数据。本属性缺省值是true。<br>
*</span><wbr><span style="font-size:16px">useCacheHeader:指示Controller为客户的HTTP响应指定一个兼容HTTP</span><wbr><span style="font-size:16px">1.1版本中的"Cache-Control"头标数据。本属性缺省值是true。<br></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px"></span><wbr><span style="font-size:16px">我们阅读一下Spring</span><wbr><span style="font-size:16px">src目录中的AbstractController的源代码:<br><span style="line-height:1.3em"><br>
package<wbr>org.springframework.web.servlet.mvc;<br>
import<wbr>javax.servlet.http.HttpServletRequest;<br>
import<wbr>javax.servlet.http.HttpServletResponse;<br>
import<wbr>javax.servlet.http.HttpSession;<br>
import<wbr>org.springframework.web.servlet.ModelAndView;<br>
import<wbr>org.springframework.web.servlet.support.WebContentGenerator;<br>
import<wbr>org.springframework.web.util.WebUtils;<br>
public<wbr>abstract<wbr>class<wbr>AbstractController<wbr>extends<wbr>WebContentGenerator<wbr>implements<wbr>Controller<wbr>{<br><wbr><wbr><wbr><wbr>private<wbr>boolean<wbr>synchronizeOnSession<wbr>=<wbr>false;<br><wbr><wbr><wbr><wbr>public<wbr>final<wbr>void<wbr>setSynchronizeOnSession(boolean<wbr>synchronizeOnSession)<wbr>{<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>this.synchronizeOnSession<wbr>=<wbr>synchronizeOnSession;<br><wbr><wbr><wbr><wbr>}<br><wbr><wbr><wbr><wbr>public<wbr>final<wbr>boolean<wbr>isSynchronizeOnSession()<wbr>{<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>return<wbr>synchronizeOnSession;<br><wbr><wbr><wbr><wbr>}<br><wbr><wbr><wbr><wbr>public<wbr>final<wbr>ModelAndView<wbr>handleRequest(HttpServletRequest<wbr>request,<wbr>HttpServletResponse<wbr>response)<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>throws<wbr>Exception<wbr>{<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>checkAndPrepare(request,<wbr>response,<wbr>this<wbr>instanceof<wbr>LastModified);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>if<wbr>(this.synchronizeOnSession)<wbr>{<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>HttpSession<wbr>session<wbr>=<wbr>request.getSession(false);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>if<wbr>(session<wbr>!=<wbr>null)<wbr>{<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>Object<wbr>mutex<wbr>=<wbr>WebUtils.getSessionMutex(session);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>synchronized<wbr>(mutex)<wbr>{<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span></span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>