SpringMVC同时支持多视图(JSP,Velocity,Freemarker等)的一种思路实现

来源:互联网 发布:数据库字段唯一性约束 编辑:程序博客网 时间:2024/06/05 21:00

背景

在基于SpringMVC的项目中有时需要同时使用多种视图格式,如jsp,velocity及freemarker等,通过不同的请求路径配置规则,映射到不同的视图文件。下面我提供一种思路,通过视图模板文件后缀名的方式来进行处理。例如:

@RequestMapping(value = “/hello”)
public String jspTest(HttpServletRequest request, ModelMap map) {
return “demo.jsp”;
}
将通过”demo.jsp”的后缀自动使用jsp的视图解析器。

下面描述下详细思路:

一.自定义视图解析器

package com.jeedev.common.web.springmvc.view;import java.util.HashMap;import java.util.Locale;import java.util.Map;import java.util.Set;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.web.servlet.View;import org.springframework.web.servlet.ViewResolver;/** * 自定义视图解析(通过配置实现多视图整合,如jsp,velocity,freemarker,pdf,excel...) * @author huligong * */public class JeeDevViewResolver implements ViewResolver  {    private static Log logger = LogFactory.getLog(JeeDevViewResolver.class);    public View resolveViewName(String viewName, Locale locale) throws Exception {       for(Map.Entry<Set<String>, ViewResolver> map : viewResolverMap.entrySet()){           Set<String> suffixs = map.getKey();           for(String suffix : suffixs){               if (viewName.endsWith(suffix)){                   ViewResolver viewResolver = map.getValue();                   if(null != viewResolver){                       if (logger.isDebugEnabled()) {                            logger.debug("found viewResolver '" + viewResolver + "' for viewName '" + viewName+ "'");                        }                       return viewResolver.resolveViewName(viewName, locale);                   }               }           }       }       if(defaultViewResolver != null){           return defaultViewResolver.resolveViewName(viewName, locale);       }       // to allow for ViewResolver chaining       return null;    }    private Map<Set<String>,ViewResolver> viewResolverMap = new HashMap<Set<String>,ViewResolver>();    private ViewResolver defaultViewResolver = null;    public Map<Set<String>, ViewResolver> getViewResolverMap() {        return viewResolverMap;    }    public void setViewResolverMap(Map<Set<String>, ViewResolver> viewResolverMap) {        this.viewResolverMap = viewResolverMap;    }    public ViewResolver getDefaultViewResolver() {        return defaultViewResolver;    }    public void setDefaultViewResolver(ViewResolver defaultViewResolver) {        this.defaultViewResolver = defaultViewResolver;    }}

在自定义视图解析器(其实是视图中转器)中,通过对视图文件的后缀判断(而不是请求地址的后缀)而返回给不同的视图解析器处理。

二.视图映射配置dispather-servlet.xml

<bean id="viewResolver" class="com.jeedev.common.web.springmvc.view.JeeDevViewResolver">        <property name="defaultViewResolver" ref="beanNameViewResolver"/>        <property name="viewResolverMap">            <map>                <entry>                    <key>                        <set>                            <value>.jsp</value>                        </set>                    </key>                    <ref bean="jspViewResolver"/>                </entry>                <entry>                    <key>                        <set>                            <value>.vm</value>                            <value>.htm</value>                        </set>                    </key>                    <ref bean="velocityViewResolver"/>                </entry>                <entry>                    <key><value>.ftl</value></key>                    <ref bean="freeMarkerViewResolver"/>                </entry>            </map>        </property>    </bean>    <bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"/>    <bean id="jspViewResolver" 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>    <!--  Velocity ViewResolver Configuration -->    <bean id="velocityViewResolver" class = "org.springframework.web.servlet.view.velocity.VelocityViewResolver">         <property name="order" value="0" />         <property name="contentType" value="text/html;charset=UTF-8" />         <property name="requestContextAttribute" value="req"/>    </bean>    <!-- Velocity Configuration -->         <bean id="velocityConfig" class = "org.springframework.web.servlet.view.velocity.VelocityConfigurer">         <property name="configLocation" value="/WEB-INF/velocity.properties"/>         <property name="resourceLoaderPath" value="/" />    </bean>    <!--  FreeMarker ViewResolver Configuration -->    <bean id="freeMarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">          <property name="order" value="0" />        <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>      </bean>     <!-- FreeMarker Configuration -->         <bean id="freemarkerConfig"  class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">         <property name="configLocation" value="/WEB-INF/freemarker.properties"/>        <property name="templateLoaderPath" value="/WEB-INF/ftl/"/>           <property name="freemarkerVariables">             <map>                <entry key="xml_escape" value-ref="fmXmlEscape"/>            </map>         </property>    </bean>       <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/>

这里我配置成所有返回.jsp的视图模板请求都转到JSP视图解析器jspViewResolver中去处理,返回.htm,.vm视图模板请求都转到velocity视图解析器中去处理。

三.控制器代码示例

package com.jeedev.demo.view;import javax.servlet.http.HttpServletRequest;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.stereotype.Controller;import org.springframework.ui.ModelMap;import org.springframework.web.bind.annotation.RequestMapping;/** * 多视图解析器支持示例 * @author huligong * */@Controller@RequestMapping(value = "/demo")public class JeeDevViewResolverTestController {    private static Log logger = LogFactory.getLog(JeeDevViewResolverTestController.class);    @RequestMapping(value = "/test1")    public String test1(HttpServletRequest request, ModelMap map) {        logger.info("使用JSP视图解析器");        map.put("name", "hello world");        return "jspTest.jsp";    }    @RequestMapping(value = "/test2")    public String test2(HttpServletRequest request, ModelMap map) {        logger.info("使用Freemarker视图解析器");        map.put("name", "hello world");        return "hello.ftl";    }    @RequestMapping(value = "/test3")    public String test3(HttpServletRequest request, ModelMap map) {        logger.info("使用Velocity视图解析器");        map.put("name", "hello world");        return "/html/demo.htm";    }}

四.测试请求

我在web.xml里给DispatcherServlet添加了/view/*,所以,只要在请求前加上/view就可以了。

http://localhost:8080/view/demo/test1

http://localhost:8080/view/demo/test2

http://localhost:8080/view/demo/test3

皆验证通过。

转自:http://www.cnblogs.com/huligong1234/p/3515747.html

0 0
原创粉丝点击