多视图控制器
当有jsp,flt (模板)等多种页面生成展示方式时,spring默认使用的是“视图解析器链”。 真是一个链,所以性能不好,spring会在“视图解析器链”中顺序的查找,直到找到对应的 “视图解析器” 。jsp视图解析器一定要写在最后面,因为一旦调用jsp,就向浏览器发出数据了,Spring就没有机会再尝试下一个了。
所以自己写一个"多视图解析器",依靠扩展名来区分,可一次准确的选中一个 视图解析器,提高性能(会有多少提高呢?没测试过).
下面的例子支持jsp,flt (模板)两种页面生成展示方式,你中以自己添加,支持更多。
- <!-- 多视图处理器 -->
- <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>
- <!-- 多视图处理器 -->
- <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>
- 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);
- }
- }
- }
- 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);
- }
- }
- }