<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-295  評論-26  文章-1  trackbacks-0

    13.3.?控制器

    控制器的概念是MVC設計模式的一部分(確切地說,是MVC中的C)。應用程序的行為通常被定義為服務接口,而控制器使得用戶可以訪問應用所提供的服務。控制器解析用戶輸入,并將其轉換成合理的模型數據,從而可以進一步由視圖展示給用戶。Spring以一種抽象的方式實現了控制器概念,這樣使得不同類型的控制器可以被創建。Spring本身包含表單控制器、命令控制器、向導型控制器等多種多樣的控制器。

    Spring控制器架構的基礎是org.springframework.mvc.Controller接口,其代碼如下:

    public interface Controller {
    
        /**
         * Process the request and return a ModelAndView object which the DispatcherServlet
         * will render.
         */
        ModelAndView handleRequest(
            HttpServletRequest request,
            HttpServletResponse response) throws Exception;
    
    }

    你可以發現Controller接口僅僅聲明了一個方法,它負責處理請求并返回合適的模型和視圖。Spring MVC實現的基礎就是這三個概念:Mdel、View(ModelAndView)以及 Controller。雖然Controller接口是完全抽象的,但Spring也提供了許多你可能會用到的控制器。Controller接口僅僅定義了每個控制器都必須提供的基本功能:處理請求并返回一個模型和一個視圖。

    13.3.1.?AbstractControllerWebContentGenerator

    為了提供一套基礎設施,所有的Spring控制器都繼承了 AbstractControllerAbstractController 提供了諸如緩存支持和mimetype設置這樣的功能。

    表?13.3.?AbstractController提供的功能

    功能 描述
    supportedMethods 指定這個控制器應該接受什么樣的請求方法。通常它被設置成同時支持GET和POST,但是你可以選擇你想支持的方法。如果控制器不支持請求發送的方法,客戶端會得到通知(通常是拋出一個ServletException)。
    requiresSession 指定這個控制器是否需要HTTP session才能正常工作。如果控制器在沒有session的情況下接收到請求,客戶端會因為拋出ServletException而得到通知。
    synchronizeSession 指定controller是否同步用戶的HTTP session。
    cacheSeconds 指定controller通知客戶端對數據內容緩存的秒數,一般為大于零的整數。默認值為-1,即不緩存。
    useExpiresHeader 指定Controller在響應請求時是否兼容HTTP 1.0 Expires header。缺省值為true
    useCacheHeader 指定Controller在相應請求時是否兼容HTTP 1.1 Cache-Control header。默認值為true

    當從AbstractController繼承時,需要實現handleRequestInternal(HttpServletRequest, HttpServletResponse)抽象方法,該方法將用來實現自己的邏輯,并返回一個ModelAndView對象。下面這個簡單的例子演示了如何從AbstractController繼承以及如何在applicationContext.xml中進行配置

    package samples;
    
    public class SampleController extends AbstractController {
    
        public ModelAndView handleRequestInternal(
            HttpServletRequest request,
            HttpServletResponse response) throws Exception {
    
            ModelAndView mav = new ModelAndView("hello");
            mav.addObject("message", "Hello World!");
            return mav;        
        }
    }
    <bean id="sampleController" class="samples.SampleController">
        <property name="cacheSeconds" value="120"/>
    </bean>

    該controller返回的ModelAndView使用了硬編碼的視圖名(盡管這樣做不好),并通知客戶端將響應數據緩存2分鐘。除了通過以上方式創建和配置controller之外,還需要配置handler mapping(請參考第?13.4?節 “處理器映射(handler mapping)”),這樣該controller就可以工作了。

    13.3.2.?其它的簡單控制器

    盡管可以繼承AbstractController來實現自己的控制器,不過Spring提供的眾多控制器減輕了我們開發簡單MVC應用時的負擔。ParameterizableViewController基本上和上面例子中的一樣,不同的是,你可以在applicationContext.xml配置中指定返回視圖名從而避免了在Java代碼中的硬編碼。

    UrlFilenameViewController會檢查URL,獲取文件請求的文件名,并把它作為視圖名加以使用。。例如,http://www.springframework.org/index.html對應的視圖文件名是index

    13.3.3.?MultiActionController

    MultiActionController將多個行為(action)合并在一個控制器里,這樣可以把相關功能組合在一起。MultiActionController位于org.springframework.web.mvc.multiaction包中,它通過將請求映射到正確的方法名來調用方法。當在一個控制器存在大量公共的行為,但是有多個調用入口時,使用MultiActionController就特別方便。

    表?13.4.?MultiActionController提供的功能

    功能 描述
    delegate MultiActionController有兩種使用方式。第一種是你繼承MultiActionController,并在子類中指定由MethodNameResolver解析的方法(這種情況下不需要這個delegate參數)。第二種是你定義一個代理對象,由它提供MethodNameResolver解析出來的方法(這種情況下,你必須使用這個配置參數定義代理對象)。
    methodNameResolver MultiActionController需要一種策略,使其可以通過解析請求信息來獲得要調用的方法。這個解析策略由MethodNameResolver這個接口定義的。這個參數允許你實現MethodNameResolver接口,然后在控制器中使用你的策略。

    MultiActionController所支持的方法需要符合下列格式:

    								
    										// anyMeaningfulName can be replaced by any methodname
    								
    public [ModelAndView | Map | void] anyMeaningfulName(HttpServletRequest, HttpServletResponse [, Exception | AnyObject]);

    注意:在此不允許方法重載,因為MultiActionController無法分辨出重載(overloading)了的方法。此外,你可以定義exception handler來處理方法中拋出的異常。

    Exception 參數是可選的,它可以是任何異常,只要它是java.lang.Exceptionjava.lang.RuntimeException的子類。AnyObject參數也是可選的,它可以是任何對象。HTTP Request中的參數會存在這個對象中,以便使用。

    下面幾個例子示范了MultiActionController正確的方法定義。

    標準格式(跟Controller接口定義的一樣)。

    public ModelAndView doRequest(HttpServletRequest, HttpServletResponse)

    下面這個方法支持Login參數, 這個參數中包含從請求中抽取出來的信息。

    public ModelAndView doLogin(HttpServletRequest, HttpServletResponse, Login)

    下面這個方法可以處理Exception

    public ModelAndView processException(HttpServletRequest, HttpServletResponse, IllegalArgumentException)

    下面這個方法不返回任何數值。 (請參考后面的章節 第?13.11?節 “慣例優先原則(convention over configuration)”)

    public void goHome(HttpServletRequest, HttpServletResponse)

    This signature has a Map return type (see the section entitled 第?13.11?節 “慣例優先原則(convention over configuration)” below).

    下面這個方法返回一個Map。 (請參考后面的章節第?13.11?節 “慣例優先原則(convention over configuration)”)

    public Map doRequest(HttpServletRequest, HttpServletResponse)

    MethodNameResolver負責從請求中解析出需要調用的方法名稱。下面是Spring中內置的三個MethodNameResolver 實現。

    • ParameterMethodNameResolver - 解析請求參數,并將它作為方法名。(對應http://www.sf.net/index.view?testParam=testIt的請求,會調用 testIt(HttpServletRequest,HttpServletResponse)方法)。使用paramName配置參數,可以設定要檢查的參數。

    • InternalPathMethodNameResolver -從路徑中獲取文件名作為方法名 (http://www.sf.net/testing.view的請求會調用testing(HttpServletRequest,HttpServletResponse)方法。

    • PropertiesMethodNameResolver - 使用用戶自定義的屬性對象,將請求的URL映射到方法名。當屬性中包含/index/welcome.html=doIt時,發到/index/welcome.html 的請求會調用doIt(HttpServletRequest, HttpServletResponse)這個方法。 這個方法名解析器可以和PathMatcher一起工作,比如上邊那個URL寫成/**/welcom?.html也是可以的。

    我們來看一組例子。首先是一個使用ParameterMethodNameResolver和代理(delegate)屬性的例子,它接受包含參數名"method"的請求,調用方法retrieveIndex

    <bean id="paramResolver" class="org....mvc.multiaction.ParameterMethodNameResolver">
      <property name="paramName" value="method"/>
    </bean>
    
    <bean id="paramMultiController" class="org....mvc.multiaction.MultiActionController">
      <property name="methodNameResolver" ref="paramResolver"/>
      <property name="delegate" ref="sampleDelegate"/>
    </bean>
    
    <bean id="sampleDelegate" class="samples.SampleDelegate"/>
    
    ## together with
    
    public class SampleDelegate {
    
        public ModelAndView retrieveIndex(HttpServletRequest req, HttpServletResponse resp) {
    
            return new ModelAndView("index", "date", new Long(System.currentTimeMillis()));
        }
    }

    當使用上面的代理對象時,我們也可以使用PropertiesMethodNameRseolver來匹配一組URL,將它們映射到我們定義的方法上:

    <bean id="propsResolver" class="org....mvc.multiaction.PropertiesMethodNameResolver">
      <property name="mappings">
        <value>
            /index/welcome.html=retrieveIndex
            /**/notwelcome.html=retrieveIndex
            /*/user?.html=retrieveIndex
        </value>
      </property>
    </bean>
    
    <bean id="paramMultiController" class="org....mvc.multiaction.MultiActionController">
        <property name="methodNameResolver" ref="propsResolver"/>
        <property name="delegate" ref="sampleDelegate"/>
    </bean>

    13.3.4.?命令控制器

    Spring的CommandController是Spring MVC的重要部分。命令控制器提供了一種和數據對象交互的方式,并動態地將來自HttpServletRequest的參數綁定到你指定的數據對象上。它的功能和Struts中的ActionForm有點像,不過在Spring中,你不需要實現任何接口來實現數據綁定。首先,讓我們看一下有哪些可以使用的命令控制器:

    • AbstractCommandController --你可以使用該抽象命令控制器來創建自己的命令控制器,它能夠將請求參數綁定到你指定的命令對象。這個類并不提供任何表單功能,但是它提供驗證功能,并且讓你在子類中去實現如何處理由請求參數產生的命令對象。

    • AbstractFormController--一個支持表單提交的抽象控制器類。使用這個控制器,你可以定義表單,并使用從控制器獲取的數據對象構建表單。當用戶輸入表單內容,AbstractFormController將用戶輸入的內容綁定到命令對象,驗證表單內容,并將該對象交給控制器,完成相應的操作。它支持的功能有防止重復提交、表單驗證以及一般的表單處理流程。子類需要實現自己的方法來指定采用哪個視圖來顯示輸入表單,哪個視圖顯示表單正確提交后的結果。如果你需要表單,但不想在應用上下文中指定顯示給用戶的視圖,就使用這個控制器。

    • SimpleFormController --這是一個form cotnroller,當需要根據命令對象來創建相應的form的時候,該類可以提供更多的支持。你可以為其指定一個命令對象,顯示表單的視圖名,當表單提交成功后顯示給用戶的視圖名等等。

    • AbstractWizardFormController --這是一個抽象類,繼承這個類需要實現validatePage()processFinish()processCancel() 方法。

      你有可能也需要寫一個構造器,它至少需要調用setPages()setCommandName()方法。setPages()的參數是一個String數組,這個數組包含了組成向導的視圖名。setCommandName()的參數是一個String,該參數將用來在視圖中調用你的命令對象。

      AbstractFormController的實現一樣, 你需要使用命令對象(其實就是一個JavaBean, 這個bean中包含了表單的信息)。你有兩個選擇:在構造函數中調用setCommandClass()方法(參數是命令對象的類名),或者實現formBackingObject()方法。

      AbstractWizardFormController 有幾個你可以復寫(override)的方法。最有用的一個是referenceData(..)。這個方法允許你把模型數據以Map的格式傳遞給視圖;getTargetPage() 允許你動態地更改向導的頁面順序,或者直接跳過某些頁面;onBindAndValidate() 允許你復寫內置的綁定和驗證流程。

      最后,我們有必要提一下setAllowDirtyBack()setAllowDirtyForward()兩個方法。 你可以在getTargetPage()中調用這兩個方法,這兩個方法將決定在當前頁面驗證失敗時,是否允許向導前移或后退。

      AbstractWizardFormController的更詳細內容請參考JavaDoc。在Spring附帶的例子jPetStore中,有一個關于向導實現的例子: org.springframework.samples.jpetstore.web.spring.OrderFormController



    大盤預測 國富論
    posted on 2007-08-30 12:32 華夢行 閱讀(2328) 評論(0)  編輯  收藏 所屬分類: Spring
    主站蜘蛛池模板: 国产日韩AV免费无码一区二区三区 | 亚洲精品日韩专区silk | 久久久久久AV无码免费网站| 亚洲国产精品自在拍在线播放| 亚洲av永久中文无码精品综合 | 亚洲精选在线观看| 亚洲免费精彩视频在线观看| 亚洲AV区无码字幕中文色| 日韩精品内射视频免费观看| 亚洲黄色在线电影| 插B内射18免费视频| 亚洲第一成年网站视频| 免费真实播放国产乱子伦| 国产大片免费天天看| 亚洲国产精品无码成人片久久| 一级毛片成人免费看免费不卡 | 一区二区三区免费在线视频| 相泽亚洲一区中文字幕| a毛片免费观看完整| 亚洲精品国产专区91在线| 嫩草视频在线免费观看| 色哟哟国产精品免费观看| 国产精品亚洲精品日韩已满| 精品无码免费专区毛片| 亚洲av日韩av永久无码电影| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 亚洲国产成人五月综合网| 久久久久久久99精品免费观看 | 国产AV日韩A∨亚洲AV电影| 国产亚洲精品高清在线| 99精品国产成人a∨免费看| 亚洲欧洲无码一区二区三区| 亚洲av日韩片在线观看| 免费一级毛片在线播放视频| 中文字幕精品三区无码亚洲| 亚洲国产一级在线观看| 1000部拍拍拍18勿入免费视频下载 | 无码一区二区三区免费| 男人的天堂av亚洲一区2区| 亚洲国产美女精品久久久久∴| 一二三四在线播放免费观看中文版视频 |