SpringBoot集成Jfinal Enjoy模板引擎热加载问题的解决
Jfinal Enjoy模板引擎通过一段时间的使用, 感觉比freeMarker更方便, 与Jfinal的配置更是天衣无缝, 同时也可以在 SpringBoot中集成, 但在集成使用过程中还是有一些问题需要注意, 在这里列出, 以方便大家查阅.
获取ContextPath的问题
在任何一个网站系统中, 作为前台页面, 除非是写死的, 其实我们都需要知道Application运行的是什么目录, 否则引用路径就不正确了, 所以在我经手的项目中前面页面都会有一个root变量, 不管是js/css, 都需要, 在向服务器请求的方法中更是需要.
创建一个Enjoy配置类, 实现ApplicationListener
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;
/**
* Jfinal Enjoy模板支持
* @ClassName: EnjoyConf
* @author mrzhou@miw.cn<br>
* www.miw.cn<br>
* Nov 13, 2018 12:55:01 PM<br>
*/
@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热加载问题
再一个修改了代码或者页面后, devtools会进行热载, 重新刷新页面, 结果又出错了, object is not an instance of declaring class. 原因是 模板引擎没有被重新热加载, 这是devtools的加载机制引起的, 解决方法: 在src/main/resources目录下面创建META-INF文件夹,然后创建spring-devtools.properties文件,文件里面的内容如下即可:
restart.include.thirdparty=/enjoy-3.4.jar