日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring viewResolver 类别

發布時間:2024/4/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring viewResolver 类别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?http://www.blogjava.net/Steven-bot/articles/361334.html

?

Spring web MVC 框架學習筆記 之 ViewResolver技術

ModelAndView對象中的view對象,可以使用字符串來讓Spring框架進行解析獲得適合的視圖。而解析View的就是ViewResolver技術。

ViewResolver的定義如下:

public interface ViewResolver {View resolveViewName(String viewName, Locale locale) throws Exception;} ? 在[spring-dispatcher-name]-servlet.xml中,可以定義viewResolver:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
??????? <property name="prefix" value="/jsp/"/>
??????? <property name="suffix" value=".jsp"/>
??? </bean>

來讓DispacherServlet進行加載默認的viewResolver,如果沒有設置viewResolver,spring使用InternalResourceViewResolver進行解析。

Spring實現ViewResolver的非抽象類且我們經常使用的viewResolver有以下四種:

InternalResourceViewResolver將邏輯視圖名字解析為一個路徑
BeanNameViewResolver將邏輯視圖名字解析為bean的Name屬性,從而根據name屬性,找定義View的bean
ResourceBundleResolver和BeanNameViewResolver一樣,只不過定義的view-bean都在一個properties文件中,用這個類進行加載這個properties文件
XmlViewResolver和ResourceBundleResolver一樣,只不過定義的view-bean在一個xml文件中,用這個類來加載xml文件

?

使用多視圖解析器:

我們不想只使用一種視圖解析器的話,可以在[spring-dispatcher-name]-servlet.xml定義多個viewResolver:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/jsp/"/><property name="suffix" value=".jsp"/></bean><bean id=”beanNameViewResolver” class=”...BeanNameViewResolver”><property name="order" value="1"></property></bean><bean id=”beanNameViewResolver” class=”...XmlViewResolver”><property name="order" value="0"></property></bean>

DispatcherServlet會加載所有的viewResolver到一個list中,并按照優先級進行解析。注意order中的值越小,優先級越高。而id為viewResolver

的viewResolver的優先級是最低的。

?

=============

spring學習筆記:配置視圖解析器ViewResolver

分類: Springframework 241人閱讀 評論(0) 收藏 舉報

我們在controller里面經常這樣return一個ModelAndView: return new ModelAndView('user', 'model', model);

DispatcherServlet靠ViewResolver把user解析為/WEB-INF/jsp/user.jsp:

常用的ViewResolver:

InternalResourceViewResolver:

[xhtml] view plaincopyprint?
  • <bean?class="org.springframework.web.servlet.view.InternalResourceViewResolver">??
  • ?<property?name="prefix"?value="/WEB-INF/jsp/"?/>??
  • ?<property?name="suffix"?value=".jsp"?/>??
  • </bean>??
  • <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /> </bean>

    其實InternalResourceViewResolver的工作很簡單: 在視圖邏輯名前面加上prefix,后面加上suffix;

    ResourceBundleViewResolver:把視圖邏輯名和真實文件的映射關系放在配置文件中.

    [xhtml] view plaincopyprint?
  • <bean?id="myViewResolver"?class="org.springframework.web.servlet.view.ResourceBundleViewResolver">??
  • ????<property?name="order"?value="1"/>??
  • ????<property?name="basename"?value="views"/>??
  • </bean>??
  • <bean id="myViewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"><property name="order" value="1"/><property name="basename" value="views"/> </bean>

    因為可以配置多個viewResolver,所以上面的resolver還有一個選項order, 標明優先級。

    views.properties放在classpath下面,內容大約是這樣的:

    userDetail.class=org.springframework.web.servlet.view.JstlView
    userDetail.url=/WEB-INF/jsp/userDetail.jsp

    userList.class=org.springframework.web.servlet.view.JstlView
    userList.url=/WEB-INF/jsp/userList.jsp
    ......

    我們可以在controller里面這樣返回一個ModelAndView:
    return new ModelAndView("userDetail","model", model);

    ?

    =========

    Spring MVC中的視圖解析ViewResolver

    分類: spring mvc學習筆記 1172人閱讀 評論(0) 收藏 舉報

    ??????? 在Spring MVC中,當Controller將請求處理結果放入到ModelAndView中以后,DispatcherServlet會根據ModelAndView選擇合適的視圖進行渲染。那么在Spring MVC中是如何選擇合適的View呢?View對象是是如何創建的呢?答案就在ViewResolver中,ViewResolver接口定義了resolverViewName方法,根據viewName創建合適類型的View實現。

    ??????? 那么,如何配置ViewResolver呢?在Spring中,ViewResolver作為Spring Bean存在,可以在Spring配置文件中進行配置,例如下面的代碼,配置了jsp相關的viewResolver。

    [xhtml] view plaincopyprint?
  • <!--?Resolves?view?names?to?protected?.jsp?resources?within?the?/WEB-INF/views?directory?-->??
  • ????<bean?class="org.springframework.web.servlet.view.InternalResourceViewResolver">??
  • ????????<property?name="prefix"?value="/WEB-INF/views/"/>??
  • ????????<property?name="suffix"?value=".jsp"/>??
  • ????</bean>??
  • <!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/></bean>

    ?????? 在Spring MVC中,因為ViewResolver是使用bean來配置的,所以擴展起來非常的容易,可以根據自己的需要定制ViewResolver,然后在配置文件中進行相關的配置即可。

    ???????ViewResolver接口聲明了resolverViewName方法,這個方法的主要功能是根據ModelAndView中給定的viewName信息,再結合相關的配置,創建出合適類型的View對象。

    ???????ViewResolver接口是在DispatcherServlet中進行調用的,當DispatcherServlet調用完Controller后,會得到一個ModelAndView對象,然后DispatcherServlet會調用render方法進行視圖渲染。

    [java] view plaincopyprint?
  • protected?void?render(ModelAndView?mv,?HttpServletRequest?request,?HttpServletResponse?response)?throws?Exception?{??
  • ????????//?Determine?locale?for?request?and?apply?it?to?the?response. ??
  • ????????Locale?locale?=?this.localeResolver.resolveLocale(request);??
  • ????????response.setLocale(locale);??
  • ??
  • ????????View?view;??
  • ????????if?(mv.isReference())?{??
  • ????????????//?We?need?to?resolve?the?view?name. ??
  • ????????????view?=?resolveViewName(mv.getViewName(),?mv.getModelInternal(),?locale,?request);??
  • ????????????if?(view?==?null)?{??
  • ????????????????throw?new?ServletException(??
  • ????????????????????????"Could?not?resolve?view?with?name?'"?+?mv.getViewName()?+?"'?in?servlet?with?name?'"?+??
  • ????????????????????????????????getServletName()?+?"'");??
  • ????????????}??
  • ????????}??
  • ????????else?{??
  • ????????????//?No?need?to?lookup:?the?ModelAndView?object?contains?the?actual?View?object. ??
  • ????????????view?=?mv.getView();??
  • ????????????if?(view?==?null)?{??
  • ????????????????throw?new?ServletException("ModelAndView?["?+?mv?+?"]?neither?contains?a?view?name?nor?a?"?+??
  • ????????????????????????"View?object?in?servlet?with?name?'"?+?getServletName()?+?"'");??
  • ????????????}??
  • ????????}??
  • ??
  • ????????//?Delegate?to?the?View?object?for?rendering. ??
  • ????????if?(logger.isDebugEnabled())?{??
  • ????????????logger.debug("Rendering?view?["?+?view?+?"]?in?DispatcherServlet?with?name?'"?+?getServletName()?+?"'");??
  • ????????}??
  • ????????view.render(mv.getModelInternal(),?request,?response);??
  • ????}??
  • protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {// Determine locale for request and apply it to the response.Locale locale = this.localeResolver.resolveLocale(request);response.setLocale(locale);View view;if (mv.isReference()) {// We need to resolve the view name.view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);if (view == null) {throw new ServletException("Could not resolve view with name '" + mv.getViewName() + "' in servlet with name '" +getServletName() + "'");}}else {// No need to lookup: the ModelAndView object contains the actual View object.view = mv.getView();if (view == null) {throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +"View object in servlet with name '" + getServletName() + "'");}}// Delegate to the View object for rendering.if (logger.isDebugEnabled()) {logger.debug("Rendering view [" + view + "] in DispatcherServlet with name '" + getServletName() + "'");}view.render(mv.getModelInternal(), request, response);}

    ??????? 在DispatcherServlet類中,init方法中已經進行了相關的初始化,配置的ViewResolver信息都存放在viewResolvers中。在render方法中調用resolverViewName方法,在這個方法中逐一調用ViewResolver去取得View對象。

    [java] view plaincopyprint?
  • protected?View?resolveViewName(String?viewName,?Map<String,?Object>?model,?Locale?locale,??
  • ????????HttpServletRequest?request)?throws?Exception?{??
  • ??
  • ????for?(ViewResolver?viewResolver?:?this.viewResolvers)?{??
  • ????????View?view?=?viewResolver.resolveViewName(viewName,?locale);??
  • ????????if?(view?!=?null)?{??
  • ????????????return?view;??
  • ????????}??
  • ????}??
  • ????return?null;??
  • }??
  • protected View resolveViewName(String viewName, Map<String, Object> model, Locale locale,HttpServletRequest request) throws Exception {for (ViewResolver viewResolver : this.viewResolvers) {View view = viewResolver.resolveViewName(viewName, locale);if (view != null) {return view;}}return null;}

    ??????? 在這里需要關于ViewResolver的選擇是通過循環進行的,只選擇第一個符合要求的,因此在定義ViewResolver時,需要注意定義其優先級。

    ????????下面就來著重關注一下ViewResolver的類結構。

    ?

    ?

    ?????? 關于View對象的創建,不同的ViewResolver的解決方法是各部相同的。如BeanNameViewResolver是根據viewName選擇相應名稱的bean(這里需要注意bean的scope,是否需要線程安全),而UrlBasedViewResolver則是使用反射機制,根據viewClass信息創建view對象,因此這個view不受IoC容器的管理。ContentNegotiationViewResolver中可以嵌套ViewResolver,根據不同的的請求類型選擇合適的ViewResolver。

    ?????? DispatcherServlet得到View對象后,即調用View的render方法,執行真正的渲染工作。

    ?????? 最后,看一下View的類結構圖。

    ?

    ?????? 有上述的View類結構圖可知,Spring已經為我們提供了一系列可用的View。同時,如果當前提供的View不能滿足我們的要求時,可以通過實現View接口進行擴展。如需要根據model中的數據使用JFreeChart繪圖,或者將這些數據作為文件下載時,我們可以擴展出JFreeChartView和FileDownloadView等,這樣就能更靈活的將同一份數據用不同的方式展現出來。

    總結

    以上是生活随笔為你收集整理的spring viewResolver 类别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。