SpringMVC同时支持多视图(JSP,Velocity,Freemarker等)的一种思路实现
在基于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
皆验证通过。
SpringMVC同时支持多视图(JSP,Velocity,Freemarker等)的一种思路实现的更多相关文章
- SpringMVC中支持多视图解析
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/suo082407128/article/details/70173301 在SpringMVC模式当 ...
- springmvc配置多视图 - tiles, velocity, freeMarker, jsp
转自: http://www.cnblogs.com/shanheyongmu/p/5684595.html <!-- Velocity --> <bean id="vel ...
- springmvc 配置多视图,返回jsp,velocity,freeMarker,tiles(模板)等等
springmvc-servlet.xml配置 <!-- Velocity --> <bean id="velocityViewResolver" class = ...
- Spring Mvc配置多视图 - tiles, velocity, freeMarker, jsp
<!-- Velocity --> <bean id="velocityViewResolver" class="org.springframework ...
- springmvc 配置多视图(jsp,freemarker,HTML等)
SpringMVC 的 Controller 可以返回各种各样的视图.比如 JSP, JSON, Velocity, FreeMarker, XML, PDF, Excel, 还有Html字符流 等等 ...
- Velocity浅析及与Jsp、Freemarker对比
转载自:http://www.cnblogs.com/petermsdn/archive/2011/05/06/2039178.html Velocity 是一个基于java 的模板引擎(templa ...
- Velocity浅析及与Jsp、Freemarker对比 分类: B1_JAVA 2014-07-21 09:14 637人阅读 评论(0) 收藏
转载自:http://www.cnblogs.com/petermsdn/archive/2011/05/06/2039178.html Velocity 是一个基于java 的模板引擎(templa ...
- jsp、freemarker、velocity区别详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt172 在java领域,表现层技术主要有三种:jsp.freemarker.v ...
- java 表现层:jsp、freemarker、velocity
在java领域,表现层技术主要有三种:jsp.freemarker.velocity. jsp是大家最熟悉的技术 优点: 1.功能强大,可以写java代码 2.支持jsp标签(jsp tag) 3.支 ...
随机推荐
- 《Scrum实战》第3次课【富有成效的每日站会】作业汇总
1组 崔儒: http://kecyru.blog.163.com/blog/static/2741661732017626101944123/ 2017-07-26 孟帅: http://www.c ...
- JSON Undefined 问题
在IE6和IE7浏览器下或在IE8-IE10浏览器文档模式为IE7及以下时,控制台会报错:JSON is undefined. 这种错误在IE6和IE7浏览器下出现很正常,因为JSON在IE8+浏览器 ...
- 使用mysql监视器即命令行下的mysql
命令行下登录mysql 首先必须在alias下有设置mysql, 我的mysql安装的位置在/usr/local/mysql 于是做了一个别名: alias mysql='/usr/local/mys ...
- 【LeetCode】Reverse Integer(整数反转)
这道题是LeetCode里的第7道题. 题目描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 ...
- Spring 4.3.11.RELEASE文档阅读(二):Core Technologies_AOP
虽然并不是每个问题都有答案,但我想了很多问题.so, just write it down , maybe one day...... AOP: 1,AOP是啥 2,AOP思想是怎么产生的 3,AOP ...
- iOS学习笔记42-Swift(二)函数和闭包
上一节我们讲了Swift的基础部分,例如数据类型.运算符和控制流等,现在我们来看下Swift的函数和闭包 一.Swift函数 函数是一个完成独立任务的代码块,Swift中的函数不仅可以像C语言中的函数 ...
- MacPorts的安装和使用
1.安装 MacPorts的官方网站:http://www.macports.org/install.php 有dmg安装和源代码安装两种方式,下载dmg格式一步步安装即可 2.使用 更新ports ...
- Educational Codeforces Round 11——A. Co-prime Array(map+vector)
A. Co-prime Array time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- javaweb之Filter详解
一.概念:Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或 ...
- winform控件大小改变是防止背景重绘导致的闪烁(转载)
在工作中需要做一个伸缩控件,这个自定义控件继承于Panel.这个伸缩控件分为两个部分,头部是一个自定义组件,伸缩控件的背景为灰色,头部背景要求白色.伸缩控件在点击按钮时会重绘,同时他内部的控件也会重绘 ...