ThrowawayController


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