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

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

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

    konhon

    忘掉過去,展望未來。找回自我,超越自我。
    逃避不一定躲的過, 面對不一定最難過, 孤單不一定不快樂, 得到不一定能長久, 失去不一定不再擁有, 可能因為某個理由而傷心難過, 但我卻能找個理由讓自己快樂.

    Google

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      203 Posts :: 0 Stories :: 61 Comments :: 0 Trackbacks
    我們經常為每一個Action撰寫一個Controller類別,很快的,您發現到您的Web應用程式下越來越多的Controller類別,而事實上當中的方法是可以組織在一起成為一個類別檔案,例如與資料庫操作相關的list()、add()、delete()等方法,就可以組織為一個類別。

     要將相關的方法組織在一個檔案中,只使用一個handleRequest()方法似乎是不夠的,我們希望同一個Controller中可以根據我們的指定來Action中的某個方法,而不只是使用handleRequest()方法。

     作為org.springframework.web.servlet.mvc.AbstractController下的另一個子類別:org.springframework.web.servlet.mvc.multiaction.MultiActionController,它可以讓我們在一個Controller類別中定義多個方法,並根據我們的請求來呼叫當中的某個方法來執行。

     如果您瞭解Struts,其DispatchAction就類似於Spring的MultiActionController類別,所不同的是,MultiActionController擁有比Struts的DispatchAction更多樣化的方式來參數化與組織這些Action。

     要使用MultiActionController,您要配合一個MethodNameResolver的實例,MultiActionController預設是InternalPathMethodNameResolver,這是最簡單的方式,根據您所給的網址最後的檔案名稱來判斷要執行Action中的哪一個方法,但通常我們不會使用InternalPathMethodNameResolver,因為這就失去了使用MultiActionController的一些優點,像是依請求參數來決定要呼叫的方法。

     我們通常會使用ParameterMethodNameResolver或PropertiesMethodNameResolver,在一個網址上結合請求參數,以參數來決定要執行哪一個Action,這邊以ParameterMethodNameResolver為例,首先,我們可以在bean定義檔中這麼撰寫:

    <?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN""http://www.springframework.org/dtd/spring-beans.dtd"> 
    <beans> 
        <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
            <property name="mappings"> 
                <props> 
                    <prop key="/book.do">bookAction</prop> 
                </props> 
            </property> 
        </bean> 
        
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
            <property name="viewClass"> 
                <value>org.springframework.web.servlet.view.InternalResourceView</value> 
            </property> 
            <property name="prefix"> 
                <value>/WEB-INF/jsp/</value> 
            </property> 
            <property name="suffix"> 
                <value>.jsp</value> 
            </property> 
        </bean> 
    
        <bean id="paraMethodResolver" 
            class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> 
            <property name="paramName"><value>method</value></property> 
            <property name="defaultMethodName"><value>list</value></property> 
        </bean> 
            
        <bean id="bookAction" class="onlyfun.caterpillar.GuestBookAction"> 
            <property name="methodNameResolver"> 
                <ref bean="paraMethodResolver"/> 
            </property> 
            <property name="testPage"> 
                <value>test</value> 
            </property> 
        </bean> 
    </beans>

     在paraMethodResolver中,我們使用paramName定義在http請求中使用method參數來指定要呼叫的方法,若是請求中沒有指定method參數,則會使用defaultMethodName所指定的方法,這邊指定的是list()方法。

     GuestBookAction是個繼承MultiActionController的類別,當中我們可以定義我們在method參數指定下所要呼叫的方法,例如:

    GuestBookAction.java
    package onlyfun.caterpillar; 
    
    import javax.servlet.http.*; 
    import org.springframework.web.servlet.ModelAndView; 
    import org.springframework.web.servlet.mvc.multiaction.MultiActionController; 
    
    public class GuestBookAction extends MultiActionController { 
        privateString testPage; 
        
        public ModelAndView list(HttpServletRequest req, HttpServletResponse res) { 
            returnnew ModelAndView(this.getTestPage(),"executed", "list"); 
        } 
        
        public ModelAndView add(HttpServletRequest req, HttpServletResponse res) { 
            returnnew ModelAndView(this.getTestPage(),"executed", "add"); 
        } 
        
        public ModelAndView delete(HttpServletRequest req, HttpServletResponse res) { 
            returnnew ModelAndView(this.getTestPage(),"executed", "delete"); 
        } 
        
        publicString getTestPage() { 
            return testPage; 
        } 
        
        public void setTestPage(String testPage) { 
            this.testPage = testPage; 
        } 
    }

     注意到我們的方法必須包括HttpServletRequest與HttpServletResponse作為參數,您也可以使用帶有第三個參數HttpSession的版本。

     上面的類別只是一個簡單的範例,用於測試MultiActionController的運作,我們測試用的JSP網頁如下:

    <html> 
    <head><title>Test</title></head> 
    <body> 
        <H1> "${executed}" method is executed.</H2> 
    </body> 
    </html>

     當您使用以下的網址請求資源時:
    http://localhost:8080/springapp/book.do?method=add

     我們的測試網頁將傳回以下的內容:

    <html> 
    <head><title>Test</title></head> 
    <body> 
        <H1> "add" method is executed.</H2> 
    </body> 
    </html>

     您也可以將所有相對應的方法專門組織在一個委託(delegate)物件中,而不是撰寫在Controller類別中,當請求來到時,將委託給這個物件來執行指定的方法,您只要定義MultiActionController的delegate屬性即可,例如我們的委託物件如下:

    BookActionDelegate.java
    package onlyfun.caterpillar; 
    
    import javax.servlet.http.*; 
    import org.springframework.web.servlet.ModelAndView; 
    
    public class BookActionDelegate { 
        privateString testPage; 
        
        public ModelAndView list(HttpServletRequest req, HttpServletResponse res) { 
            returnnew ModelAndView(this.getTestPage(),"executed", "list"); 
        } 
        
        public ModelAndView add(HttpServletRequest req, HttpServletResponse res) { 
            returnnew ModelAndView(this.getTestPage(),"executed", "add"); 
        } 
        
        public ModelAndView delete(HttpServletRequest req, HttpServletResponse res) { 
            returnnew ModelAndView(this.getTestPage(),"executed", "delete"); 
        } 
        
        publicString getTestPage() { 
            return testPage; 
        } 
        
        public void setTestPage(String testPage) { 
            this.testPage = testPage; 
        } 
    }

     現在我們不用定義GuestBookAction了,直接使用MultiActionController,只要定義Bean定義檔就好了:

    <?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN""http://www.springframework.org/dtd/spring-beans.dtd"> 
    <beans> 
        <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
            <property name="mappings"> 
                <props> 
                    <prop key="/book.do">bookAction</prop> 
                </props> 
            </property> 
        </bean> 
        
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
            <property name="viewClass"> 
                <value>org.springframework.web.servlet.view.InternalResourceView</value> 
            </property> 
            <property name="prefix"> 
                <value>/WEB-INF/jsp/</value> 
            </property> 
            <property name="suffix"> 
                <value>.jsp</value> 
            </property> 
        </bean> 
    
        <bean id="paraMethodResolver" 
            class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> 
            <property name="paramName"><value>method</value></property> 
            <property name="defaultMethodName"><value>list</value></property> 
        </bean> 
    
        <bean id="bookActionDelegate" class="onlyfun.caterpillar.BookActionDelegate"> 
            <property name="testPage"> 
                <value>test</value> 
            </property> 
        </bean> 
        
        <bean id="bookAction" class="org.springframework.web.servlet.mvc.multiaction.MultiActionController"> 
            <property name="methodNameResolver"> 
                <ref bean="paraMethodResolver"/> 
            </property> 
            <property name="delegate"> 
                <ref bean="bookActionDelegate"/> 
            </property> 
        </bean>    
    </beans>

     測試的結果與上面是相同的。

     以上說明的是ParameterMethodNameResolver,而PropertiesMethodNameResolver的設定方法是類似的,有興趣的話,可以看一下Spring參考手冊中有關MultiActionController的說明,當中也有個簡明的設定範例。

    posted on 2006-05-25 20:07 konhon 優華 閱讀(990) 評論(0)  編輯  收藏 所屬分類: Spring
    主站蜘蛛池模板: 亚洲色偷偷av男人的天堂| 亚洲精品国产福利一二区| 亚洲国产天堂久久综合网站| 国产免费内射又粗又爽密桃视频| 亚洲成A人片77777国产| 日韩国产精品亚洲а∨天堂免| 免费一本色道久久一区| 77777亚洲午夜久久多喷| 国产情侣激情在线视频免费看| 亚洲美女视频免费| 中文字幕乱码免费视频| 亚洲美女激情视频| 我们的2018在线观看免费高清| 亚洲国产成人九九综合| 成人网站免费观看| 爱情岛论坛亚洲品质自拍视频网站| 99精品全国免费观看视频| 亚洲а∨天堂久久精品9966| 女性自慰aⅴ片高清免费| 毛片基地免费视频a| 亚洲AV无码无限在线观看不卡| 午夜一级免费视频| 美女被免费网站视频在线| 亚洲精品国产精品乱码不卡| 天堂在线免费观看| 亚洲最新视频在线观看| 97无码免费人妻超级碰碰夜夜| 在线视频亚洲一区| 免费国产黄网站在线观看| 亚洲系列国产精品制服丝袜第| 久久国产乱子伦精品免费午夜 | 国产区在线免费观看| 亚洲av无码精品网站| 免费在线观看h片| 日本亚洲视频在线| 亚洲免费在线视频播放| 亚洲gay片在线gv网站| 亚洲伊人久久精品影院| 亚洲免费福利视频| 羞羞的视频在线免费观看| 国产AV无码专区亚洲AV男同|