SpringBoot2(八)使用模版引擎时的注意事项
如今基本采用后端分离方式开发,本文内容可以不需要了解,作者用的是 Freemarker 模版引擎。
这几天在使用SpringBoot2的时候,发现了许多奇奇怪怪的bug,一样的配置,在Spring中不会发生的问题,在SpringBoot下突然就冒出来了。
通配符的使用:
为了减少页面的配置,经常会使用通配符,如下列代码,作用是:url 自动匹配 core 文件夹下的同名界面模版。
@RequestMapping(value = "core/**", method = RequestMethod.GET) public void core() { }
但是在SpringBoot下,这是十分危险的,如果未找到页面,代码会尝试寻找跟它匹配的路径,自动地帮我们去转发页面,转发之后依旧找不到,然后继续转发,始终未找到目标页面,就产生了无限转发,最终导致内存溢出(现象如此,暂未查看源码)。
下列日志:因为未找到 core/excel 路径,DispatcherServlet竟然自动拼接路径,然后进行页面转发 ,转发完还是找不到,然后路径就越拼接越长,最后内存溢出。
2019-12-17 00:32:46.614 [http-nio-8081-exec-3] DEBUG org.springframework.web.servlet.DispatcherServlet - "FORWARD" dispatch for GET "/Sea/core/
excel/core/excel/core/excel/core/excel/core/excel/core/excel/core/excel/core/excel/list?_bust=1576513963087", parameters={masked}
简单的处理方式就是在路径结尾加上扩展名
@RequestMapping(value = "core/**/*.ftl", method = RequestMethod.GET) public void core() { }
静态资源与模版不要取同名:
static下的资源文件都是可以直接访问的,template下的文件,配置后方可使用,这就产生一个问题:各放1个同名文件会如何?
比如:在static文件夹放了a.js,然后在template文件夹放了a.ftl,然后将两个路径前缀设置成一个样,使用 ‘xx/xx/a’ 路径进行访问。很明显,只有其中1个能访问,在配置了RequestMapping的情况下,未找到页面之后,直接报404错误,而不会再去查找static目录;如果没配置 RequestMapping,则直接访问static目录。
如果希望让程序自动去识别,要么在static放置a.js,要么就在template放置a.ftl,存在哪个文件,自动获取哪个,这种设计则是不允许的。
因此,static和template两个目录中的文件,尽可能选用完全不同的命名方式,避免出现意想不到的错误。
文件扩展名
Servlet下需要很清楚一点,请求最后的扩展名,有可能是被程序直接忽略的。比如 http://localhost/xx/1.png,特定场合下,最后面的 “.png” 写与不写,不会影响程序的执行,如果在目录中放置了同名文件(不同扩展名),需要着重观察代码的执行情况。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY