<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 華夢行 閱讀(2329) 評論(0)  編輯  收藏 所屬分類: Spring
    主站蜘蛛池模板: 午夜在线亚洲男人午在线| 亚洲最大中文字幕无码网站| 免费一级毛片在线播放放视频| 日韩精品视频免费网址| 欧美亚洲国产SUV| 日批日出水久久亚洲精品tv| 黄色a三级三级三级免费看| 亚洲成AV人在线观看网址| 成人午夜免费视频| 亚洲欧洲自拍拍偷午夜色无码| 中文字幕乱码一区二区免费| 久久亚洲国产中v天仙www| 无码日韩精品一区二区免费暖暖| 亚洲天堂久久精品| 成年在线观看网站免费| 色欲色欲天天天www亚洲伊| 四虎永久在线免费观看| 一个人免费观看www视频| 亚洲av无码国产精品色午夜字幕| 日韩内射激情视频在线播放免费 | 免费国产污网站在线观看| 国产av天堂亚洲国产av天堂| 日本免费一区二区三区| 亚洲精品免费网站| 亚洲av无码乱码在线观看野外| 久久久WWW免费人成精品| 亚洲黄色三级视频| 日韩午夜免费视频| 久久久久久免费一区二区三区| 亚洲综合在线成人一区| 国产成人精品免费视频软件| 一个人看www免费高清字幕| 亚洲理论精品午夜电影| 免费人成网站在线高清| 先锋影音资源片午夜在线观看视频免费播放 | 亚洲国产精品一区二区九九| 无码囯产精品一区二区免费 | 拨牐拨牐x8免费| 精品人妻系列无码人妻免费视频| 亚洲精品第五页中文字幕| 免费一级国产生活片|