org.springframework.web.servlet.mvc.throwaway.ThrowawayController 并不在 Spring 的 Controller 继承架构中,而是一个独立的介面定义,实作该介面的类别不是像 Spring 中对 Controller 以单例的方式产生 并重复使用,ThrowawayController 在每一次请求时都要产生新 的物件,且用了就丢,不会重复使用它,这也是它名称上带有 Throwaway 的原因 (ThrowawayController 提供的是比较像 Webwork 形式的 Action 物件)。
ThrowawayController 介面的定义如下:
package org.springframework.web.servlet.mvc.throwaway; import org.springframework.web.servlet.ModelAndView; public interface ThrowawayController { ModelAndView execute() throws Exception; }
实作 ThrowawayController 介面的类别必须实作 execute()方法,可以看到 execute()方法中不 带任何的参数,这使得 ThrowawayController 易于测试,不需要像 Controller 必须获取 HttpServletRequest、 HttpServletResponse 的实例。
execute()方法上没有任何的参数,如果要收集参数的话,ThrowawayController 本身也兼具 Command 的作用(这点熟悉 Webwork 的人并不陌生),例如可以如下实作一个 ThrowawayController:
.... public class SomeController implements ThrowawayController { private String someParam; public ModelAndView execute() throws Exception { .... return new ModelAndView(...); } public void setSomeParam(String someParam) { this.someParam = someParam; } .... }
当请求参数中带有"someParam"的参数时,会将之设定至 ThrowawayController 对应的 setSomeParam()方法中。 在设定 Bean 定义档中必须注意的是,ThrowawayController 必须将"singleton"属性设定为"false",即每一次的请求要产生一个新的实例,用过即丢,例如:
... <bean id="someController" class="onlyfun.caterpillar.SomeController" s ingleton="false"> .... </bean>
DispatcherServlet 预设会使用 org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,这使得 Controller 继承体系下的 Controller 类别都可以直接为 DispatcherServlet 使用,但为了要告 诉 DispatchServlet 您将使用 ThrowawayController,您必须在 Bean 定义档中宣告,例如:
... <bean id="throwawayHandler" class="org.springframework.web.servlet.mvc. →throwaway.ThrowawayControllerHandlerAdapter"/> ... <bean id="simpleHandler" class="org.springframework.web.servlet. →mvc.SimpleControllerHandlerAdapter"/>
在上面的设定中,DispatcherServlet 可以使用 ThrowawayController,如果您要混合 Controller 介面的继承体系,则再加入 SimpleControllerHandlerAdapter,如此两种 Handler 就都可以混 合使用。