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