thymeleaf模板引擎调用java类中的方法(附源码)
前言
由于开源了项目的缘故,很多使用了My Blog项目的朋友遇到问题也都会联系我去解决,有的是把问题留在项目的issue里提出,有的是在我的私人博客里留言,还有的则是直接添加我的qq来找我讲自己遇到的问题,有些问题比较简单直接就解决了,有些问题的解决记录也留在issue记录里,有些则是网上有相关教程,至于问题的解决方案,如果时间允许我也会单独的做一篇博客来介绍和解答。
本文中的示例代码地址在:springboot-thymeleaf,希望大家多多支持。
问题分析
在My Blog项目的issue页面收到了这个问题,issue描述的是关于如何在thymeleaf模板页面中如何调用java类中的方法,问题描述如下截图:
但是只有截图,并没有报错原因及错误截图之类的有效信息,那哥们儿也没留下其他的信息,因此只能自己去模拟并试着去解决和分析这个问题,由issue描述可以得出异常信息:
Attempted to call method test() on null context object
从这条异常信息可以大致得出一个答案,调用的test()方法处于一个空对象中,即context域中并没有对应的java实例,因此无法调用。
当天也就回复了这个issue,给出的答案如下:
thymeleaf 的context,即提供数据的地方,基于web的context,即WebContext相对context增加 param,session,application变量,并且自动将request atttributes添加到context variable map,可以在模板直接访问。
虽然给出了答案,但是较为理论派,而且也没有复现此bug,因此又按照issue中的描述重新建了一个springboot+thymeleaf的项目,并且试着重现此问题并解决。
问题重现
重新编写了代码,没有把调用的java实例放入request对象中,重现代码如下:
public class MethodTestController {
@RequestMapping("/test1")
public String test1(HttpServletRequest request) {
return "test";
}
}
最终将此问题重现:
将此问题重现后,我又想,如果调用的方法为空会报什么错误呢?试着写了一下:
<p th:text="'调用不存在的方法: ' + ${MethodTest.service()} + '!'"/>
得到了如下的报错:
两个异常分别是:
- 异常1 :
Attempted to call method on null context object
调用的方法处于一个空对象中,即调用实例为空。
- 异常2 :
Method cannot be found
方法不存在
这两个异常都属于org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression
异常。
问题解决方案
分析至此,异常出现的问题已经无比清晰:
- 针对于异常1,需要将期望调用的java实例存入thymeleaf的context域中,代码层面即为:将实例对象存入Request对象中。
- 针对于异常2,则更加简单,仔细检查代码,不要写错调用方法名即可,不要使用未定义的方法。
结语
首发于我的个人博客。
如果有问题或者有一些好的创意,欢迎给我留言,也感谢向我指出项目中存在问题的朋友。
- php curl获取网页内容乱码和获取不到内容的解决方法
- vue组件详解(一)——组件与复用
- 【LeetCode 459】关关的刷题日记42 – Repeated Substring Pattern
- HDU 1848 Fibonacci again and again(SG函数)
- php 分页相关
- 最简单的php导出excel文件方法
- vue组件详解(二)——使用props传递数据
- Android获取QQ和微信的聊天记录,并保存到数据库
- 博弈论进阶之SG函数
- Discuz!的cookie机制
- Js的cookie和session
- vue组件详解(三)——组件通信
- 再免费多看一章--高斯贝叶斯
- JS编码解码
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Codeforce-Ozon Tech Challenge 2020-A. Kuroni and the Gifts
- 洛谷P3360偷天换日(树形DP)
- Java开发编程规范: 2.常量定义
- Codeforces Round #509 (Div. 2) A. Heist 贪心
- CodeForces - 1176A Divide it! (模拟+分类处理)
- Codeforces Round #460 (Div. 2)-A Supermaket(贪心)
- Codeforces Round #561 (Div. 2) A. Silent Classroom(贪心)
- codeforces 1287A -Angry Students(模拟)
- 洛谷 2016 战略游戏(树形DP)
- 洛谷2014 选课(树形DP)树形背包问题
- CF1288C-Two Arrays (DP)
- Java开发编程规范: 1.命名风格
- 图论——Tarjan 初步 DFS序+时间戳+欧拉序
- POJ 1330 Nearest Common Ancestors(裸LCA)
- 数学--数论--广义欧拉降幂(模板)