程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Spring學習點滴,《Spring in Action》筆記(五)

Spring學習點滴,《Spring in Action》筆記(五)

編輯:關於JAVA

第八章. 建立 Web 層

71. Spring 的 MVC 和 Struts 的 MVC 基本一致

Spring 的控制流程是:請求->DispatcherServlet->從 HandlerMapping 中查詢到處理該請求 的 Controller-> Controller 的 handleRequest 方法調用業務方法,最後返回 ModelAndView (ModelAndView告訴了 DispatcherServlet 轉向到哪個視圖)

Struts 的控制流程是:請求->ActionServlet->從 ActionMapping 中查詢到處理該請求的 Controller (Action類)->Action 的execute 方法調用業務方法,最後返回 ActionForward (ActionForward告訴了 ActionServlet 該轉向到哪個視圖)(P243)

72. Spring 的 DispatcherServlet 和 Struts 的 ActionServlet 的配置方式是一樣的,都是作為一 個自啟動的 Servlet 配置到 web.xml 中。Spring 的 url-pattern 的配置慣例是 *.htm,而 Struts 通 常是配置成 *.do 或 *.action,它暴露了 web 使用的技術。(P244)

73. Spring 中配置了

<servlet-mapping>
  <servlet-name>unmi</servlet-name>
   <url-pattern>*.html</url-pattern>
</servlet-mapping> 

後,在初始化相應的 DispatcherServlet 時會自動加載 /WEB-INF/unmi-servlet.xml 文件,它是一 個普通的 Spring Bean 配置文件,也是由 WebApplicationContext 加載。其他的 Bean 配置文件需要像 通常的做法由 ContextLoaderListener 或 ContextLoaderServlet 來加載。Spring MVC 內部要使用到的 Bean 就從 unmi-servlet.xml 中獲取(P244)

73. Struts 1.2? 後開始可以在 struts-cnfig.xml 中給 Action 注入簡單屬性,而 Spring 配置 controller 時可以注入所有類型屬性(P247)

74. 在 unmi-servlet.xml 中配置的下面這段代碼,Spring 將對請求 URL 是 "/home.html" 結尾的 分派給 HomeController 處理,DispatcherServlet 使用的默認處理器映射是 BeanNameUrlHandlerMapping(P247)

<bean name="/home.html" class="com.unmi.HomeController">
<property name="greeting"><value>Welcome to Spring Training</value></property>
</bean>

75. Spring 最簡單的視圖解析器是 InternalResourceViewResoler,如在 unmi-servlet.xml 有下配 置

<bean id="viewResolver" 

class="org.springframework.web.servlet.view.InternalResourceViewResoler">
<property name="prefix"><value>/WEB- INF/jsp/</value></proeprty>
<property name="surfix"><value>.jsp/</value></proeprty>
</bean> ;

那麼,當 HomeController 中 返回 return new ModelAndView("home"); 時將會解析成由視圖 /WEB -INF/jsp/home.jsp 來展示(P248)

76. 前面只是在 unmi-servlet.xml 配置上 InternalResourceViewResoler,那麼 Spring 怎麼就知 道該用哪個 viewResolver 呢?那要從配置在 web.xml 中的 DispatchServlet 說起。類的層級關系及初 始化時方法調用關系如下:

   HttpServlet.init(ServletConfig)
∟HttpServletBean.init()
∟FrameworkServlet.initServletBean()
∟DispatcherServlet.initFrameworkServlet()

初始化 HandlerMapping、ViewResolver等的方法就在 DispatcherServlet.initFrameworkServlet() 方法中,依次調用的是:

 initMultipartResolver();
 initLocaleResolver();
 initThemeResolver();
  initHandlerMappings();
 initHandlerAdapters();
 initHandlerExceptionResolvers();
 initViewResolvers();

我們看 initViewResolvers(); 的實現,如果 detectAllViewResolvers(默認為 true) 為 true 的話 就從 Spring 配置(unmi-servlet.xml)中獲取所有類型為 ViewResolver 的 Bean,否則就只獲取名為 VIEW_RESOLVER_BEAN_NAME(即“viewResolver”) 的 ViewResolver(視圖解析器)。初始化 HandlerMapping的原則也是一樣的。(P248)

77. 有三種類型的請求映射控制器,實現的是 HandlerMapping 接口

BeanNameUrlHandlerMapping -- 根據控制器的名字將控制器映射到 URL

SimpleUrlHandlerMapping -- 用上下文配置文件中定義的屬性集合將控制器映射到 URL

CommonsPathMapHandlerMapping -- 使用控制器代碼中的元數據將控制器映射到 URL

DispatcherServlet 缺省映射處理器是 BeanNameUrlHandlerMapping,它將表現層 URL 和控制器名字 綁定起來了, Spring 不建議使用這個映射處理器,建議用 SimpleUrlHandlerMapping。可是我覺得用 BeanNameUrlHandlerMapping 挺方便的啊(P250)

78. 使用 SimpleUrlHandlerMapping 的配置,需要將系統中用到的 URL 一一邏列出來(P251)

<bean id="simpleUrlMapping" 

class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/listCourse.html">listCoursesController</prop>
<prop key="/register.htm">registerStudentController</prop>
</props>
</peroperty>
</bean>

79. 使用 CommonsPathMapHandlerMapping 需要為 Controller 類注解上 PathMap 屬性為一個 URL。 是否用注解還是用配置文件一直存在爭議,而我是不喜歡把配置的東西放到源代碼中,這像是在硬編碼, 所以應該不會考慮用這種方式。(P252)

80. 可用同時配置多映射處理器,通過配置它們實現的 Ordered 接口的 order 屬性, DispatcherServlet 按順序采用哪個映射處理器(責任鏈模式)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved