歡迎使用我的 在線工具

          小D

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

          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(本質) of the convention over configuration support(配置文檔協議支

          持)
          and nothing else.

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

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

          文件名,在默認的MethodNameResolver中是
          ??? ?用來匹配Controller的方法,如果沒有路徑,那么也就根據這個文件名來匹配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,根據請求來提供View名

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

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

          class="org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator"/>
          <!-- View層解析器,根據傳回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>

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

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

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


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

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

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

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

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

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

          指定的對象轉換成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,它根據Controller定義中的Bean標簽中的name屬性的URI,來決定使用哪個

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

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

          DefaultRequestToViewTranslator,根據URI請求,或者映射路徑產生。如果我們沒有指定viewName,那

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

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

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

          稱讀取數據。
          ?<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方法調用doDispatch為處理者處理實際的頁面分派任務。
          通過servlet的HandlerMapping取得實際的Handler,然后委托給一個servlet預裝的HandlerAdapter進行

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

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

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

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

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

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

          onSubmit進行頁面跳轉。
          6)、總結:
          ?使用Spring的form tag雖然是在使用Spring MVC的最優方案,它能優美的使request的參數與

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

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

          ?

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


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


          網站導航:
           
          主站蜘蛛池模板: 阳城县| 平塘县| 凭祥市| 拜泉县| 乌恰县| 桐柏县| 新绛县| 林芝县| 隆尧县| 保定市| 大余县| 遂川县| 增城市| 伊川县| 高要市| 花垣县| 保靖县| 浮梁县| 通化县| 锡林浩特市| 大方县| 宜章县| 盘山县| 当雄县| 广昌县| 新晃| 巫溪县| 蒙城县| 高台县| 汕头市| 宽城| 余江县| 宜君县| 唐海县| 揭东县| 曲水县| 淳化县| 新巴尔虎左旗| 深泽县| 孟连| 南江县|