posts - 0, comments - 77, trackbacks - 0, articles - 356
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Spring MVC

          Posted on 2007-03-16 11:50 semovy 閱讀(2262) 評(píng)論(0)  編輯  收藏 所屬分類: spring

          1.總體設(shè)計(jì)

          ??????MVC框架如Struts、Webwork,都在Servlet的基礎(chǔ)上創(chuàng)建了一個(gè)自己的絕對(duì)空間,在自己的空間里定義MVC世界和規(guī)則。無(wú)論這個(gè)世界定義得是否漂亮,程序員都有一個(gè)學(xué)習(xí)世界的過(guò)程。

          ????? 而Spring MVC則完全保留著Servlet概念中的request,response和session,并沒(méi)有強(qiáng)制建立一個(gè)自己的概念模型(當(dāng)然,他也有很爛的SimpleFormController,但你完全可以把它踢在一旁不管),也不強(qiáng)制需要FormBean和一堆XML定義。

          ????? 同時(shí),它透明完成了與Spring的集成,Multi-action的派發(fā),提供了綁定request數(shù)據(jù)用的binder等基本API。

          ??????所以,如果想簡(jiǎn)單,使用Spring MVC的原始形態(tài)是一個(gè)很好的,類似于RoR中ActionPack的方案。

          ????? 推薦使用一個(gè)Controller響應(yīng)一組相關(guān)動(dòng)作的MultiActionController。同時(shí),雖然一點(diǎn)不喜歡FormController定義的概念模型,但還是不影響發(fā)揮拿來(lái)主義,在共性比較明顯后臺(tái)管理模塊,定義MultiActionFormController,自動(dòng)完成某些共同的Form流程。

          ????? 你還是很喜歡WebWork?好在我們也提供了sample,見(jiàn)2.4 WebWork

          2.寫(xiě)給在用其他MVC框架程序員的快速入門

          ????? 也許,所有程序員都先放下自己框架里的概念模型,還原回一個(gè)JSP/Servlet程序員的角度,思考一個(gè)JSP/Servlet框架需要的功能。

          ?????0.?配置文件

          ???????? Spring的配置文件默認(rèn)為WEB-INF/xxxx-servelet.xml。

          ???????? 其中xxx為web.xml中org.springframework.web.servlet.DispatcherServlet的servlet-name。

          ???? 1. 與Spring集成及IOC

          ????????? 天然兮,由DispatcherServlet完成。

          ????? 2. Action及Multi-Action 分發(fā)

          ????????? Spring將按照配置文件定義的URL,Mapping到具體Controller類,再根據(jù)URL里的action= xxx或其他參數(shù),利用反射調(diào)用Controller里對(duì)應(yīng)的Action方法。

          ????? 3. 輸入數(shù)據(jù)綁定

          ????????? Spring提供Binder 通過(guò)名字的一一對(duì)應(yīng)反射綁定Pojo,也可以直接從request.getParameter()取數(shù)據(jù)。

          ????????? 如果沒(méi)有另外加入框架封裝,需要手工調(diào)用Binder.

          ????? 4. 輸入數(shù)據(jù)驗(yàn)證

          ????????? Sping 提供了Validator接口,而Spring Module還整合了Commons-Validaor 。

          ????? 5. 結(jié)果數(shù)據(jù)放回View

          ????????? 有個(gè)ModelAndView的概念,代表了返回的View名及數(shù)據(jù)(Model,一個(gè)Map)??梢杂胢odelAndView.addObject()放入數(shù)據(jù)。當(dāng)然,也可以直接request.setAttribute()。

          ????? 6. Interceptor

          ????????? AOP概念,其實(shí)Servlet里面早有Filter概念,不過(guò)Inteceptor可以更靈活的Mapping,另提供postHandle的插入點(diǎn)

          ????????? preHandle() handler開(kāi)工之前。
          ??????????postHandle() hander開(kāi)工之后,但DispatchServlet還沒(méi)有渲染頁(yè)面。
          ??????????afterCompletion() 一切完工之后。
          ????????

          ????? 7. Redirect,F(xiàn)orward頁(yè)面及Token防止重復(fù)提交。

          ????????? Spring提供 "redirect:index.jsp", "forward:index.jsp"這樣的簡(jiǎn)寫(xiě)。

          ????????? Spring Simple Form提供了防止重復(fù)提交的機(jī)制。

          ????? 8. 如果想直接編寫(xiě)Response返回字符串, 而不是返回一個(gè)View

          ????????? 將函數(shù)的返回類型設(shè)為void,使用ss封裝的 rendText(response,String text)函數(shù)。

          3.Spring MVC Multi-action

          3.1 基本配置

             <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
          ??????? <property name="paramName">
          ??????????? <value>method</value>
          ??????? </property>
          ??????? <property name="defaultMethodName">
          ??????????? <value>index</value>?????? ? </property> </bean>

          以上配置將按xxx.do?method= list 將調(diào)用controller的list()方法

          不過(guò)還要爭(zhēng)取早日改為Web2.0式的寫(xiě)法./book/list.htm 要優(yōu)于/book.do?action= list。

          其余配置和其他Spring MVC配置差不多,請(qǐng)看bookstore-servlet.xml,留意下面幾個(gè)關(guān)鍵節(jié)點(diǎn)
          <bean id="exceptionResolver">
          <bean id="methodNameResolver">
          <bean id="viewResolver">
          <bean id="urlMapping">(留意最新的urlMapping簡(jiǎn)寫(xiě)語(yǔ)法.)

          4.SpringSide BaseController

          ???繼承于Spring的MultiActionController, 對(duì)其作了少量擴(kuò)展--主要是對(duì)數(shù)據(jù)綁定的擴(kuò)展,還加了一個(gè)SaveMessage函數(shù)。

          ???1.對(duì)數(shù)據(jù)綁定的擴(kuò)展:

          ?? a.InitBinder() 初始化Binder,注冊(cè)日期類并允許數(shù)字類為空。

          ???b.對(duì)Bind and Validate函數(shù)的再包裝
          ? ?本來(lái)Spring已有bind函數(shù)完成bind and validate, 但這個(gè)函數(shù)一來(lái)沒(méi)有使用BindException作返回值而是拋出一個(gè)ServletException只好自己另外實(shí)現(xiàn)一個(gè)bindObject()函數(shù)。

          ???c.另外稍稍擴(kuò)展了一些函數(shù)使其更好用。

          2.SaveMessage():

          如果是redirect的關(guān)系,message信息放在request.attribute()就會(huì)丟失,SaveMessage()將其放在session。
          ?配合messageFilter,在渲染頁(yè)面前,把它從session又移回request。

          5.后臺(tái)管理通用的BaseManageController

          ??Spring MVC中的SimpleFormController中的交互機(jī)制有值得參考的部分,但其只有一個(gè)onSubmit函數(shù)不能很好的表達(dá)CRUD的語(yǔ)義,所以將兩者結(jié)合成Multi-ActionFormController是比較好的方法。通過(guò)約定命名,在基類實(shí)現(xiàn)list(),create()等函數(shù)和默認(rèn)流程,而在子類實(shí)現(xiàn)onList(),onCreate()函數(shù)。

          ?? 目前只是初步結(jié)合兩者,還有很大的改進(jìn)空間。

          ? ?參考了RoR中的命名。BaseManageController即按照此命名定義基類。

          1. list 顯示對(duì)象列表的頁(yè)面
          2. create新增對(duì)象的輸入界面
          3. edit 修改對(duì)象的輸入界面
          4. show 只讀顯示對(duì)象detai的頁(yè)面
          5. save 新增對(duì)象的保存
          6. update 修改對(duì)象的保存
          7. remove 刪除單個(gè)對(duì)象
          8. removeAll 批量刪除對(duì)象
          9. query 查詢
          主站蜘蛛池模板: 金川县| 田东县| 新丰县| 应用必备| 涟源市| 怀柔区| 萍乡市| 遵义市| 山东| 砚山县| 万州区| 西安市| 泸定县| 武穴市| 六安市| 古交市| 南郑县| 东兴市| 巴彦淖尔市| 阿荣旗| 鲁甸县| 霸州市| 天台县| 阿克陶县| 宁陵县| 疏勒县| 浦东新区| 贺兰县| 玉屏| 罗源县| 乐平市| 舟山市| 南昌县| 南昌市| 娱乐| 南皮县| 张北县| 耿马| 吉首市| 松原市| 长宁县|