文档章节

web项目FreeMarker页面加载刷新

青宇0223
 青宇0223
发布于 2017/08/23 17:11
字数 383
阅读 9
收藏 0
点赞 0
评论 0

说明:开发环境中,ftl页面的加载位置有时候很难控制,如果要经过编译,那么templateloader加载的是编译路径下的模板,因此项目运行时无法实时对改过后的模板,在页面上实现实时更新,

template_update_delay这个参数只能作用编译路径的位置

 

如何实现ftl不在webapp静态资源目录下,在编译路径下也可以正常在开发中项目启动中实时改变页面内容。

package com.maop.portal.core.freemarker;

import com.maop.common.core.EasyFreemarkerExceptionHandler;
import com.maop.portal.core.EasyConfiguration;
import com.maop.portal.core.StartupUtils;
import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.FileTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.TemplateException;
import org.springframework.core.io.Resource;
import org.springframework.ui.freemarker.SpringTemplateLoader;
import org.springframework.util.SystemPropertyUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import javax.servlet.ServletContext;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Properties;

public class EasyFreeMarkerConfigurer extends FreeMarkerConfigurer {
    public EasyFreeMarkerConfigurer() {
    }

    protected Configuration newConfiguration() throws IOException, TemplateException {
        EasyConfiguration configuration = new EasyConfiguration(Configuration.VERSION_2_3_22);
        configuration.setLocalizedLookup(false);
        configuration.setTemplateExceptionHandler(new EasyFreemarkerExceptionHandler());
        return configuration;
    }

    protected void postProcessTemplateLoaders(List<TemplateLoader> templateLoaders) {
        templateLoaders.add(new ClassTemplateLoader(FreeMarkerConfigurer.class, "/page"));
        this.logger.info("ClassTemplateLoader for Spring macros added to FreeMarker configuration");
    }

    public void setServletContext(ServletContext servletContext) {
    }

    public void setTemplateLoaderPath(String templateLoaderPath) {
        String resolvedTemplateLoaderPath = SystemPropertyUtils.resolvePlaceholders(templateLoaderPath);
        super.setTemplateLoaderPath(resolvedTemplateLoaderPath);
    }

    protected TemplateLoader getTemplateLoaderForPath(String templateLoaderPath) {
        if(this.isPreferFileSystemAccess()) {
            try {
                /*
                    指定开发模板选择地址
                 */
                if(templateLoaderPath.startsWith("classpath")&&System.getProperty("app.env").equals("dev")){
                    File file=new File(System.getProperty("user.dir")+"\\src\\main\\resources\\page");
                    if(this.logger.isDebugEnabled()) {
                        this.logger.debug("Template loader path [" + file.getAbsolutePath() + "]");
                    }
                    return new FileTemplateLoader(file);
                }

                Resource ex = this.getResourceLoader().getResource(templateLoaderPath);
                File file = ex.getFile();
                if(this.logger.isDebugEnabled()) {
                    this.logger.debug("Template loader path [" + ex + "] resolved to file path [" + file.getAbsolutePath() + "]");
                }
                return new FileTemplateLoader(file);
            } catch (IOException var4) {
                this.logger.warn("Cannot resolve template loader path [" + templateLoaderPath + "] to [java.io.File]: using SpringTemplateLoader as fallback");
                return new SpringTemplateLoader(this.getResourceLoader(), templateLoaderPath);
            }
        } else {
            this.logger.debug("File system access not preferred: using SpringTemplateLoader");
            return new SpringTemplateLoader(this.getResourceLoader(), templateLoaderPath);
        }
    }

    public void setFreemarkerSettings(Properties settings) {
        if(StartupUtils.isLocalDev()) {
            settings.setProperty("template_update_delay", "1");
        } else {
            settings.setProperty("template_update_delay", "3600");
        }

        this.logger.info("template_update_delay: " + settings.getProperty("template_update_delay"));
        String autoImport = settings.getProperty("auto_import");
        String resolveAutoImport = SystemPropertyUtils.resolvePlaceholders(autoImport);
        this.logger.info("resolve auto_import: [" + autoImport + "] to [" + resolveAutoImport + "]");
        settings.setProperty("auto_import", resolveAutoImport);
        super.setFreemarkerSettings(settings);
    }
}

© 著作权归作者所有

共有 人打赏支持
青宇0223
粉丝 0
博文 1
码字总数 383
作品 0
东城
程序员
freemaker开发学习《一》

 FreeMarker是一个非常优秀的模板引擎,这个模板引擎可用于任何场景,FreeMarker负责将数据模型中的数据合并到模板中,从而生成标准输出.FreeMarker可以提供昜好的团队协作,对于界面开发人...

xiaml
2014/04/25
0
0
细数FreeMarker的优缺点

一、 FreeMarker简介 FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。 所谓模板,就是一份已经写好了基本内容,有着固定格式的文档,其中空出或者用占位符标识的内容...

oecp
2011/04/22
0
3
FreeMarker配置与应用

FreeMarker 2.3.18 下载: http://sourceforge.net/projects/freemarker/files/freemarker/2.3.18/freemarker-2.3.18.tar.gz/download FreeMarker 2.3.18 API:http://freemarker.sourcefor......

i33
2012/10/25
0
0
手把手教你新建Jfinal 项目(五)

Freemarker原理解析 2011-05-13 11:19:41| 分类: JavaEE | 标签:freemarker 模板 变量 数据模型 文件 |字号 订阅 FreeMarker生成静态页原理 FreeMarker适合于作为Web应用的表现层。freemar...

胡萝卜炒肉
2014/05/29
0
1
FreeMarker如何生成静态页面

一、 FreeMarker生成静态页原理 众所周知,FreeMarker适合于作为Web应用的表现层,那么我们就把把页面中所需要的样式放入FreeMarker文件中,然后将页面所需要的数据动态绑定,并放入Map中,通...

oecp
2011/05/30
0
0
Struts2与Freemarker的配置方法(附源码和插件)

Freemarker是模板引擎,也可以说是一种表现层的框架,它有自己的模板指令,开发者如果不熟悉这些语法,很难进行表现层的开发。Struts2框架技术对Freemarker做了很好的支持,开发人员只要熟悉...

oecp
2011/04/28
0
0
FreeMarker在Web应用中的配置

一、FreeMarker介绍: FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实...

期待变强的菜鸟
2014/11/03
0
0
分享Struts2与Freemarker的配置方法

刚才在OECP社区看到一篇文章,《Struts2与Freemarker的配置方法》觉得很好,所以转发给大家分享一下。 Freemarker是模板引擎,也可以说是一种表现层的框架,它有自己的模板指令,开发者如果不...

oecp
2011/05/16
0
0
FreeMarker在eclipse中的入门例子

刚接触FreeMarker时,只是简单的了解FreeMarker的一些概念及工作原理,至于如何使用FreeMarker还不是非常清楚。随着学习的深入,才渐渐对FreeMarker有了更深入的理解。本文将从基础应用着手,...

oecp
2011/05/16
0
0
FreeMarker配置(Configuration)

基础 Configuration 是一个存放应用级别(application level)公共配置信息,以及模版(Template)可使用的全局共享变量的一个对象。同时它还负责模版(Template)实例的创建以及缓存。Confi...

空心大白菜
2013/11/12
0
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
5
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
1
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
165
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
昨天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
昨天
2
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
昨天
2
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部