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>
2 解析多视图请求的类
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; } }
3. 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就可以访问对应的视图实现了