㈠ springmvc+freemarker
用c:forEach 标签,<c:forEach var="user" items="${ulist}" >
里面取Users类属性 循环 即可
</c:forEach>
㈡ jsp spring mvc freemarker 哪个好
jsp和freemarker比较起来,自然是jsp好一点,freemarker 只是常用功能较多(html过滤,日期金额格式化)现在el表达式也可以轻松实现这些东西。而jsp可以写后台代码。
㈢ springmvc怎么使用freemarker
直接加入freemarker的jar包就可以使用了,不需要有什么额外的配置。
㈣ springmvc整合freemarker怎么弄
一、 用macro实现自定义指令,例如:
自定义指令可以使用macro指令来定义。
<#macro greet person>
<font size="+2">Hello ${person}!</font>
</#macro>
macro指令自身不打印任何内容,它只是用来创建宏变量,所以就会有一个名为greet的变量。
使用这个宏:
<@greet person="Fred"/>
会打印出:
<font size="+2">Hello Fred!</font>
二、用java代码标签实现自定义指令:
可以使用TemplateDirectiveModel接口在Java代码中实现自定义指令。
简单示例如下:
1、实现TemplateDirectiveModel接口。
public class UpperDirective implements TemplateDirectiveModel {
public void execute(Environment env,
Map params, TemplateModel[] loopVars,
TemplateDirectiveBody body)
throws TemplateException, IOException {
if (!params.isEmpty()) {
throw new TemplateModelException(
"parameters 此处没有值!");
}
if (loopVars.length != 0) {
throw new TemplateModelException(
" variables 此处没有值!");
}
if (body != null) {
//执行nested body 与FTL中 <#nested> 类似。
body.render(new UpperCaseFilterWriter(env.getOut()));
} else {
throw new RuntimeException("missing body");
}
}
private static class UpperCaseFilterWriter extends Writer {
private final Writer out;
UpperCaseFilterWriter (Writer out) {
this.out = out;
}
public void write(char[] cbuf, int off, int len)
throws IOException {
char[] transformedCbuf = new char[len];
for (int i = 0; i < len; i++) {
transformedCbuf[i] = Character.toUpperCase(cbuf[i + off]);
}
out.write(transformedCbuf);
}
public void flush() throws IOException {
out.flush();
}
public void close() throws IOException {
out.close();
}
}
}
说明:<#nested>指令执行位于开始和结束标记指令之间的模板代码段。
2、注入FreeMarkerConfigurer的freemarkerVariables中。
例如:在jeecms-servlet-front.xml
<entry key="upper" value-ref="upper"/>
<bean id="upper" class="com.example.UpperDirective" />
说明:
FreeMarkerConfigurer. 、setFreemarkerVariables(Map<String,Object> variables)
底层调用了FreeMarker的Configuration.setAllSharedVariables()方法。
因为更好的实践是将常用的指令作为共享变量放到Configuration中。
3、调用自定义指令:
[@upper]
bar
[#list ["red", "green", "blue"] as color]
${color}
[/#list]
baaz
[/@upper]
4、显示输出结果:
BAR RED GREEN BLUE BAAZ
㈤ SpringMVC中使用freemarker需要配置哪些信息
<bean id="freeMarkerTemplate" class="platform.ecation.visualization.app.front.utils.FreeMarkerTemplate">
<property name="freeMarkerConfigurer" ref="freeMarkerConfigurer" />
</bean>
<!--配置Freemarker -->
<bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/ftl/" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">10</prop>
<prop key="defaultEncoding">UTF-8</prop>
</props>
</property>
</bean>
㈥ springmvc怎么配置freemarker
一、从freemarker谈起
Freemarker使用模板技术进行视图的渲染。自从看了Struts标签、Freemarker、JSTL的性能对比后,我毅然决定放弃Struts标签了!效率太差……
Spring本身支持了对Freemarker的集成。只需要配置一个针对Freemarker的视图解析器即可。
二、Spring MVC视图解析器
视图解析器的工作流程大致是这样的:Controller的某个方法执行完成以后,返回一个视图(比如:listUser),视图解析器要做的工作就是找到某个对象来完成视图的渲染,或者跳转到其他的逻辑视图。这里的渲染对象通常就是我们的jsp文件或者我们下面用的Freemarker(例如listUser.jsp或者listUser.ftl)。渲染完成以后,将解析结果发送到客户端浏览器
下面介绍一下本文需要用到的解析器(更多解析器资料,请参考http://e-freya.iteye.com/blog/384083):
InternalResourceViewResolver:这是一个最常用的解析器。通常使用它指定渲染对象为jsp页面
FreeMarkerViewResolver:这就是Spring与Freemarker整合需要用到的解析器
三、配置多视图,支持freemarker
我们通常不希望所有的动态页面请求都使用Freemarker来渲染,那就需要配置多个视图解析器。网上有很多这方面的帖子。我看到很多人的做法是在web.xml中配置两个DispatcherServlet,一个拦截*.do,一个拦截*.ftl;然后再写两个dispatcherServlet.xml,配置两个视图解析器;jsp页面、ftl模板就各司其职。
其实没有那么复杂。
1.Web.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<web-appversion="2.4"xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--========================================================-->
<!--SpringMVCConfigServlet-->
<!--========================================================-->
<!--JSPDispatcherServlet-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--========================================================-->
<!--SpringMVCConfigMapping-->
<!--========================================================-->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
2.dispatcherServlet.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!--通用视图解析器-->
<beanid="viewResolverCommon"class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertyname="prefix"value="/WEB-INF/page/"/>
<propertyname="suffix"value=".jsp"/><!--可为空,方便实现自已的依据扩展名来选择视图解释类的逻辑-->
<propertyname="viewClass">
<value>org.springframework.web.servlet.view.InternalResourceView</value>
</property>
<propertyname="order"value="1"/>
</bean>
<!--配置freeMarker视图解析器-->
<beanid="viewResolverFtl"class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<propertyname="viewClass"value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
<propertyname="contentType"value="text/html;charset=utf-8"/>
<propertyname="cache"value="true"/>
<propertyname="suffix"value=".ftl"/>
<propertyname="order"value="0"/>
</bean>
<!--配置freeMarker的模板路径-->
<beanid="freemarkerConfig"class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<propertyname="templateLoaderPath">
<value>/WEB-INF/ftl/</value>
</property>
<propertyname="freemarkerVariables">
<map>
<entrykey="xml_escape"value-ref="fmXmlEscape"/>
</map>
</property>
<propertyname="defaultEncoding">
<value>utf-8</value>
</property>
<propertyname="freemarkerSettings">
<props>
<propkey="template_update_delay">3600</prop>
</props>
</property>
</bean>
<beanid="fmXmlEscape"class="freemarker.template.utility.XmlEscape"/>
<!--注解支持-->
<mvc:annotation-driven/>
<!--对包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能-->
<context:component-scanbase-package="com.hl.usersmanager">
<!--允许定义过滤器将基包下的某些类纳入或排除
<context:include-filtertype="annotation"expression="org.springframework.stereotype.Controller"/>-->
</context:component-scan>
</beans>
3.Controller
Java代码
packagecom.hl.usersmanager.controller;
importjava.util.List;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Controller;
importorg.springframework.ui.ModelMap;
importorg.springframework.web.bind.annotation.RequestMapping;
importcom.hl.usersmanager.model.Users;
importcom.hl.usersmanager.service.IUserService;
@Controller
publicclassUserController{
//使用注解实现自动装配不需要再写getset方法以及在context中配置bean
@Autowired
;
@RequestMapping(value="findUserByName.do")
publicStringfindUserByName(Stringname,ModelMapmodel){
Usersusers=userService.findUserByName(name);
model.addAttribute("userPhone",users.getPhone());
System.out.println("userPhone:"+users.getPhone());
return"showUser";
}
@RequestMapping(value="findAllUsers.do")
publicStringfindAllUsers(ModelMapmodel){
List<Users>users=userService.findAllUsers();
model.addAttribute("users",users);
return"listUser";
}
……
}
在视图解析器中有一个<property name="order" value="orderValue"/>的配置,这个配置表示解析器的优先级别。我们将FreeMarkerViewResolver的级别设为0,将InternalResourceViewResolver的级别设为1。这样,解析器就会优先使用 FreeMarkerViewResolver进行解析,如果找不到相应的模板,就使用InternalResourceViewResolver进行解析,如果还找不到页面,就会产生一个404错误!
在本例中,我们在/WEB-INF/page/下有一个showUser.jsp页面,在/WEB-INF/ftl/下有一个listUser.ftl的模板文件。那么当访问findAllUsers.do的时候,Controller返回一个listUser视图,根据解析器配置,先使用FreeMarkerViewResolver进行解析。它会根据模板路径templateLoaderPath的配置/WEB-INF/ftl/下去找是否有一个listUser并且以后缀配置suffix值.ftl,即listUser.ftl文件,如果找到则使用该模板进行解析。这里我们实现已经创建了这个模板文件,所以user列表成功被显示出来。
当用户访问findUserByName.do的时候,返回showUser视图,毅然先使用FreeMarkerViewResolver进行解析,结果发现在/WEB-INF/ftl/下并没有showUser.ftl这个模板文件,于是使用InternalResourceViewResolver进行解析,于是开始寻找/WEB-INF/page/下是否有showUser.jsp文件。由于我们已经创建了这个文件,于是最终使用showUser.jsp进行渲染。那么如果没有找到showUser.jsp,就会抛出404错误。
这里还要注意的是,如果Controller中返回视图加了后缀jsp或者ftl,在配置中就不要加入suffix配置,否则会找不到页面。
㈦ spring boot中怎么使用freemarker
这个很简单,添加进freemarker的jar,就可以直接使用了,不需要再有什么额外的配置。
㈧ springframework freemarker 在哪个包里
1、 新建WebProject,工程名称是SpringFreemarker;然后手动添加jar包,需要的jar包如下:
SpringFramework jar包下载地址:
http://ebr.springsource.com/repository/app/library/version/detail?name=org.springframework.spring&version=3.0.5.RELEASE
FreeMarker library下载地址:
http://ebr.springsource.com/repository/app/bundle/version/detail?name=com.springsource.freemarker&version=2.3.15
当然你也可以去官方下载
2、 在web.xml中添加如下配置:
<!-- 加载Spring容器配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 设置Spring容器加载配置文件路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext-*.xml</param-value>
</context-param>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
上面分别是添加Spring的监听器、以及配置Spring的配置文件、还有SpringMVC的控制器;
3、 在WEB-INF中添加文件dispatcher.xml,和web.xml中的对应。内容如下:
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans >
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd"
<context:component-scanbase-package="com.hoo"/>
<!-- annotation的方法映射适配器
<bean id="handlerAdapter" class="org.springframework.web.servlet.mvc.annotation."/>
-->
<!-- annotation默认的方法映射适配器 -->
<beanid="handlerMapping"
class="org.springframework.web.servlet.mvc.annotation."/>
<beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertyname="viewClass"value="org.springframework.web.servlet.view.JstlView"/>
</bean>
</beans>
上面是SpringMVC的基本配置
4、 在src中添加applicationContext-beans.xml,内容如下:
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
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/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"
</beans>
里面可以添加一些bean的配置
5、 在src目录添加freemarker.properties配置文件,这个文件是freemarker一些常用的转换,内容如下:
tag_syntax=auto_detect
template_update_delay=2
default_encoding=UTF-8
output_encoding=UTF-8
locale=zh_CN
date_format=yyyy-MM-dd
time_format=HH:mm:ss
datetime_format=yyyy-MM-dd HH:mm:ss
6、 在dispatcher.xml中添加freemarker的配置,配置如下:
<!-- 设置freeMarker的配置文件路径 -->
<beanid="freemarkerConfiguration"class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<propertyname="location"value="classpath:freemarker.properties"/>
</bean>
<!-- 配置freeMarker的模板路径 -->
<beanid="freemarkerConfig"class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<!--property name="freemarkerSettings" ref="freemarkerConfiguration"/-->
<propertyname="templateLoaderPath">
<value>/WEB-INF/ftl/</value>
</property>
<propertyname="freemarkerVariables">
<map>
<entrykey="xml_escape"value-ref="fmXmlEscape"/>
</map>
</property>
</bean>
<beanid="fmXmlEscape"class="freemarker.template.utility.XmlEscape"/>
<!-- 配置freeMarker视图解析器 -->
<beanid="viewResolver"class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<propertyname="viewClass"value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
<propertyname="viewNames"value="*.ftl"/>
<propertyname="contentType"value="text/html; charset=utf-8"/>
<propertyname="cache"value="true"/>
<propertyname="prefix"value=""/>
<propertyname="suffix"value=""/>
<propertyname="order"value="2"/>
</bean>
上面最关键的就是freeMarker的视图解析器viewResolver的配置,viewClass是使用哪个视图解析器,这里是类路径;其他的和jsp的视图解析器都很类似。
7、 下面在WEB-INF中添加2个ftl模板,在WEB-INF添加ftl,然后添加hello.ftl/hi.ftl,内容分别是:
hello.ftl
<html>
<body>
<h1>say hello ${name}</h1><br/>
${(1 == 1)?string("yes", "no")}
</body>
</html>
hi.ftl
<html>
<body>
<h1>say hello ${name}</h1><br/>
${(1 != 1)?string("yes", "no")}
</body>
</html>
8、 添加Controller控制器,代码如下:
packagecom.hoo.controller;
importorg.springframework.stereotype.Controller;
importorg.springframework.ui.ModelMap;
importorg.springframework.web.bind.annotation.RequestMapping;
/**
* <b>function:</b> FreeMarker示例控制器
* @author hoojo
* @createDate 2011-3-3 下午04:50:10
* @file HelloWorldController.java
* @package com.hoo.controller
* @project SpringFreemarker
* @version 1.0
*/
@Controller
@RequestMapping("/freeMarker")
{
@RequestMapping("/hello")
publicString sayHello(ModelMap map) {
System.out.println("say Hello ……");
map.addAttribute("name", " World!");
return"/hello.ftl";
}
@RequestMapping("/hi")
publicString sayHi(ModelMap map) {
System.out.println("say hi ……");
map.put("name", "jojo");
return"/hi.ftl";
}
@RequestMapping("/jsp")
publicString jspRequest(ModelMap map) {
System.out.println("jspRequest ……");
map.put("name", "jsp");
return"/temp.jsp";
}
}
9、 添加index.jsp的测试链接或temp.jsp的内容:
index.jsp
<body>
<ahref="freeMarker/hello.do">say hello</a><br/>
<ahref="freeMarker/hi.do">say hi</a><br/>
<ahref="freeMarker/jsp.do">jspRequest</a>
</body>
temp.jsp
<body>
<h3>${name }</h3>
</body>
如果运行无错误,并输出正确的结果就整合成功!
㈨ spring mvc freemarker 怎么让指定的控制器不适用freemarker
先附上一个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复制代码{privateLocalelocale;@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{StringlocaleStr=filterConfig.getInitParameter("locale");if(StringUtils.isNotBlank(localeStr)){locale=newLocale(localeStr);}else{locale=Locale.getDefault();}}@OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{try{HttpServletRequestreq=(HttpServletRequest)request;HttpServletResponseres=(HttpServletResponse)response;Stringname=req.getRequestURI();name=name.substring(1,name.lastIndexOf(".ftl"));=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.*.ftlREQUESTFORWARD复制代码这样一来由sitemeshforward的请求就能被拦截并渲染。当然,你也可以把装饰页的后缀改成.des,url-pattern要同步改。关于中文乱码的问题,在跟踪代码的时候发现对于没有contentType的view,SpringMVC会使用默认的contentType:AbstractTemplateView.DEFAULT_CONTENT_TYPE,即"text/html;charset=ISO-8859-1",view中可以设置这个属性,不过我的配置里没有定义view,还好ViewResolver里也可以设置,在springmvc配置文件里加上contentType属性即可。
㈩ 如何当freemarker模板出现错误时屏蔽错误并跳转
在日常的开发过程中,对错误信息的合理处理都是很重要的一个环节,特别对于门户系 统,其重要性就不言而喻了 然而我们在实际的开发过程中,要想错误提示明确、又要想客户不至于太反感,看似矛盾的 大多数系统都是采用一检测到错误,统一跳转到统一的错误页面,然后统一去做处理,但 是 那 种 错 误 检 测 仅 仅 是 处 理 大 部 分 的 错 误 , 如 java.sql.SQLException 、 java.lang.RuntimeException,但是对于使用freemarker 模板语言的系统来说,其支持不是 很好(我尝试把freemarker.template.TemplateException 等异常加入到其检测机制中,发 现没有作用,只好改用其实现方法)。通过查询freemarker、spring 的api 获知,freemarker 提供了一个支持其错误处理机制的接口 TemplateExceptionHandler,需要自己去扩展实现, 构造自己的处理freemarker 模板错误的机制 主要分为两个部分 1、构造自己的错误处理机制 2 、在 spring 启动的时候将自定义的错误机制加入到freemarker 配置中 具体做法如下: 1、新建一个类,让其实现TemplateExceptionHandler 接口 public class implements TemplateExceptionHandler{ public void handleTemplateException(TemplateException arg0, Environment arg1, Writer out) throws TemplateException { //这里构建你的错误机制,可以进行跳转及错误日志的打印等等}}