1. 程式人生 > >Spring 梳理 - 檢視解析器 VS 檢視(View,ViewResolver)

Spring 梳理 - 檢視解析器 VS 檢視(View,ViewResolver)

  1. View
    1. View介面表示一個響應給使用者的檢視,例如jsp檔案,pdf檔案,html檔案等
    2. 該介面只有兩個方法定義,分別表明該檢視的ContentType和如何被渲染
    3. Spring中提供了豐富的檢視支援
  2. ViewResolver
    1. ViewResolver介面定義瞭如何通過view 名稱來解析對應View例項的行為,即:如何把控制器返回的“檢視名 字串” 解析為View例項,並渲染為HTML、PDF後推向瀏覽器
    2. 同樣Spring提供了豐富的ViewResolver實現用來解析不同的View
    3.  建立檢視時,Spring會檢查檢視名,有三種情況redirect檢視,forward檢視,普通檢視,進行了不同處理
  3. 多viewResolver檢視解析器解決方案
    1. DispatcherServlet會載入所有的viewResolver到一個list中,並按照優先順序進行解析。

      注意:①order中的值越小,優先順序越高。

      ②而id為viewResolver的viewResolver的優先順序是最低的。

    2. 如果某個解析器沒有找到合適的檢視,Spring會在上下文中尋找是否配置了其它的解析器。 如果有,它會繼續進行解析,否則,Srping會丟擲一個Exception
    3. <!-- 定義JSP檢視解析器-->  
      <bean id="
      jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/"></property> <property name="suffix" value=".jsp"></property> <property name="order" value="1" /> </bean> <bean id="freemarkerViewResolver
      " class="com.founder.web.commom.springmvc.view.ExtFreeMarkerViewResolver"> <property name="contentType" value="text/html; charset=UTF-8"/> <property name="exposeRequestAttributes" value="false"/> <property name="exposeSessionAttributes" value="false"/> <property name="exposeSpringMacroHelpers" value="true"/> <property name="cacheUnresolved" value="false"/> <property name="order" value="0" /> </bean>

       

    4. 要記住,當一個檢視解析器找不到合適的檢視時,它可能 返回null值。 但是,不是每個解析器都這麼做。這是因為,在某些情況下,解析器可能無法偵測出符合要求的檢視是否存在。 比如,InternalResourceViewResolver在內部呼叫了RequestDispatcher。 請求分發是檢查一個JSP檔案是否存在的唯一方法,不幸的是,這個方法只能用一次。 同樣的問題在VelocityViewResolver和其它解析器中也有。 當使用這些解析器時,最好仔細閱讀它們的Javadoc,看看需要的解析器是否無法發現不存在的檢視。 這個問題產生的副作用是,如果InternalResourceViewResolver解析器沒有放在鏈的末端, InternalResourceViewResolver後面的那些解析器根本得不到使用, 因為InternalResourceViewResolver總是返回一個檢視!
  4. InternalResourceView
    1. 配置InternalResourceViewResolver時可以指定一個viewClass,prefix,suffix,沒錯,就是他們,先說prefix,suffix,我們看到了它會分別新增到viewName的前後,組成檢視的URL。
    2. 那個viewClass呢就是檢視的class物件型別了。會發現在我們沒有指定的情況下預設是JstlView哦