SpringBoot使用FreeMarker生成页面时再次调用其它Controller中的方法(一)


在早期使用SpringMVC与JSP实现的程序中,当请求达到JSP页面后,在JSP页面中可以再调用其它Controller定义的方法并渲染页面注入到当前的视图中。这种机制在后端生成HTML页面的传统方式是经常采用的机制,特别是PHP实现的Web应用十分常见,在JSP可以使用jsp:include指令就可以简单完成这种机制。

自从SpringBoot横空出世之后,JSP的页面生成方式就被边缘化了,早期SpringBoot 1.x的时期还有一些改良的实现,进入SpringBoot2.x的时代就基本完全抛弃JSP了,前后端分离机制已经成为了Web开发的主流,而传统Web开发的机制---后端生成前端则采用Thymeleaf、FreeMarker、Beetl等模板类视图,在这些模板类视图技术中FreeMarker一直都默默支持,网络上有大量的用法同时也有各种问题的挑战。

最后将几年前用SpringMVC+JSP实现Web程序找出来想重新用一下,发现已经根本运行不了,配置管理太麻烦了,还是使用SpringBoot大法好,于时就想用SpringBoot重新实现这个经典的Web应用。采用的技术是SpringBoot+FreeMarker+SpringJDBC来重写这个应用。在再次重写代码的过程就发生了文章开头提到的JSP页面包含request请求的问题,在JSP中可以使用指令jsp:include开实现,在FreeMarker中好像没有对应的机制。FreeMaker中的include指令不支持动态请求,只有包含静态的页面。

经过多次的研究之后,终于发现FreeMarker还额外提供了一个高级的指令<@include_page.../>可以像jsp:include指令一样完成这个功能,另外FreeMarker还支持在页面中使用JSP的标签,这样看来问题好像可以解决了。