java Freemarker页面静态化实例详解

Java FreeMarker页面静态化实例详解

什么是FreeMarker页面静态化

FreeMarker是一款基于模板技术实现的Java模板引擎,它可以将动态的HTML页面转化成静态的HTML页面,将一个基于模板的数据模型填充到模板中生成完整的HTML页面,并将HTML页面中的占位符等内容替换成相应的数据,将页面的内容动态的生成并输出。FreeMarker页面静态化是指将服务器端渲染的动态网页,由Java程序定时或者触发器方式生成静态化HTML页面,减少服务器直接处理动态页面的消耗,避免网站被大流量打崩。

实现步骤

  1. 引入FreeMarker依赖

在Maven中可以添加如下的依赖:

<dependency>
  <groupId>org.freemarker</groupId>
  <artifactId>freemarker</artifactId>
  <version>2.3.23</version>
</dependency>
  1. 构建FreeMarker配置类

构建一个FreeMarker配置类,配置模板和静态页面的存储位置

@Configuration
public class FreeMarkerConfig {

    @Value("${spring.freemarker.template-loader-path}")
    private String templateLoaderPath;

    @Value("${spring.freemarker.static-file-loader-path}")
    private String staticFileLoaderPath;

    @Bean
    public FreeMarkerConfigurationFactoryBean freeMarkerConfigurationFactoryBean() throws IOException {
        FreeMarkerConfigurationFactoryBean bean = new FreeMarkerConfigurationFactoryBean();
        bean.setTemplateLoaderPath(templateLoaderPath);
        // 设置页面名称和路径
        Map<String, String> nameMapping = new HashMap<>();
        nameMapping.put("test.ftl", "test.html");
        bean.setFreemarkerVariables(Collections.singletonMap("nameMapping", nameMapping));
        Properties settings = new Properties();
        settings.setProperty(freemarker.template.Configuration.TEMPLATE_UPDATE_DELAY_KEY, "5000");
        bean.setFreemarkerSettings(settings);
        return bean;
    }

    @Bean
    public FreeMarkerConfigurer freeMarkerConfigurer(FreeMarkerConfigurationFactoryBean bean) throws IOException {
        FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
        configurer.setConfiguration(bean.getObject());
        configurer.setDefaultEncoding("UTF-8");
        configurer.setPreferFileSystemAccess(false);
        Map<String, String> mappings = new HashMap<>();
        mappings.put("*.ftl", "*.html");
        configurer.setFreemarkerMappings(mappings);
        configurer.setFreeMarkerVariables(Collections.singletonMap("STATIC_FILE_LOADER",
        staticFileLoaderPath));
        return configurer;
    }

}
  1. 构建Java模板引擎工具类

构建一个工具类,用于将Java对象转化为Map,并结合相应的模板文件生成静态的HTML文件。

@Service
public class FreeMarkerService {

    @Autowired
    private Configuration configuration;

    public void toHtml(String templateName, String staticFileName, Object data) throws Exception {
        // 获取模板
        Template template = configuration.getTemplate(templateName);
        // 设置静态化文件路径
        String path = "./static/" + staticFileName;
        // 获取输出流
        FileWriter fileWriter = new FileWriter(path);
        // 渲染模板生成静态文件
        template.process(data, fileWriter);
        // 关闭输出流
        fileWriter.close();
    }

    public Map<String, Object> objectToMap(Object obj) throws Exception {
        if (obj == null) {
            return null;
        }
        Map<String, Object> map = new HashMap<>();
        BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor property : propertyDescriptors) {
            String key = property.getName();

            if (key.compareToIgnoreCase("class") == 0) {
                continue;
            }
            Method getter = property.getReadMethod();
            Object value = getter == null ? null : getter.invoke(obj);
            map.put(key, value);
        }
        return map;
    }

    public void toHtmlFromObject(String templateName, String staticFileName, Object obj) throws Exception {
        Map<String, Object> map = objectToMap(obj);
        toHtml(templateName, staticFileName, map);
    }

}
  1. 构建测试类

在测试类中使用方法toHtmlFromObject:将数据模型填充到模板中生成完整的HTML页面,并将HTML页面中的占位符等内容替换成相应的数据。

示例

以模拟网站电商商品详情页面,生成一个符合静态页面的html作为例子,具体步骤如下:

  1. 引入依赖

在Maven中添加FreeMarker依赖,pom.xml中的配置如下:

<dependency>
  <groupId>org.freemarker</groupId>
  <artifactId>freemarker</artifactId>
  <version>2.3.23</version>
</dependency>
  1. 配置FreeMarker

配置FreeMarker的模板和静态文件的存储位置,代码如下:

@Configuration
public class FreeMarkerConfig {

    @Value("${spring.freemarker.template-loader-path}")
    private String templateLoaderPath;

    @Value("${spring.freemarker.static-file-loader-path}")
    private String staticFileLoaderPath;

    // 通过此方法创建FreeMarkerConfigurationFactoryBean,配置FreeMarker
    @Bean
    public FreeMarkerConfigurationFactoryBean freeMarkerConfigurationFactoryBean() throws IOException {
        FreeMarkerConfigurationFactoryBean bean = new FreeMarkerConfigurationFactoryBean();
        bean.setTemplateLoaderPath(templateLoaderPath);
        // 设置页面名称和路径
        Map<String, String> nameMapping = new HashMap<>();
        nameMapping.put("goods.ftl", "goods.html");
        bean.setFreemarkerVariables(Collections.singletonMap("nameMapping", nameMapping));
        Properties settings = new Properties();
        settings.setProperty(freemarker.template.Configuration.TEMPLATE_UPDATE_DELAY_KEY, "5000");
        // 设置FreeMarker相关设置
        bean.setFreemarkerSettings(settings);
        return bean;
    }

    @Bean
    public FreeMarkerConfigurer freeMarkerConfigurer(FreeMarkerConfigurationFactoryBean bean) throws IOException {
        FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
        configurer.setConfiguration(bean.getObject());
        configurer.setDefaultEncoding("UTF-8");
        configurer.setPreferFileSystemAccess(false);
        Map<String, String> mappings = new HashMap<>();
        mappings.put("*.ftl", "*.html");
        configurer.setFreemarkerMappings(mappings);
        configurer.setFreeMarkerVariables(Collections.singletonMap("STATIC_FILE_LOADER",
        staticFileLoaderPath));
        return configurer;
    }

}
  1. 构建Java模板引擎工具类

构建一个工具类,用于将Java对象转化为Map,并结合相应的模板文件生成静态的HTML文件。代码如下:

@Service
public class FreeMarkerService {

    @Autowired
    private Configuration configuration;

    public void toHtml(String templateName, String staticFileName, Object data) throws Exception {
        // 获取模板
        Template template = configuration.getTemplate(templateName);
        // 设置静态化文件路径
        String path = "./static/" + staticFileName;
        // 获取输出流
        FileWriter fileWriter = new FileWriter(path);
        // 渲染模板生成静态文件
        template.process(data, fileWriter);
        // 关闭输出流
        fileWriter.close();
    }

    public Map<String, Object> objectToMap(Object obj) throws Exception {
        if (obj == null) {
            return null;
        }
        Map<String, Object> map = new HashMap<>();
        BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor property : propertyDescriptors) {
            String key = property.getName();

            if (key.compareToIgnoreCase("class") == 0) {
                continue;
            }
            Method getter = property.getReadMethod();
            Object value = getter == null ? null : getter.invoke(obj);
            map.put(key, value);
        }
        return map;
    }

    /**
     * 利用对象数据生成静态页面
     * @param templateName
     * @param staticFileName
     * @param obj
     * @throws Exception
     */
    public void toHtmlFromObject(String templateName, String staticFileName, Object obj) throws Exception {
        Map<String, Object> map = objectToMap(obj);
        toHtml(templateName, staticFileName, map);
    }

}
  1. 构建测试类

在测试类中使用方法 toHtmlFromObject:将数据模型填充到模板中生成完整的HTML页面,并将HTML 页面中的占位符等内容替换成相应的数据。代码如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class FreeMarkerTest {

    @Autowired
    private FreeMarkerService freeMarkerService;

    /**
     * 商品详情页面示例
     */
    @Test
    public void goodsTest() throws Exception {
        Goods goods = new Goods();
        goods.setName("iPhone 13");
        goods.setDescription("最新款 iPhone");
        goods.setPrice(new BigDecimal(9999));
        goods.setSales(0);
        // 模拟访问详情页,将数据转成静态文件
        freeMarkerService.toHtmlFromObject("goods.ftl", "iphone13_detail.html", goods);
    }

}
  1. 代码解析

在以上示例中,离线化实现过程核心是由 FreeMarker 实现模板渲染生成 HTML 页面,然后将生成的页面通过 Java IO 流输出到指定文件。具体代码解析如下:

FreeMarker 配置

FreeMarker 通过 Configuration(配置类)对模板引擎的配置进行初始化操作,将配置类作为参数进行构造,以便 FreeMarker 可以读取配置类中的各项参数进行初始化。示例中配置模板、静态文件存储路径,开启自动检测页面更新功能,将数据模型的变量名映射到文件名称的映射关系保存在 FreeMarker 配置的 freemarkerVariables 属性中,便于其他方法调用使用。

工具类 FreeMarkerService

FreeMarkerService 类是生成静态页面的核心类,它是将数据模型插入到 HTML 页面模板中、渲染对象存放于键值对 Map 中,并将生成的页面保存到指定的文件中。示例中主要通过 toHtml 方法来实现,它接受三个参数:模板名称、存储路径、数据模型,其中模板名称和存储路径的参数类型都是字符串类型。处理过程中,首先通过 Configuration 对模板进行初始化,然后使用 Template 实例加载模板,将渲染后的 HTML 页面生成文件大输出到指定路径, 最后关闭流。

toHtml 方法中,调用了 FreeMarker 的 process 方法,将配置类(即 Configuration)和数据模型传入,生成目标 HTML 页面内容并存入指定的输出流对应的文件中。

objectToMap 将对象转化成 Map 格式的数据,便于 FreeMarker 将对象数据模型中的数据解析出来填充到模板中。返回的 Map 对象中,键是数据变量名,值是变量值。

toHtmlFromObject 方法是生成静态页面的主方法,首先将 java 对象转成 Map 格式,然后以转换好的数据模型填充到模板中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java Freemarker页面静态化实例详解 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Java实现多项式除法的代码示例

    当我们需要将多项式 $P(x)$ 除以 $Q(x)$,得到商式 $S(x)$ 和余式 $R(x)$,其中 $P(x)$,$Q(x)$,$S(x)$ 和 $R(x)$ 均为多项式,我们可以使用 Java 来实现多项式除法。下面是 Java 实现多项式除法的代码示例: 1. 实现思路 Java 实现多项式除法的思路是利用多项式的数据结构,通过对多项式进行简化转换…

    Java 2023年5月19日
    00
  • 如何解决多线程安全问题?

    以下是关于如何解决多线程安全问题的完整使用攻略: 如何解决多线程安全问题? 在多线程编程中,为了避免多个线程同时访问共享导致的数据不一致、程序崩溃等问题,需要取相应的措施来解决多线程安全问题。以下是一些常的解决方法: 1. 使用锁机制 锁机制是一种常用的解决多线程安全问题的方法。在多线环境下,使用锁机制可以保证同一时间只有一个线程可以访问共享,从而避免了数据…

    Java 2023年5月12日
    00
  • SpringBoot配置绑定方法详解

    Spring Boot提供了一种方便的方式来将配置文件中的属性绑定到Java对象中,这被称为配置绑定。以下是Spring Boot配置绑定方法的详解: 1. 使用@ConfigurationProperties注解实现配置绑定 @ConfigurationProperties注解可以将配置文件中的属性绑定到Java对象中。使用@ConfigurationPr…

    Java 2023年5月14日
    00
  • Java日常练习题,每天进步一点点(33)

    下面我来详细讲解“Java日常练习题,每天进步一点点(33)”。 问题描述 本题目要求我们使用Java语言编写程序,实现一个计算器,可以进行加减乘除四个基本运算。 题目分析 对于这个题目,我们可以考虑使用面向对象的编程思想,将计算器看作一个对象,然后为计算器设计四个基本的操作方法。 编程实现 先定义一个Calculator类,其中包含四个方法add、sub、…

    Java 2023年5月20日
    00
  • maven

    # maven 1. maven基础 Maven是apache提供的一个项目管理工具,它的作用就是管理项目 2. maven作用 1). 依赖管理[方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题] 1. 依赖 denpendency 依赖(坐标):一个jar包 groupId 公司域名倒写 artifactId 项目名 version 版本号 坐…

    Java 2023年5月2日
    00
  • tomcat配置https的方法示例

    下面就为你详细讲解”Tomcat配置HTTPS的方法示例”: 简介 HTTP是一种不安全的通讯协议,通常情况下,我们都会采用HTTPS来进行网站的访问,以确保数据的安全性。Tomcat也可以进行HTTPS的配置,本篇文章就为大家提供Tomcat配置HTTPS的方法示例。 Tomcat配置HTTPS的方法 1. 生成SSL证书 在Tomcat配置HTTPS之前…

    Java 2023年5月19日
    00
  • JavaSpringBoot报错“TransactionTimedOutException”的原因和处理方法

    当使用Java的Spring Boot框架时,可能会遇到“TransactionTimedOutException”错误。这个错误通常是由以下原因之一引起的: 事务超时:如果事务执行时间超过了设置的超时时间,则可能会出现此错误。在这种情况下,需要增加超时时间或优化事务执行时间。 数据库锁:如果在事务执行期间出现了数据库锁,则可能会出现此错误。在这种情况下,需…

    Java 2023年5月5日
    00
  • SpringBoot项目整合mybatis的方法步骤与实例

    下面我将为您提供一份详细的SpringBoot整合MyBatis的攻略,包含以下步骤和示例。 步骤 步骤一:配置数据源 DataSource 在 application.properties 或 application.yml 中配置数据源(例如 MySQL)的相关信息,如下所示: spring: datasource: driver-class-name:…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部