1. 程式人生 > >SpringMVC學習筆記(三)

SpringMVC學習筆記(三)

SpringMVC(三)

檢視和檢視解析器
-請求處理方法執行完成後,最終返回一個ModelAndView物件。對於那些返回String,View或ModeMap等型別的處理方法,SpringMVC也會在內部將它們裝配成一個ModelAndView物件,它包含了邏輯名和模型物件的檢視
-SpringMVC藉助檢視解析器(ViewResolver)得到最終的檢視物件(View),最終的檢視可以是JSP,也可能是Excel、JFreeChart等各種表現形式的檢視

  • 檢視
    檢視的作用是渲染模型資料,將模型裡的資料以某種形式呈現給客戶。檢視物件由檢視解析器負責例項化。由於檢視是無狀態的,所以他們不會有執行緒安全問題。
  • 檢視解析器
    SpringMVC為邏輯檢視名的解析提供了不同的策略,可以在Spring WEB上下文中配置一種或多種解析策略,並指定他們之間的先後順序。每一種對映策略對應一個具體的檢視解析器實現類。
    作用:將邏輯檢視解析為一個具體的檢視物件。
    所有的檢視解析器都必須實現ViewResolver介面
  • InternalResourceViewResolver
    JSP是最常見的檢視技術,可以使用InternalResourceViewResolver作為檢視解析器:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- 字首 -->
		<property name="prefix" value="/WEB-INF/views/"></property>
		<!-- 字尾 -->
		<property name="suffix" value=".jsp"></property>
	</bean>

作了解:
若專案中使用了JSTL,則SpringMVC會自動把檢視由InternalResourceViewResolver轉為JstlView。
若使用了JSTL的fmt標籤則需要在SpringMVC的配置檔案中配置國際化資原始檔

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n"/>
</bean>
value的值為資原始檔字首

若希望直接響應SpringMVC渲染的頁面,可以使用mvc:view-controller標籤實現(不經過handler)

<mvc:view-controller path="springmvc/testJstlView" view-name="success'/>

在實際開發中通常需要配置<mvc:annotation-driven標籤一同使用(使得配置mvc:view-controller 後,之前的handler依然起作用)

<mvc:annotation-driven></mvc:annotation-driven>

-自定義檢視

<!-- 配置BeanNameViewResolver檢視解析器:使用檢視的名字解析檢視 -->
	<!-- 通過order屬性來定義檢視解析器的優先順序,order值越小,優先順序越高 -->
	<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
		<property name="order" value="100"></property>
	</bean>
  • 重定向
    一般情況下,控制器方法返回字串型別的值會被當成邏輯檢視名處理
    如果返回的字串中帶forward:或redirect:字首時,SpringMVC會對他們進行特殊處理:將forward:和redirect:當成指示符,其後的字串作為URL處理
    -redirect:success.jsp:會完成一個到success.jsp的重定向的操作
    -forward:success.jsp:會完成一個到success.jsp的轉發操作

  • Spring表達標籤

    <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
    
<form:form action="emp" method="POST" modelAttribute="employee">
...	  //注意,其中標籤的path值對應html表單標籤name屬性值
</form>

通過SpringMVC的表單標籤可以實現將模型資料中的屬性和HTML表單元素相繫結,以實現表單資料更便捷編輯和表單值的回顯。
注意:可以通過modelAttribute屬性指定繫結的模型(bean)屬性(預設為command)在向request域新增屬性時新增,若沒有指定該屬性,則預設從request域物件中讀取command的表單bean,如果該屬性值也不存在,則會發生錯誤。

  • SpringMVC靜態資源
    REST風格的資源URL不希望帶.html或.do等字尾
    若將DispatcherServlet請求對映配置為 /,則SpringMVC將捕獲WEB容器的所有請求,包括靜態資源的請求,SpringMVC會將他們當成一個普通請求處理,因找不到對應處理器將導致錯誤。
    解決方法:
    可以在SpringMVC的配置檔案中配置<mvc:default-servlet-handler/>的方式解決靜態資源的問題:
    -mvc:default-servlet-handler/將在SpringMVC上下文中定義一個DefaultServletHttpRequestHandler,它會對進入DispatcherServlet的請求進行篩查,如果發現是沒有經過對映的請求,就將該請求交由WEB應用伺服器的預設Servlet處理,如果不是靜態資源的請求,才由DispatcherServlet繼續處理。
    -一般WEB應用伺服器預設的Servlet的名稱都是default。若所使用的WEB伺服器的預設Servlet名稱不是default,則需要通過default-servlet-name屬性顯示指定。
    注意:配合mvc:annotation-driven一同使用
    <!-- 設定配置方案 -->
    <mvc:annotation-driven/>
    	
    <!-- 使用預設的servlet來響應靜態檔案 -->
    <mvc:default-servlet-handler/>
  • SpringMVC資料繫結流程
    1、SpringMVC主框架將ServletRequest物件及目標方法的入參例項傳遞給WebDataBinderFactory例項,以建立DataBinder例項物件。
    2、DataBinder呼叫裝配在SpringMVC上下文中的ConversionService元件進行資料型別轉換、資料格式化工作。將Servlet中請求資訊填充到入參物件中
    3、呼叫Validator元件對已經綁定了請求訊息的入參物件進行資料合法性校驗,並最終生成資料繫結結果BindingData物件
    4、SpringMVC抽取BindingResult中的入參物件和校驗錯誤物件,將它們賦給處理方法的響應入參。

  • 自定義型別轉換器(作了解)
    。。。。。。

  • mvc:annotation-driven
    <mvc:annotation-driven/>會自動註冊RequestMappingHandlerMapping、RequestMappingHandlerAdapter與ExceptionHandlerExceptionResolver三個bean。
    還提供以下支援:
    -支援使用ConversionService例項對錶單引數進行型別轉換
    -支援使用@NumberFormatannotation、@DateTimeFormat註解完成資料型別的格式化
    -支援使用@Valid註解對JavaBean例項進行JSR303驗證
    -支援使用@RequestBody和@ResponseBody註解

  • @InitBinder
    由@InitBinder標識的方法,可以對WebDataBinder物件進行初始化。WebDataBinder是DataBinder的子類,用於完成由表單欄位到JavaBean屬性的繫結
    [email protected]方法不能有返回值,它必須宣告為void
    [email protected]方法的引數通常是WebDataBinder