多视图控制器
当有jsp,flt (模板)等多种页面生成展示方式时,spring默认使用的是“视图解析器链”。 真是一个链,所以性能不好,spring会在“视图解析器链”中顺序的查找,直到找到对应的 “视图解析器” 。jsp视图解析器一定要写在最后面,因为一旦调用jsp,就向浏览器发出数据了,Spring就没有机会再尝试下一个了。
所以自己写一个"多视图解析器",依靠扩展名来区分,可一次准确的选中一个 视图解析器,提高性能(会有多少提高呢?没测试过).
下面的例子支持jsp,flt (模板)两种页面生成展示方式,你中以自己添加,支持更多。
Xml代码 <!-- 多视图处理器 --> <bean class="com.xxx.core.web.MixedViewResolver"> <property name="resolvers"> <map> <entry key="jsp"> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> </bean> </entry> <entry key="ftl"> <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="cache" value="true"/> <property name="contentType" value="text/html;charset=UTF-8"></property> <!-- 宏命令的支持 --> <property name="exposeSpringMacroHelpers" value="true"/> <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/> <property name="requestContextAttribute" value="rc"></property> </bean> </entry> </map> </property> </bean> <!-- freemarker config --> <bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/ftl/" /> <property name="freemarkerSettings"> <props> <prop key="template_update_delay">5</prop> <prop key="default_encoding">UTF-8</prop> <prop key="locale">zh_CN</prop> </props> </property> </bean> [xml] view plain copy <!-- 多视图处理器 --> <bean class="com.xxx.core.web.MixedViewResolver"> <property name="resolvers"> <map> <entry key="jsp"> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> </bean> </entry> <entry key="ftl"> <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="cache" value="true"/> <property name="contentType" value="text/html;charset=UTF-8"></property> <!-- 宏命令的支持 --> <property name="exposeSpringMacroHelpers" value="true"/> <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/> <property name="requestContextAttribute" value="rc"></property> </bean> </entry> </map> </property> </bean> <!-- freemarker config --> <bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/ftl/" /> <property name="freemarkerSettings"> <props> <prop key="template_update_delay">5</prop> <prop key="default_encoding">UTF-8</prop> <prop key="locale">zh_CN</prop> </props> </property> </bean>
Java代码 import java.util.Locale; import java.util.Map; import org.springframework.web.servlet.View; import org.springframework.web.servlet.ViewResolver; /** * 说明: 多视图处理器 * * @author 赵磊 * @version 创建时间:2011-8-19 上午09:41:09 */ public class MixedViewResolver implements ViewResolver{ private Map<String,ViewResolver> resolvers; public void setResolvers(Map<String, ViewResolver> resolvers) { this.resolvers = resolvers; } public View resolveViewName(String viewName,Locale locale) throws Exception{ int n=viewName.lastIndexOf("."); if(n!=-1){ //取出扩展名 String suffix=viewName.substring(n+1); //取出对应的ViewResolver ViewResolver resolver=resolvers.get(suffix); if(resolver==null){ throw new RuntimeException("No ViewResolver for "+suffix); } return resolver.resolveViewName(viewName, locale); }else{ ViewResolver resolver=resolvers.get("jsp"); return resolver.resolveViewName(viewName, locale); } } } [java] view plain copy import java.util.Locale; import java.util.Map; import org.springframework.web.servlet.View; import org.springframework.web.servlet.ViewResolver; /** * 说明: 多视图处理器 * * @author 赵磊 * @version 创建时间:2011-8-19 上午09:41:09 */ public class MixedViewResolver implements ViewResolver{ private Map<String,ViewResolver> resolvers; public void setResolvers(Map<String, ViewResolver> resolvers) { this.resolvers = resolvers; } public View resolveViewName(String viewName,Locale locale) throws Exception{ int n=viewName.lastIndexOf("."); if(n!=-1){ //取出扩展名 String suffix=viewName.substring(n+1); //取出对应的ViewResolver ViewResolver resolver=resolvers.get(suffix); if(resolver==null){ throw new RuntimeException("No ViewResolver for "+suffix); } return resolver.resolveViewName(viewName, locale); }else{ ViewResolver resolver=resolvers.get("jsp"); return resolver.resolveViewName(viewName, locale); } } }
