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