设置一个FreemarkerExceptionHandler捕获freemarker页面上的异常

2023-10-31

在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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设置一个FreemarkerExceptionHandler捕获freemarker页面上的异常 的相关文章

  • SpringMVC与Freemarker的集成以及多视图解析器配置

    一 Spring MVC视图解析器 视图解析器的工作流程大致是这样的 Controller的某个方法执行完成以后 返回一个视图 比如 listUser 视图解析器要做的工作就是找到某个对象 来完成视图的渲染 或者跳转到其他的逻辑视图 这里的
  • sudo pip install -i https://pypi.douban.com/simple --user MySQL-python报错‘my_config.h‘ file not found

    异常 Google了无数次 都没用 后面无意之间看到了一篇博客 https www codenong com cs107125972 按照他的方式改了 但是没有用 仔细检查异常报错后 到了client的目录 copy了一个文件之后可以了
  • NotWritablePropertyException

    ssm项目又来一个低级错误 粗心粗心 异常信息 Caused by org springframework beans NotWritablePropertyException Invalid property mapperLocation
  • Java的异常(分类、处理原则、应用实例、注意事项)

    学习笔记 异常 异常 是在运行时期发生的不正常情况 在java中用类的形式对不正常情况进行了描述和封装对象 描述不正常的情况的类 就称为异常类 以前 通常将正常流程代码和问题处理代码相结合 现在将正常流程代码和问题处理代码分离 提高阅读性
  • Java SpringMVC开发前的准备工作

    转自 Java SpringMVC开发前的准备工作 下文讲述Java开发前的相关准备工作 如下所示 JDK配置 tomcat配置 eclipse配置 一 JDK配置 需在开发机器上安装相应的JDK版本 然后可使用下列方法检测其是否安装成功
  • 使用Freemarker 实现JSP页面的静态化

    使用Freemarker 静态化网页 一 原理 Freemarker 生成静态页面 首先需要使用自己定义的模板页面 这个模板页面可以是最最普通的html 也可以是嵌套freemarker中的 取值表达式 标签或者自定义标签等等 然后后台读取
  • springMVC、freemarker页面半自动静态化

    1 请求 do的URL时直接生成对应的 htm文件 并将请求转发到该htm文件 2 自由控制某个页面是否需要静态化 如果看图不懂的呢 说白了这个中技术就是 java对象 ftl模型 输出html视图 1 在sprinMVC中 MVC框架中的
  • SpringMVC框架在Controller中对于Session的处理

    Controller中的代码 Controller SessionAttributes User Y 此处定义此Controller中将要创建和使用哪些session中的对象名 public class UserController Res
  • C#编程中遇到的一些异常及部分异常的解决方法

    以下内容是在本人在C 编程中遇到的异常 针对部分异常给出了解决办法 但是此解决方法是否真的好用 有待进一步考证 仅供参考 1 System Invalid Operation Exception 类型的未经处理的异常 出现在System W
  • java - 异常和断言

    什么是异常 异常就是指在程序运行的过程中发生一些不正常的时间 除0溢出 数组下标越界 所要读取的文件不存在 java的异常是Throwable派生类的一个实例 Throwable类包含在java lang中 Error类 LinkageEr
  • 如何制作创建多个文件的 Netbeans 模板?

    Netbeans 最棒的功能之一是使用一些 FreeMarker 模板生成代码 我对此有一些疑问 我希望这里有人可以帮助我 如何在 Netbeans 上制作一个生成多个文件的模板 例如 我使用 来自实体 Bean 的 JSF 页面 生成向导
  • Freemarker 中的 Java.time (Java 8) 支持

    有人知道 FreeMarker 有支持新 java time api 的计划吗 或者是否有任何代码可以支持 ZonedDateTime LocalDateTime 和 Instant 等类 自己实现这些东西并不难 但实际上是一个相当大的任务
  • Freemarker 编码 - 用问号代替重音字符

    我正在尝试使用 Freemarker 打印重音字符 但在重音字符的位置 我只得到问号 我已经证实 以下陈述成立 UTF 8 Environment getCurrentEnvironment getConfiguration getDefa
  • Netsuite Advanced PDF/HTML 代码 ifelse 语句

    我需要一些帮助 以正确的方式格式化此代码 以便在 Netsuite 中实现项目 td lt if item units null gt Units lt else gt tranline units td 我希望 PDF 表单显示测量单位
  • 从 Struts2 应用程序中的 FreeMarker 获取模板文本

    我想使用 Freemarker 在 Struts2 应用程序中生成电子邮件 由于我也在使用 Freemarker 来实现我的观点 因此我想 重用 相同的配置 使用 Spring 做同样的事情已经有一个类似的问题 在 Spring 应用程序中
  • 使用 Freemarker 中的参数调用 Java 方法

    以下 FTL 标记对我来说效果很好 并在我的服务器端 JiveActionSupport 对象中调用 getWidgets lt list widgets as widget gt do something with widget sku
  • FreeMarker编码混乱

    当我使用 FreeMarker 读取 UTF 8 编码模板时 特殊字符在浏览器中正确呈现 尽管freeMarkerConfig getDefaultEncoding 返回 Cp1252 如果我设置freeMarkerConfig setDe
  • 在 Netsuite 中,如何在项目履行生成的电子邮件中包含跟踪号码列表?

    我需要从 Netsuite 中的项目履行记录发送自定义 订单已发货 电子邮件 我正在使用 freemarker 制作电子邮件模板 我想在电子邮件中包含与商品配送相关的包裹的追踪号码 我尝试过使用 lt list transaction pa
  • FreeMarker - 获取当前 URL

    是否可以在 FTL 中获取当前页面的 URL 据我所知 freemarker 严格来说是一个模板引擎 它只是生成文本 并且无法知道该文本将出现在哪里 如果要包含 当前页面的 URL 则必须将该数据从主机 Java 代码传递到模板中 推荐 或
  • 对象集合表单的 Freemarker 语法 (Spring 3 MVC)

    我有一个命令 bean FooList 它有一个属性 它是一个集合 aList of Foo beans 我正在尝试创建一个可以编辑所有内容的表单Foo立刻 我发现了许多如何使用 JSP 执行此操作的示例 但我在将这些示例转换为 Freem

随机推荐

  • Linux设置所有用户环境变量

    Linux中每个用户都要指定各自的环境变量 这样会比较麻烦 那么如何配置一个环境变量 所有的用户都可以使用呢 比如说我想把Linux默认语言由en US UTF 8修改为zh CN UTF 8 那么我需要设置环境变量 LANG 百度很多方法
  • Conda 配置 Python 环境

    文章目录 前言 一 Conda 是什么 二 如何获取 三 使用 Conda 命令配置多环境 1 创建新环境 2 激活新环境 3 配置新环境 4 退出新环境 5 检查所有环境 6 检查所有安装的包 7 删除某环境 8 重命名某环境 四 使用
  • Crontab配置任务定时执行

    一 每奇数周的周一执行 16 0 1 date W 2 eq 1 gt dev null sh data1 test sh 具体地 1 分钟字段 Minute field 16 2 小时字段 Hour field 0 3 日期字段 Day
  • 亚马逊首席技术官Werner Vogels:2023年及未来五大技术趋势预测

    近年来 随着我们经历的数次全球危机 如何借助技术解决人类棘手问题至关重要 如今 我们获取数据的来源比以往任何时候都多 包括可穿戴设备 医疗设备 环境传感器 视频捕获和其他联网设备 当这些数据与计算机视觉 机器学习和模拟仿真等云技术相结合时
  • OpenWrt目录之target

    target目录下主要是和平台有关的代码 最主要的是linux文件夹 linux文件夹的ramips中 ramips应该指的是对应cpu的架构 ramips文件夹下的就是不同系列的cpu对应的芯片的型号 进行试验一下 首先在根目录下运行ma
  • IDEA工具实用开发快捷键

    选中new ArrayList lt gt 或者光标放在new前面 按ctrl alt v 选中new ArrayList lt gt 或者光标放在new后边面 按ctrl alt 空格 ideal 工具没识别maven项目的话 右键pom
  • uni-app开发微信小程序,button通过数组的length判断disabled无效(数组length === 0写法无效)

    错误写法
  • caffe特征提取/C++数据格式转换

    Caffe生成的数据分为2种格式 Lmdb 和 Leveldb 它们都是键 值对 Key Value Pair 嵌入式数据库管理系统编程库 虽然lmdb的内存消耗是leveldb的1 1倍 但是lmdb的速度比leveldb快10 至15
  • 国产操作系统进入被彻底抛弃的时代

    当倪光南正在不断呼喊支持国产操作系统的时候 国产操作系统却迎来了噩梦 国产操作系统接连倒闭 国产操作系统进入一个被国家彻底抛弃的时代 红旗linux梦断国产操作系统 今年2月中科红旗linux因为缺钱倒闭解散了 一直以来做得最好的国产操作系
  • 图形学数学基础之基本蒙特卡罗尔积分(Monte Carlo Integration)

    作者 i dovelemon 日期 2017 07 29 来源 CSDN 主题 Monte Carlo Integration 引言 好久没有写博客了 最近一直在忙于工作 同时GLB库中关于PBR的渲染算法 一直卡住 无法实现下去 不过在这
  • dd大牛的《背包九讲》

    P01 01背包问题 题目 有N件物品和一个容量为V的背包 第i件物品的费用是c i 价值是w i 求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量 且价值总和最大 基本思路 这是最基础的背包问题 特点是 每种物品仅有一件 可以选
  • 【HCNP路由交换学习指南】学习笔记丨第07章 BGP

    07 BGP BGP 的基本概念 BGP 对等体关系类型 IBGP 水平分割原则 路由黑洞问题及 BGP 同步规则 路由通告 Router ID 报文类型及格式 Open 报文 Update 报文 Keepalive 报文 Notifica
  • PaddleOCR使用笔记之模型训练

    目录 简介 模型训练 步骤一 文本检测模型 detection 1 准备训练数据集 2 下载预训练模型 模型介绍 下载预训练模型 3 开始训练 断点训练 4 模型评估 5 模型测试 6 训练模型转inference模型 步骤二 文本识别模型
  • RabbitMQ保证消息的一致性解决方案

    RabbitMQ保证消息的一致性 一 采用confirm消息确认机制及return返回机制 确保消息发送成功 二 将队列以及消息设置持久化 保证rabbitmq突然宕机消息仍然存在 三 手动确认接收消息方式 消息处理失败拒收重回队列 1 y
  • 后端响应是否成功、信息、操作码响应前端及异常处理

    异常处理流程 1 自定义异常类型 2 自定义错误代码及错误信息 3 对于可预知的异常由程序员在代码中主动抛出 由SpringMVC统一捕获 可预知异常是程序员在代码中手动抛出本系统定义的特定异常类型 由于是程序员抛出的异常 通常异常信息比较
  • java反射(从认识到应用)-黑马笔记

    此文章是观看黑马雷哥关于Java反射的视频做的笔记 如有错请多指教 一 认识反射 反射在JavaAPI中的详解 说白了 反射就是 加载类 并允许以编程方式解剖类中的各种成分 成员变量 方法 构造器等 如图 二 反射还学什么 加载类 获取类的
  • 做题

    在一个文件中定义一个全局变量 n 主函数 main 在另一个文件中定义函数 fn1 在 main 中对 n 赋值 再调用 fn1 在 fn1 中也对 n 赋值 显示 n 最后的值 include using namespace std in
  • style对象和less/scss互相转换,驼峰转中横线,支持嵌套转换

    不知道有没有小伙伴在维护或重构前端项目时修改样式的时候遇到js style和less scss需要互相转换的问题 本人找网上没有比较完善的转换工具 要么嵌套不支持 要么兼容不好 于是自己写了一个 请大家参考 emotion style In
  • CSDN英雄大会之 SOA技术观感

    5号假装英雄去北京参加了CSDN技术英雄大会 见到了很多一直想见的同行高手还有编辑记者 这里就不一一列举了 只是从SOA中间件开发角度列一下相关的内容 1 IBM如下划分SOA与构件 SOA4类关键构件 基础构件WAS MQ 流程构件WPS
  • 设置一个FreemarkerExceptionHandler捕获freemarker页面上的异常

    在Freemarker页面中如果使用 userName 并且userName为空 那么Freemarker页面就会崩掉 需要设置默认值 userName 来避免对象为空的错误 同理 user userName 也应该写成这样 user us