SpringBoot集成Jfinal Enjoy模板引擎热加载问题的解决 Jfinal Enjoy模板引擎通过一段时间的使用, 感觉比freeMarker更方便, 与Jfinal的配置更是天衣无缝, 同时也可以在 SpringBoot中集成, 但在集成使用过程中还是有一些问题需要注意, 在这里列出, 以方便大家查阅.
获取ContextPath的问题 在任何一个网站系统中, 作为前台页面, 除非是写死的, 其实我们都需要知道Application运行的是什么目录, 否则引用路径就不正确了, 所以在我经手的项目中前面页面都会有一个root变量, 不管是js/css, 都需要, 在向服务器请求的方法中更是需要. 创建一个Enjoy配置类, 实现ApplicationListener, 使用getEngine().addSharedObject(“root”, getServletContext().getContextPath());即可, 但在热加载的过程中会提示该对象已存在,并抛出一个异常, 导致Application无法正常运行下去, 其实那就给它加一个try来解决.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 package com.ynca.conf;import org.springframework.context.ApplicationListener;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.event.ContextRefreshedEvent;import com.jfinal.template.ext.spring.JFinalViewResolver;import com.jfinal.template.source.ClassPathSourceFactory;@Configuration public class EnjoyConf { @Bean(name = "jfinalViewResolver") public ViewResolver getJFinalViewResolver () { ViewResolver viewResolver = new ViewResolver (); viewResolver.setDevMode(true ); viewResolver.setSourceFactory(new ClassPathSourceFactory ()); JFinalViewResolver.engine.setBaseTemplatePath("/templates/" ); viewResolver.setSuffix(".html" ); viewResolver.setContentType("text/html;charset=UTF-8" ); viewResolver.setOrder(0 ); return viewResolver; } public class ViewResolver extends JFinalViewResolver implements ApplicationListener <ContextRefreshedEvent> { @Override public void onApplicationEvent (ContextRefreshedEvent event) { try { getEngine().addSharedObject("root" , getServletContext().getContextPath()); } catch (Exception e) { } } } }
再一个修改了代码或者页面后, devtools会进行热载, 重新刷新页面, 结果又出错了, object is not an instance of declaring class. 原因是 模板引擎没有被重新热加载, 这是devtools的加载机制引起的, 解决方法: 在src/main/resources目录下面创建META-INF文件夹,然后创建spring-devtools.properties文件,文件里面的内容如下即可:
1 restart.include.thirdparty=/enjoy-3.4.jar