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 就都可以混 合使用。