<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
    主站蜘蛛池模板: 亚洲情a成黄在线观看| 67pao强力打造高清免费| 免费黄色app网站| 中文字幕亚洲码在线| 性做久久久久久久免费看| 亚洲www在线观看| 成人无码区免费A片视频WWW| 亚洲国产精品免费观看 | 国产一区视频在线免费观看| 久久亚洲精品无码网站| 国产乱子伦精品免费女| 激情吃奶吻胸免费视频xxxx| 亚洲裸男gv网站| baoyu122.永久免费视频| 久久亚洲精品成人综合| 99爱视频99爱在线观看免费| 亚洲国产高清美女在线观看| 性xxxx视频播放免费| 理论片在线观看免费| 国产成人亚洲综合色影视| 99re在线视频免费观看| 国产精品亚洲片夜色在线| 国产国产人免费人成免费视频| 色婷婷综合缴情综免费观看| 亚洲av无码片在线播放| 黄色免费网站网址| 亚洲AV网一区二区三区| 亚洲乱码一区二区三区在线观看 | 2021免费日韩视频网| 精品久久久久久亚洲中文字幕| 亚洲中文字幕无码不卡电影| 99re在线这里只有精品免费| 亚洲国产成人久久精品软件 | 可以免费观看的毛片| youjizz亚洲| 亚洲精品国产V片在线观看| 一级毛片不卡片免费观看| 亚洲最大福利视频| 亚洲尤码不卡AV麻豆| 桃子视频在线观看高清免费完整| 狼色精品人妻在线视频免费|