Spring MVC多视图配置

1.Spring配置的XML

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="
 http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-3.0.xsd ">
    <context:component-scan
     base-package="com.spring.action"/>
    <!--
    org.springframework.web.servlet.view.ResourceBundleViewResolver
    用于多个视图集成时,ResourceBundleViewResolver是通过解析资源文件来解析请求输出文件的。
    <property name="basename" value="views"></property>,即表示在/WEB-INF/classes路径下有一个
    views.properties文件,本例中views.properties的内容为
    welcome.(class)=org.springframework.web.servlet.view.velocity.VelocityView
    welcome.url=welcome.vm
    freemarker.(class)=org.springframework.web.servlet.view.freemarker.FreeMarkerView
    freemarker.url=freemarker.ftl
    -->
    <bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
        <property name="basename" value="views">
        </property>
        <!--
        <property name="order" value="0"></property>
        -->
    </bean>
    <!-- FreeMarker环境配置 -->
    <bean id="freemarkerConfig"
    
     class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <!-- freemarker模板位置 -->
        <property name="templateLoaderPath" value="/WEB-INF/freemarker/"/>
    </bean>
    <!-- velocity环境配置 -->
    <bean id="velocityConfig"

     class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
        <!-- velocity配置文件路径 -->
        <property name="configLocation" value="/WEB-INF/velocity.properties"/>
        <!-- velocity模板路径 -->
        <property name="resourceLoaderPath" value="/WEB-INF/velocity/"/>
    </bean>
    <bean id="viewResolver"
     class="com.spring.action.MultiViewResover">
        <property name="resolvers">
            <map>
                <entry key="jsp">
                    <bean
                     class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                        <property name="viewClass"
                         value="org.springframework.web.servlet.view.JstlView"/>
                        <property name="prefix" value="/WEB-INF/jsp/"/>
                        <property name="suffix" value=".jsp"/>
                    </bean>
                </entry>
                <entry key="ftl">
                    <bean
                     class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
                        <property name="cache" value="true"/>
                        <property name="prefix" value="/"/>
                        <property name="suffix" value=".ftl"/>  
                    </bean>
                </entry>
                <entry key="vm">
                    <bean
                     class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
                        <property name="cache" value="true"/>
                        <property name="prefix" value="/"/>
                        <property name="suffix" value=".vm"/>
                    </bean>
                </entry>
            </map>
        </property>
    </bean>
    
</beans>

解析多视图请求的类

package com.spring.action;

import java.util.Locale;
import java.util.Map;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;

/**
 * @author Jeson
 * @blog:http://www.gbsou.com
 * @date:Oct 20, 2009 8:39:27 AM
 * @version :1.0
 *
 */
public class MultiViewResover implements ViewResolver {

    private Map<String, ViewResolver> resolvers;

    @Override
    public View resolveViewName(String viewName, Locale locale)
            throws Exception {
        int n = viewName.lastIndexOf("_"); // 获取
                                            // viewName(modelAndView中的名字)看其有没有下划线
        if (n == (-1))
            return null; // 没有则直接返回空
        // 有的话截取下划线后面的字符串 这里一般是jsp,ftl,vm与配置文件中的<entry key="ftl">的key匹配
        String suffix = viewName.substring(n + 1);
        // 根据下划线后面的字符串去获取托管的视图解析类对象
        ViewResolver resolver = resolvers.get(suffix);

        // 取下划线前面的部分 那时真正的资源名.比如我们要使用hello.jsp 那viewName就应该是hello_jsp
        viewName = viewName.substring(0, n);
        if (resolver != null)
            return resolver.resolveViewName(viewName, locale);
        return null;
    }

    public Map<String, ViewResolver> getResolvers() {
        return resolvers;
    }

    public void setResolvers(Map<String, ViewResolver> resolvers) {
        this.resolvers = resolvers;
    }
}

action

package com.spring.action;

import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloWorldAction {

    @RequestMapping(value = "/helloworld.do")
    public ModelAndView hello() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("hello_jsp");
        modelAndView.addObject("message", "Hello,SpringMvc");
        return modelAndView;
    }

    @RequestMapping(value = "/welcome.do")
    public ModelAndView helloVm() {
        // ModelAndView modelAndView=new ModelAndView();
        // modelAndView.setViewName("freemarker_ftl");
        // modelAndView.addObject("message", "Hello,Velocity");
        // return modelAndView;
        Map map = new HashMap();
        return new ModelAndView("freemarker_ftl",  map); // 根据之前的解释这里就是去寻找
                                                            // user.ftl资源

    }

    @RequestMapping(value = "/free.do")
    public ModelAndView helloFreeMarker() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("welcome");
        modelAndView.addObject("message", "Hello,Freemarker");
        return modelAndView;
    }

}
这样 在页面键入对应action就可以访问对应的视图实现了

原文地址:https://www.cnblogs.com/rongxiang/p/3598438.html