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

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

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

    推薦淘寶秋冬男裝熱賣網店

    追求無止境

    我的程序人生
    隨筆 - 31, 文章 - 2, 評論 - 20, 引用 - 0
    數據加載中……

    Spring的MVC web框架學習筆記

    1、Spring web 框架的核心:DispatcherServlet

    DispatcherServlet 用于接收請求。是使用Spring框架的入口。在web.xml中,需要配置該servlet。在配置該Servlet的時候url-pattern你可以使用你自己想使用的形式,如*.aspx,*.do,*.htm,*.action,用以混淆客戶端對服務器架構的認識。

    另外,該Servlet在容器中還會加載一個APPlicationContext的xml文件。默認加載的是[servlet-name]-servlet.xml。例如,你在web.xml中配置的servlet如下:

    <web-app>
    <servlet>
    <servlet-name>example</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>example</servlet-name>
    <url-pattern>*.form</url-pattern>
    </servlet-mapping>
    </web-app>
    
    該Servlet就會在服務器啟動時,加載example-servlet.xml。當然,你也可以自己來指定加載文件。
    要看看DispatcherServlet真面目,打開源文件,發現定義了很多BeanName的常量,如本地化解析器beanname,主題解析器beanname,視圖解析器beanname,上傳文件解析的multipart解析器beanname。
    等:
    public static final String MULTIPART_RESOLVER_BEAN_NAME = "multipartResolver";
    public static final String LOCALE_RESOLVER_BEAN_NAME = "localeResolver";
    public static final String THEME_RESOLVER_BEAN_NAME = "themeResolver";
    public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
    public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
    public static final String HANDLER_EXCEPTION_RESOLVER_BEAN_NAME = "handlerExceptionResolver";
    public static final String REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME = "viewNameTranslator";
    public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
    
    這個類怎么使用這些bean呢?以上面的exexample-servlet.xml為例,我們定義的名字為example的DispatcherServlet使用example-servlet.xml的配置。在example-servlet.xml里,我們可以配置名字上面的beanName的bean,來讓servlet加載這些bean。
    這下明白了,servlet.xml該怎么配置,該配置什么了。
    好了,看完了最重要的servlet的配置問題,我們再看下一個重要的接口:Controller。至于上面servlet要使用的什么什么解析器啦,我們稍后在分析。
     
    2、Controller
    我們的請求提交到DispacherServlet后,會轉給Controller。怎么找Controller?通過使用handlerMapping。如果沒有設置handlerMapping,spring使用默認的BeanNameUrlHandlerMapping來找Controller。
    BeanNameUrlHandlerMapping?顧名思義,就是通過bean的name屬性來映射controller。bean的name請求是一個url,如果請求的是logout.do,在example-servlet.xml中定義一個名字(name)為login.do的Controller.

    <bean name="/logout.do" class="com.jy.bookshop.web.spring.LogoutController">
        </bean>

    再插一句話,在handlerMapping中,我們可以使用請求攔截器來對請求進行攔截處理。該攔截器怎么使用這里暫且不表,有機會再討論。

    ok,現在我們創建一個LogoutController來讓他處理請求,讓他實現Controller吧:

    public class LogOutController implements Controller {
        public ModelAndView handleRequest(HttpServletRequest req,
                HttpServletResponse res) throws Exception {
              …
            return new ModelAndView(new RedirectView("login.do"));
        }
    }
    看看這個Controller接口的定義,發現這個接口只定義了一個handleRequest方法。在這個方法中,返回一個ModelAndView。
    先說ModelAndView。我們知道MVC,那么ModelAndView就是 MV了。Controller就是C。這樣MVC全了。呵呵。
    繼續說ModelAndView,要了解他的結構,那自然要看看他的源代碼了:
    /** View instance or view name String */
    private Object view; 
    
    /** Model Map */
    private ModelMap model;
    

       

        只關注我們關注的,里面包含了一個View對象和model對象。model對象是一個Map,這里不再說了。關鍵看看view,奇怪,怎么是一個Object,太抽象了。再繼續看源代碼的話,會更加明白:

     

    public ModelAndView(String viewName, String modelName, Object modelObject) {
            this.view = viewName;
            addObject(modelName, modelObject);
        }
    public void setViewName(String viewName) {
            this.view = viewName;
        }

    原來這個view可以指向一個View對象,也可以指向String對象啊。View一個接口,如果看doc的話,他的實現類有AbstractExcelView, AbstractJasperReportsSingleFormatView, AbstractJasperReportsView, AbstractJExcelView, AbstractPdfStamperView, AbstractPdfView,AbstractTemplateView, AbstractUrlBasedView, AbstractView, AbstractXsltView, ConfigurableJasperReportsView, FreeMarkerView, InternalResourceView,JasperReportsCsvView, JasperReportsHtmlView, JasperReportsMultiFormatView, JasperReportsPdfView, JasperReportsXlsView, JstlView, RedirectView,TilesJstlView, TilesView, TilesView, VelocityLayoutView, VelocityToolboxView, VelocityView, XsltView(誠實的說,這些View是拷doc的)。

    現在可以知道,我們的Controller返回一個View和Model,來讓Spring框架來創建一個回應。

    現在奇怪的還有一點,我吧view設置為字符串,Spring框架怎么處理?在ModelAndView中,如果view是一個字符串,則會將這個值交給DispatcherServlet的viewResovler來處理。記得上面提到的viewResovler了嗎?呵呵,派上用場了。

    view的問題解決了,然后再說model吧。在ModelAndView添加了一些對象,Spring是怎么處理的呢?總應該把這些對象給弄到request對象里,讓jsp頁面來使用吧。讓View使用?那么看看View接口吧:

    public interface View {
    
        String getContentType();
    
        void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception;
    
    }
    render函數需要帶一個model變量。再找找view的實現類,看看是怎么工作的。不過view有那么多,對于一些像什么pdf啦,excel了他們都不需要在request中添加這個model。
    最終呢,我們在jstlView的父類InternalResourceView中的renderMergedOutputModel函數發現他把model放在了request里面了。
     
    OK,現在我們明白了,controller返回的modelandview交給Servlet進行處理,來生成一個頁面。
    最簡單的Controller介紹完畢。現在看看Spring提供的一些controller的實現,Spring提供了很多controller的實現,繼承的結構如下:

     

    org.springframework.web.servlet.mvc.AbstractController (implements org.springframework.web.servlet.mvc.Controller)

    • org.springframework.web.servlet.mvc.AbstractUrlViewController
      • org.springframework.web.servlet.mvc.UrlFilenameViewController
    • org.springframework.web.servlet.mvc.BaseCommandController
      • org.springframework.web.servlet.mvc.AbstractCommandController
      • org.springframework.web.servlet.mvc.AbstractFormController
        • org.springframework.web.servlet.mvc.AbstractWizardFormController
        • org.springframework.web.servlet.mvc.SimpleFormController
          • org.springframework.web.servlet.mvc.CancellableFormController
    • org.springframework.web.servlet.mvc.ParameterizableViewController
    • org.springframework.web.servlet.mvc.ServletForwardingController (implements org.springframework.beans.factory.BeanNameAware)
    • org.springframework.web.servlet.mvc.ServletWrappingController (implements org.springframework.beans.factory.BeanNameAware, org.springframework.beans.factory.DisposableBean, org.springframework.beans.factory.InitializingBean)
      AbstractController是Controller的第一個實現。其他的Controller都是繼承這個Controller的。我們先看比較重要的Controller。
      先說UrlFilenameViewController。不如我們自己來部署一個吧。
      在example-servlet.xml中增加如下的配置:

      <bean name="/error.do"  class="org.springframework.web.servlet.mvc.UrlFilenameViewController">
          </bean>

      OK,當/error.do的請求上來后,urlFileNameViewController將他變成/error。然后返回個View,這個view的name就是/error,然后使用viewresolver來進行解析,可以解析成/jsp/error.jsp。
      另外還有比較重要的controller是baseCommandController,將請求參數轉換為一個對象,并對對象參數合法性進行驗證。另外,SimpleFormController可以對表單進行處理。
      關于各個controller的分析。未完待續。。

       

       

       

      posted on 2009-11-25 11:09 追求無止境 閱讀(3714) 評論(2)  編輯  收藏

      評論

      # re: Spring的MVC web框架學習筆記  回復  更多評論   

      spring mvc demo教程源代碼下載:http://zuidaima.com/share/kspringmvc-p1-s1.htm
      2015-06-19 10:06 | zuidaima

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


      網站導航:
       
      主站蜘蛛池模板: 国产亚洲精品va在线| 国产色爽女小说免费看| 亚洲精品乱码久久久久久中文字幕| 亚洲AV无码国产剧情| 天天拍拍天天爽免费视频| 国产亚洲精品成人AA片| 日韩一区二区a片免费观看| 亚洲人xxx日本人18| 免费一本色道久久一区| 国产 亚洲 中文在线 字幕| 久久综合AV免费观看| 亚洲欧洲AV无码专区| 老司机永久免费网站在线观看| 亚洲一区二区三区丝袜| 国产成人免费手机在线观看视频 | 亚洲免费网站观看视频| 亚洲国产精品乱码在线观看97| 亚洲一区二区三区免费在线观看| 亚洲成AV人片久久| 最近中文字幕mv免费高清电影 | 国产AV无码专区亚洲AWWW| 久久九九免费高清视频| 久久久久亚洲AV无码专区首| 中文字幕亚洲免费无线观看日本 | 亚洲一区二区三区在线播放| 日本高清不卡aⅴ免费网站| 亚洲黄网在线观看| 最近免费中文字幕4| 人禽伦免费交视频播放| 久久亚洲国产成人亚| 在线永久免费的视频草莓| 亚洲精品国产suv一区88| 亚洲国产小视频精品久久久三级| 成人黄网站片免费视频| 亚洲网站视频在线观看| 日韩视频在线免费| 野花香高清在线观看视频播放免费 | 免费人成视频在线观看免费| 亚洲AV永久无码区成人网站| 歪歪漫画在线观看官网免费阅读| 无码 免费 国产在线观看91|