歡迎使用我的 在線工具

          小D

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

          Spring MVC框架(通過(guò)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 將請(qǐng)求與Controller類(lèi)名自動(dòng)匹配 如hello.do自動(dòng)

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

          文件名,在默認(rèn)的MethodNameResolver中是
          ??? ?用來(lái)匹配Controller的方法,如果沒(méi)有路徑,那么也就根據(jù)這個(gè)文件名來(lái)匹配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
          ??? ? 簡(jiǎn)單的繼承一個(gè)虛擬的類(lèi),記住這里的繼承不是真正意義上的基礎(chǔ),而是在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ù)請(qǐng)求來(lái)提供View名

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

          viewResolver中找頁(yè)面 -->
          ??? <bean id="viewNameTranslator"

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

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


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

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

          這個(gè)前端控制器,來(lái)負(fù)責(zé)將客戶的請(qǐng)求轉(zhuǎn)發(fā)給控制對(duì)象Controller,針對(duì)于轉(zhuǎn)發(fā)方案,我們使用
          org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping
          來(lái)映射控制器,將請(qǐng)求與Controller類(lèi)名自動(dòng)匹配,如hello.do自動(dòng)查找HelloController實(shí)例處理,但

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

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


          我們使用org.springframework.web.servlet.view.InternalResourceViewResolver這個(gè)viewResolver來(lái)

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

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

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

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

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

          指定的對(duì)象轉(zhuǎn)換成String請(qǐng)用getAsText。
          b) 還有通過(guò)CustomEditorConfigurer這個(gè)BeanFactoryPostProcessor來(lái)配置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中沒(méi)有配置Handler Mapping,那么它就會(huì)使用默認(rèn)的Handler Mapping ,也就是

          BeanNameUrlHandlerMapping,它根據(jù)Controller定義中的Bean標(biāo)簽中的name屬性的URI,來(lái)決定使用哪個(gè)

          Controller。
          ?2)、ModelAndView中的addObject 通過(guò)這里得到存儲(chǔ)在modelObject中的對(duì)象的簡(jiǎn)單的類(lèi)名在加

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

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

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

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

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

          稱讀取數(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為處理者處理實(shí)際的頁(yè)面分派任務(wù)。
          通過(guò)servlet的HandlerMapping取得實(shí)際的Handler,然后委托給一個(gè)servlet預(yù)裝的HandlerAdapter進(jìn)行

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

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

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

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

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

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

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

          model模型對(duì)象進(jìn)行綁定,而不像struts那樣需要定義額外的formbean類(lèi)(當(dāng)然Struts動(dòng)態(tài)bean也可以避

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

          ?

          posted on 2009-11-04 21:18 vagasnail 閱讀(2182) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Java Web


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 竹北市| 永顺县| 青铜峡市| 筠连县| 灵山县| 海口市| 林甸县| 崇阳县| 华池县| 和林格尔县| 合肥市| 万安县| 惠东县| 蛟河市| 抚顺市| 夹江县| 沿河| 台江县| 高州市| 永善县| 肥乡县| 佛坪县| 南乐县| 曲周县| 麻江县| 大城县| 金沙县| 庐江县| 右玉县| 夏津县| 阿克陶县| 华容县| 本溪市| 荥阳市| 大邑县| 乌鲁木齐县| 武汉市| 兴山县| 孟州市| 海门市| 巴林右旗|