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

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

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

    歡迎使用我的 在線工具

    小D

    讀歷史、看小說、寫程序都是我所愛。技術不好,頭腦不靈光,靠的是興趣。
    隨筆 - 35, 文章 - 25, 評論 - 13, 引用 - 0
    數(shù)據(jù)加載中……

    Spring MVC框架(通過Spring showcase示例)


    1、?mvc-convention

    The Spring MVC Convention Over Configuration application showcases the
    new Convention Over Configuration support introduced in Spring 2.0.

    The web application is *very* simplistic, because the intent is
    to convey the essence(本質(zhì)) of the convention over configuration support(配置文檔協(xié)議支

    持)
    and nothing else.

    ?? <!-- maps request URLs to Controller names 將請求與Controller類名自動匹配 如hello.do自動

    查找HelloController實例處理
    ??? ?但是必須要遵守命名規(guī)范,它是根據(jù)請求路徑URI中的路徑來匹配Controller,最后一個也就是

    文件名,在默認的MethodNameResolver中是
    ??? ?用來匹配Controller的方法,如果沒有路徑,那么也就根據(jù)這個文件名來匹配Controller-->
    ??? <bean

    class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

    ??? <bean id="baseRecipeController" abstract="true">
    ??????? <property name="recipeManager" ref="recipeManager"/>
    ??? </bean>

    ??? <!-- Controller names are not important when using the above HandlerMapping

    implementation
    ??? ? 簡單的繼承一個虛擬的類,記住這里的繼承不是真正意義上的基礎,而是在Spring層次上的繼

    承-->
    ??? <bean class="org.springframework.showcase.coverc.web.SwitchBoardController"
    ????????? parent="baseRecipeController"/>

    ??? <bean class="org.springframework.showcase.coverc.web.EditRecipeController"
    ????????? parent="baseRecipeController">
    ??????? <property name="commandName" value="recipe"/>
    ??????? <property name="commandClass"

    value="org.springframework.showcase.coverc.domain.Recipe"/>
    ??????? <property name="formView" value="editRecipe"/>
    ??????? <property name="successView" value="redirect:switchboard/listRecipes.htm"/>
    ??? </bean>

    ??? <!-- this bean with the well known name generates view names for us -->
    ??? <!-- not strictly required since we just want to accept the defaults-->
    ??? <!-- 在Spring2.0中可以不指定View,而由RequestToViewNameTranslator,根據(jù)請求來提供View名

    稱。如想使用
    ??? ?RequestToViewNameTranslator那么請作如下配置,那么就會根據(jù)請求來選擇提供View,然后在

    viewResolver中找頁面 -->
    ??? <bean id="viewNameTranslator"

    class="org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator"/>
    <!-- View層解析器,根據(jù)傳回ModelAndView實例名稱來選擇View頁面 -->
    ??? <bean id="viewResolver"

    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    ??????? <property name="prefix" value="/WEB-INF/jsp/"/>
    ??????? <property name="suffix" value=".jsp"/>
    </bean>


    流程說明:在web.xml中配置:
    ??? <servlet>
    ??????? <servlet-name>coverc</servlet-name>?????? <servlet-

    class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    ?</servlet>

    這個前端控制器,來負責將客戶的請求轉(zhuǎn)發(fā)給控制對象Controller,針對于轉(zhuǎn)發(fā)方案,我們使用
    org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping
    來映射控制器,將請求與Controller類名自動匹配,如hello.do自動查找HelloController實例處理,但

    是必須要遵守命名規(guī)范。
    如果有映射到的Controller,那么用這個Controller來具體的控制,然后根據(jù)在Controller中的

    handleRequest中返回的ModelAndView方法的名稱來查找View頁面,并且將業(yè)務層數(shù)據(jù)來提交給View頁面


    我們使用org.springframework.web.servlet.view.InternalResourceViewResolver這個viewResolver來

    根據(jù)ModelAndView的名稱來選擇View 頁面,我們可以配置??????? <property name="prefix"

    value="/WEB-INF/jsp/"/>
    ?<property name="suffix" value=".jsp"/>
    來確定View頁面的地點,prefix是文件夾,suffix是文件后綴。
    ?在Spring2.0中可以不指定View,而由RequestToViewNameTranslator,根據(jù)請求來提供View名

    稱。如想使用RequestToViewNameTranslator那么請作如下配置:
    <bean id="viewNameTranslator"

    class="org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator"/>
    那么就會根據(jù)請求來選擇提供View,然后在viewResolver中找頁面。

    屬性編輯器:
    a) 在BaseCommandController及其子類中的屬性編輯器,重寫initBinder這個方法中注冊:
    binder.registerCustomEditor(Long.class, new RecipeEditor());
    ?繼承至java.beans.PropertyEditorSupport 將參數(shù)轉(zhuǎn)換為指定的對象用setAsText,如果想把

    指定的對象轉(zhuǎn)換成String請用getAsText。
    b) 還有通過CustomEditorConfigurer這個BeanFactoryPostProcessor來配置PropertyEditor。做如下配

    置:
    <bean id=”configBean” class=”

    org.springframework.beans.factory.config.CustomEditorConfigurer”>
    <property name=”customEditors”>
    ?<map>
    ??<entry key=”onlyfun.caterpillar.User”>
    ?<bean id=”userEditor” class=”onlyfun.caterpillar.UserEditor”/>
    </entry>
    </map>
    </property>
    </bean>
    2、?formtags
    1)、如果WebApp中沒有配置Handler Mapping,那么它就會使用默認的Handler Mapping ,也就是

    BeanNameUrlHandlerMapping,它根據(jù)Controller定義中的Bean標簽中的name屬性的URI,來決定使用哪個

    Controller。
    ?2)、ModelAndView中的addObject 通過這里得到存儲在modelObject中的對象的簡單的類名在加

    上Conventions提供的suffix(List)就成為添加在ModelMap中的對象了。
    3)、如果在Spring中沒有配置RequestToViewNameTranslator,那么系統(tǒng)會給我們一個默認的

    DefaultRequestToViewTranslator,根據(jù)URI請求,或者映射路徑產(chǎn)生。如果我們沒有指定viewName,那

    么則使用RequestToViewNameTranslator。
    ViewName付給當前的ModelAndView,然后根據(jù)當前ModelAndView取得View對象,有View對象進行數(shù)據(jù)存

    儲,以及根據(jù)ViewName進行頁面的轉(zhuǎn)發(fā)或跳轉(zhuǎn)。
    4)、可以在下面配置commandName 和 commandClass, 否則使用默認的,也就是根據(jù)返回的對象的實際

    的Class信息為commandClass,以默認的“command”為commandName,我們從JSP頁面中可以使用這一名

    稱讀取數(shù)據(jù)。
    ?<bean name="/form.htm"
    <property name=”commandName” value=”user”/>
    <property name=”commandClass” value=”test.User”/>
    class="org.springframework.showcase.formtags.web.FormController">
    </bean>
    5)、主要流程
    DispatcherServlet的doService方法調(diào)用doDispatch為處理者處理實際的頁面分派任務。
    通過servlet的HandlerMapping取得實際的Handler,然后委托給一個servlet預裝的HandlerAdapter進行

    實際的處理工作,再用這個handlerAdapter取得實際Controller進行實際的操作。
    首先調(diào)用其handlerRequest方法,其實是調(diào)用實際的AbstractController的handlerRequest方法,這里

    做了一些session的同步處理,然后調(diào)用handleRequestInternal方法進行實際的處理,每種不同的

    Controller實現(xiàn)有該方法有不同的實現(xiàn):
    我這里是AbstractFormController,是一種從request中對FormBean能進行自動的組裝的Controller,針

    對不同的請求isFormSubmission(POST==true)采用不同的策略,GET請求時調(diào)用showNewForm方法顯示

    表單頁面;
    如果是POST請求那么則進行request參數(shù)的FormBean綁定自動裝配,進行處理各種驗證處理等,然后調(diào)用

    processFormSubmission方法,如果有任何錯誤或異常都會調(diào)用showForm方法返回的form頁面,最后調(diào)用

    onSubmit進行頁面跳轉(zhuǎn)。
    6)、總結(jié):
    ?使用Spring的form tag雖然是在使用Spring MVC的最優(yōu)方案,它能優(yōu)美的使request的參數(shù)與

    model模型對象進行綁定,而不像struts那樣需要定義額外的formbean類(當然Struts動態(tài)bean也可以避

    免),所以如果使用Spring MVC務必請使用Spring Form Tag,至于View的邏輯控制請使用JSTL。

    ?

    posted on 2009-11-04 21:18 vagasnail 閱讀(2180) 評論(0)  編輯  收藏 所屬分類: Java Web


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 成人特黄a级毛片免费视频| 亚洲天然素人无码专区| 国产一区在线观看免费| 免费观看激色视频网站(性色)| 国产特黄一级一片免费| 亚洲国产精品无码第一区二区三区| 亚洲日本精品一区二区| 夜夜春亚洲嫩草影院| 免费人成在线观看网站品爱网日本| 精品福利一区二区三区免费视频| a国产成人免费视频| 久香草视频在线观看免费| 久久精品国产亚洲av天美18| 亚洲特级aaaaaa毛片| 亚洲av无码不卡一区二区三区| 亚洲国产成人久久一区WWW| 日本高清免费aaaaa大片视频| 57pao国产成视频免费播放 | 2021在线永久免费视频| 日韩av无码免费播放| 抽搐一进一出gif免费视频| 人成午夜免费大片在线观看| 美女裸免费观看网站| 最新亚洲人成无码网站| 亚洲AV色欲色欲WWW| 亚洲成在人线在线播放无码| 亚洲视频在线观看2018| 亚洲免费福利在线视频| 亚洲国产韩国一区二区| 亚洲老熟女@TubeumTV| 亚洲精品视频久久| 亚洲婷婷在线视频| 亚洲一区二区三区亚瑟 | 青青青免费国产在线视频小草| 久99久精品免费视频热77| 久久免费视频网站| 久操免费在线观看| 91成人免费观看| 97热久久免费频精品99| 中国在线观看免费国语版| 久久久久久99av无码免费网站|