在Freemarker页面中如果使用${userName},并且userName为空,那么Freemarker页面就会崩掉 需要设置默认值${userName!""}来避免对象为空的错误。
同理 ${user.userName}也应该写成这样${(user.userName)!""}
现在有一个需求,就是万一我用了${userName},但是我又不想页面崩掉,怎么办呢?
我的解决方法就是定义一个FreemarkerExceptionHandler捕获freemarker页面上的异常
一、进入SpringMVC的配置文件中,我的是springMVC-servlet.xml文件,配置Freemarker
<!-- ===================================================== -->
<!-- ViewResolver For FreeMarker -->
<!-- ===================================================== -->
<bean id="freemarkerResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="order" value="1" />
<property name="suffix" value=".ftl" />
<property name="contentType" value="text/html;charset=utf-8" />
<property name="requestContextAttribute" value="rc"></property>
<property name="viewClass">
<value>org.springframework.web.servlet.view.freemarker.FreeMarkerView</value>
</property>
</bean>
<!-- ===================================================== -->
<!-- ViewResolver For FreeMarkerConfigurer -->
<!-- ===================================================== -->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath">
<value>/views/</value>
</property>
<property name="freemarkerSettings"><!-- 设置FreeMarker环境属性 -->
<props>
<prop key="template_update_delay">5</prop><!--刷新模板的周期,单位为秒 -->
<prop key="default_encoding">UTF-8</prop><!--模板的编码格式 -->
<prop key="locale">UTF-8</prop><!-- 本地化设置 -->
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="time_format">HH:mm:ss</prop>
<prop key="number_format">0.####</prop>
<prop key="boolean_format">true,false</prop>
<prop key="whitespace_stripping">true</prop>
<prop key="tag_syntax">auto_detect</prop>
<prop key="url_escaping_charset">UTF-8</prop>
<prop key = "template_exception_handler">cn.maple.xueshen.controller.exception.FreemarkerExceptionHandler</prop>
</props>
</property>
</bean>
注意!!!!上面配置里有这么一句话,作用就是配置你的FreemarkerExceptionHandle的
<prop key = "template_exception_handler">cn.xxx.xxx.controller.exception.FreemarkerExceptionHandler</prop>
二、自己建一个FreemarkerExceptionHandler 处理器,这个文件位置和名称就是你之前在xml里定义的
/**
* freemarker页面上的异常控制 在webmvc-config.xml里面的freemarkerSettings里头配置
*/
public class FreemarkerExceptionHandler implements TemplateExceptionHandler {
private static final Logger log = LoggerFactory
.getLogger(FreemarkerExceptionHandler.class);
@Override
public void handleTemplateException(TemplateException te, Environment env,
Writer out) throws TemplateException {
log.warn("[Freemarker Error: " + te.getMessage() + "]");
String missingVariable = "undefined";
try {
String[] tmp = te.getMessageWithoutStackTop().split("\n");
if (tmp.length > 1)
tmp = tmp[1].split(" ");
if (tmp.length > 1)
missingVariable = tmp[1];
out.write("[出错了,请联系网站管理员:${ " + missingVariable
+ "}]");
log.error("[出错了,请联系网站管理员]", te);
} catch (IOException e) {
throw new TemplateException(
"Failed to print error message. Cause: " + e, env);
}
}
}
配置到这里基本就结束了,以下是的我测试:
(1)测试页面代码:
<body>
<span>注册</span>
<form action="http://localhost:8080/XueShenWeb/go/register" method="post" class="form-x">
<input type="text" name="name" value="yan"><br/>
<input type="text" name="psw" value="yan" ><br/>
<input type="text" name="age" value="66">
<button type="submit">注册</button>
</form>
<br/><br/>
<span>登入</span>
<form action="http://localhost:8080/XueShenWeb/go/load" method="post" class="form-x">
<input type="text" name="name" value="chen" ><br/>
<input type="text" name="psw" value="123"} >
<button type="submit">登入</button>
</form>
<br/><br/>
<span>Test FreemarkerExceptionHandler ${name}</span>
</body>
(2)没有配置FreemarkerExceptionHandler,页面崩掉图:
(3)配置了FreemarkerExceptionHandler处理器后台没有报错,以下是测试效果图:
最后,想要学习搭建SpringMVC的朋友,可以点击这个链接,这是我写的入门教程,有问题可以跟我交流,一起进步。哈哈 http://blog.csdn.net/maple980326/article/details/51831753