十八、多视图控制器

 

当有jsp,flt (模板)等多种页面生成展示方式时,spring默认使用的是“视图解析器链”。 真是一个链,所以性能不好,spring会在“视图解析器链”中顺序的查找,直到找到对应的 “视图解析器” 。jsp视图解析器一定要写在最后面,因为一旦调用jsp,就向浏览器发出数据了,Spring就没有机会再尝试下一个了。

所以自己写一个"多视图解析器",依靠扩展名来区分,可一次准确的选中一个 视图解析器,提高性能(会有多少提高呢?没测试过).

 

下面的例子支持jsp,flt (模板)两种页面生成展示方式,你中以自己添加,支持更多。

 

Xml代码  

  1.    <!-- 多视图处理器 -->  

  2.    <bean class="com.xxx.core.web.MixedViewResolver">  

  3.     <property name="resolvers">  

  4.         <map>  

  5.             <entry key="jsp">  

  6.                 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  

  7.                     <property name="prefix" value="/WEB-INF/jsp/"/>  

  8.                     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>  

  9.                 </bean>  

  10.             </entry>  

  11.             <entry key="ftl">  

  12.                 <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">  

  13.                     <property name="cache" value="true"/>  

  14.                     <property name="contentType" value="text/html;charset=UTF-8"></property>  

  15.                     <!-- 宏命令的支持  -->    

  16.                     <property name="exposeSpringMacroHelpers" value="true"/>  

  17.                     <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>  

  18.                     <property name="requestContextAttribute" value="rc"></property>  

  19.                 </bean>  

  20.             </entry>  

  21.         </map>  

  22.     </property>  

  23. </bean>  

  24.   

  25. <!-- freemarker config -->  

  26.    <bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">   

  27.        <property name="templateLoaderPath" value="/WEB-INF/ftl/" />   

  28.        <property name="freemarkerSettings">   

  29.            <props>   

  30.                <prop key="template_update_delay">5</prop>   

  31.                <prop key="default_encoding">UTF-8</prop>   

  32.                <prop key="locale">zh_CN</prop>   

  33.            </props>   

  34.        </property>   

  35.    </bean>   

  

 

Java代码  

  1. import java.util.Locale;  

  2. import java.util.Map;  

  3. import org.springframework.web.servlet.View;  

  4. import org.springframework.web.servlet.ViewResolver;  

  5.   

  6. /**  

  7. * 说明: 多视图处理器 

  8.  

  9. * @author  赵磊  

  10. * @version 创建时间:2011-8-19 上午09:41:09   

  11. */   

  12. public class MixedViewResolver implements ViewResolver{  

  13.     private Map<String,ViewResolver> resolvers;  

  14.   

  15.     public void setResolvers(Map<String, ViewResolver> resolvers) {  

  16.         this.resolvers = resolvers;  

  17.     }  

  18.       

  19.     public View resolveViewName(String viewName,Locale locale) throws Exception{  

  20.         int n=viewName.lastIndexOf(".");  

  21.         if(n!=-1){  

  22.             //取出扩展名  

  23.             String suffix=viewName.substring(n+1);  

  24.             //取出对应的ViewResolver  

  25.             ViewResolver resolver=resolvers.get(suffix);  

  26.             if(resolver==null){  

  27.                 throw new RuntimeException("No ViewResolver for "+suffix);  

  28.             }  

  29.             return  resolver.resolveViewName(viewName, locale);  

  30.         }else{  

  31.             ViewResolver resolver=resolvers.get("jsp");  

  32.             return  resolver.resolveViewName(viewName, locale);  

  33.         }  

  34.     }  

  35. }