spring mvc freemarker 怎么让指定的控制器不适用freemarker

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring mvc freemarker 怎么让指定的控制器不适用freemarker相关的知识,希望对你有一定的参考价值。

参考技术A 先附上一个SiteMesh3+FreeMarker+SpringMVC例子/adaikiss/sitemesh3_freemarker_springmvc.zip下载后解压,本地环境变量要有MAVEN,CMD进入工程目录直接运行mvnjetty:run昨天花了一天时间来跟踪调试springmvc,freemarker,sitemesh3,终于弄明白了大概的原理,最后解决了sitemesh中文(UTF-8)乱码,ftl装饰页不被渲染的问题。sitemesh3是通过一个filter来对response进行拦截处理,在response提交之前,它会把response流里的数据备份起来,清空流,然后用request.getRequestDispatcher(装饰页URI).forward()来取得渲染后的装饰页,然后再把装饰页里的标签替换成之前备份的对应内容。也就是说sitemesh不关心你的页面是如何生成的,它只是将两者拼接起来,不管你用的是JSP,Volocity,FreeMarker还是SpringMVC,Struts,wicket。这样一来你就可以灵活地控制页面的生成方式。你可以把sitemesh3当成一个中间浏览器,他使用用户浏览器发送过来的request对象发送了两次(或以上)请求,第一次是原来的请求,第二次是对装饰页面的请求,然后把这两个请求结果拼接起来返回给用户浏览器。看到这里,装饰页如果是FTL就不被渲染的问题也就有了解决方法了。只要自己写一个过滤器对.ftl的请求用freemarker渲染一遍就可以了。由于我使用的是springmvc+freemarker,因此我直接拿springmvc来渲染FTL文件了,这样可以像被装饰页一样方便地使用spring的宏和其他一些对象。下面是我的filter复制代码publicclassFreemarkerFilterimplementsFilterprivateLocalelocale;@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletExceptionStringlocaleStr=filterConfig.getInitParameter("locale");if(StringUtils.isNotBlank(localeStr))locale=newLocale(localeStr);elselocale=Locale.getDefault();@OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletExceptiontryHttpServletRequestreq=(HttpServletRequest)request;HttpServletResponseres=(HttpServletResponse)response;Stringname=req.getRequestURI();name=name.substring(1,name.lastIndexOf(".ftl"));FreeMarkerViewResolverviewResolver=SpringContextHolder.getBean(FreeMarkerViewResolver.class);Viewview=viewResolver.resolveViewName(name,locale);@SuppressWarnings("unchecked")Mapmodel=(Map)request.getAttribute(ViewRendererServlet.MODEL_ATTRIBUTE);view.render(null,req,res);catch(Exceptione)thrownewServletException(e);@Overridepublicvoiddestroy()//TODOAuto-generatedmethodstub复制代码在这里,我是把SpringMVC对被装饰页处理时生成的model传到了装饰页。装饰页和原来被include进来的页面差不多,一般装饰页可能不需要使用被装饰页中的model,可以把SuppressWarnings注解下面那行注释掉,下面传null过去。在web.xml里加上过滤器配置:复制代码freemarkerFilterorg.adaikiss.kay.web.FreemarkerFilterfreemarkerFilter*.ftlREQUESTFORWARD复制代码这样一来由sitemeshforward的请求就能被拦截并渲染。当然,你也可以把装饰页的后缀改成.des,url-pattern要同步改。关于中文乱码的问题,在跟踪代码的时候发现对于没有contentType的view,SpringMVC会使用默认的contentType:AbstractTemplateView.DEFAULT_CONTENT_TYPE,即"text/html;charset=ISO-8859-1",view中可以设置这个属性,不过我的配置里没有定义view,还好ViewResolver里也可以设置,在springmvc配置文件里加上contentType属性即可。

以上是关于spring mvc freemarker 怎么让指定的控制器不适用freemarker的主要内容,如果未能解决你的问题,请参考以下文章

Spring mvc整合freemarker详解

Spring mvc整合freemarker详解

Spring mvc整合freemarker详解

Spring mvc整合freemarker详解

对象集合的表单的 Freemarker 语法(Spring 3 MVC)

如何在spring mvc中使用带有freemarker的消息?