SpringBoot集成Jfinal Enjoy模板引擎热加载问题的解决

SpringBoot集成Jfinal Enjoy模板引擎热加载问题的解决

Jfinal Enjoy模板引擎通过一段时间的使用, 感觉比freeMarker更方便, 与Jfinal的配置更是天衣无缝, 同时也可以在 SpringBoot中集成, 但在集成使用过程中还是有一些问题需要注意, 在这里列出, 以方便大家查阅.

获取ContextPath的问题

在任何一个网站系统中, 作为前台页面, 除非是写死的, 其实我们都需要知道Application运行的是什么目录, 否则引用路径就不正确了, 所以在我经手的项目中前面页面都会有一个root变量, 不管是js/css, 都需要, 在向服务器请求的方法中更是需要.
创建一个Enjoy配置类, 实现ApplicationListener, 使用getEngine().addSharedObject(“root”, getServletContext().getContextPath());即可, 但在热加载的过程中会提示该对象已存在,并抛出一个异常, 导致Application无法正常运行下去, 其实那就给它加一个try来解决.

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

上一篇
利用mysql(Mariadb)系统信息生成数据字典 利用mysql(Mariadb)系统信息生成数据字典
利用mysql(Mariadb)系统信息生成数据字典现在很多新手在做设计时并不是从正规流程来的, 可能是先完成了表的设计, 甚至是系统都开发完成了, 还没有数据库的相关文档, 那我们其实可以再反过来利用数据库的基础信息反向生成数据库字典文档
2018-12-24
下一篇
SpringBoot+JdbcTemplate通用Mapper的实现 SpringBoot+JdbcTemplate通用Mapper的实现
SpringBoot+JdbcTemplate通用Mapper的实现就我个人而言, 使用某个框架, 还是建议尽是只使用框架原生提供的方法来完成相关的操作, 这样从各方面来说应该都是性能最优的. 代码也应该是最好阅读和理解的. 这里还用上一篇