InternalResourceViewResolver
對於視圖這一塊相信大家每天都在用,而且也都覺得用的很方便,而且用的最多的視圖解析器應該都是這傢伙:
org.springframework.web.servlet.view.InternalResourceViewResolver, 這一點我跟大家都是一樣的。以前也 從沒想着說去了解下其原理是什麼,今天沒事就看了下源碼,發現沒什麼好說的,還是隨便總結下吧,看源碼的過程就不貼了。
首先我們的方法無論返回的是String,ModelAndView還是View類型,在DispatcherServlet中都會給你轉換爲ModelAndView進行操作,這也是解析視圖的第一步,統一操作。然後將頁面帶過來的參數放在一個叫做mv的ModelAndView對象中通過一步步的解析(這些步驟其實就是各種解析可看可不看 ),最後到InternalResourceViewResolver中通過轉發到達目標頁面。總結得不好,說不出來意思,唉語文太差
JstlView
當然除了這個解析器外還有一些別的比如JstlView,這個解析器只需要我們將jstl的包導入上面所說的mv就會自動變成JstlView,也沒什麼好說的。
自定義視圖
有時候我們可能會用到自定義視圖,此時我們就需要
org.springframework.web.servlet.view.BeanNameViewResolver這個視圖解析器。通過源碼我們可以看到這個解析器是直接從MVC容器中通過視圖名來解析的,所以我們需要把自定義的視圖放到容器中去。而方法方法返回的就是自定義視圖在容器中的名字,得一一對應。在配置文件中BeanNameViewResolver配置如下
<!--自定義視圖的視圖解析器 -->
<!--order值越小視圖解析器的優先級越高 -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="100"></property>
</bean>
這裏的order是用來決定視圖解析器的優先級的因爲通常我們都還配了InternalResourceViewResolver,而他的order是最大值所以只要配了這個屬性就行。
接下來是自定義視圖類我們需要實現VIew類
@Component
public class MyView implements View {
@Override
public String getContentType() {
return "text/html"; //返回內容類型
}
@Override
public void render(Map<String, ?> arg0, HttpServletRequest arg1,
HttpServletResponse arg2) throws Exception {
arg2.getWriter().print("now time:"+new Date());
}
}
這裏在頁面上打印了當前時間,這樣自定義視圖就ok了
mvc:view-controller
至於這個標籤是讓我們直接訪問物理視圖文件即jsp文件而不經過方法,用法很簡單
<mvc:view-controller path="/success1" view-name="success"/>
這樣就ok了,當你輸入localhost:8080/SpringMvc/success1就會直接去訪問success.jsp
使用這個標籤時必須得加上
<mvc:annotation-driven></mvc:annotation-driven>
否則其他需要經過方法的訪問會出錯
以上有錯誤的歡迎指正,謝謝!