Spring Boot 技术探索

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".

17、Spring Boot中生成静态页的方法(Thymeleaf模板引擎提供)

平台环境:

名称

版本号

Mac OS X

10.14.6

JDK

1.8.0_201

Apache Maven

3.6.0

IntelliJ IDEA

2019.1 (Ultimate Edition)

Spring Boot

2.1.7.RELEASE

 

  相对使用公共页面根据访问请求不同动态加载不同信息,静态页是以根据访问请求不同加载不同的HTML页面。把动态加载信息的公共页面转换成一个个的静态页的过程就叫做生成静态页。

  Thymeleaf模板引擎提供了一系列简单优雅的前端页面展示的解决方案,其中就有生成静态页的方法。

  

生成静态页的好处有:

  1. 可以大大降低数据库存取以及服务器实时计算的压力,
  2. 静态页对搜索引擎的信息采集有着更加的友好性。

 

例子:

pom.xml中引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>ognl</groupId>
    <artifactId>ognl</artifactId>
    <version>3.2.11</version>
</dependency>

 

resources/templates中新建模板文件index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>生成静态页</h1>
    <br />
    <span th:text="${welcomeText}"></span>
</body>
</html>

 

新建IndexController

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class IndexController
{
    @RequestMapping("/welcome")
    public String toIndex(ModelMap map)
    {
        map.addAttribute("welcomeText", "Welcome to CodeLabX!");
        return "index";
    }
}

 

现在测试一下,启动项目,访问http://127.0.0.1:8080/welcome

可以看到

生成静态页
Welcome to CodeLabX!

 

以上是动态加载信息的用法,接下来实现生成静态页的功能。

新建工具类:FileUtil

package com.example.demo.util;

import java.io.File;

public class FileUtil
{
    // 删除文件夹
    // folderPath 文件夹完整绝对路径
    public static void delFolder(String folderPath)
    {
        try
        {
            delAllFile(folderPath); //删除完里面所有内容
            String filePath = folderPath;
            filePath = filePath.toString();
            java.io.File myFilePath = new java.io.File(filePath);
            myFilePath.delete(); //删除空文件夹
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    // 删除指定文件夹下所有文件
    // path 文件夹完整绝对路径
    public static boolean delAllFile(String path)
    {
        boolean flag = false;
        File file = new File(path);
        if (!file.exists())
        {
            return flag;
        }
        if (!file.isDirectory())
        {
            return flag;
        }
        String[] tempList = file.list();
        File temp = null;
        for (int i = 0; i < tempList.length; i++)
        {
            if (path.endsWith(File.separator))
            {
                temp = new File(path + tempList[i]);
            }
            else
            {
                temp = new File(path + File.separator + tempList[i]);
            }
            if (temp.isFile())
            {
                temp.delete();
            }
            if (temp.isDirectory())
            {
                delAllFile(path + "/" + tempList[i]); // 先删除文件夹里面的文件
                delFolder(path + "/" + tempList[i]); // 再删除空文件夹
                flag = true;
            }
        }
        return flag;
    }
}

这个类的用于对文件和文件夹的操作,还可以自己补充。

 

新建工具类TemplateEngineUtils

package com.example.demo.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.FileWriter;
import java.io.IOException;

@Component
public class TemplateEngineUtils
{
    @Autowired
    @Qualifier("templateEngineBean")
    private TemplateEngine engine;

    /**
     * 生成静态文件
     *
     * @param template 模板名称
     * @param context      数据内容
     * @param outFilePath  输出路径
     */
    public boolean process(String template, Context context, String outFilePath)
    {
        FileWriter fileWriter = null;
        try
        {
            fileWriter = new FileWriter(outFilePath);
            engine.process(template, context, fileWriter);
        }
        catch (IOException e)
        {
            e.printStackTrace();
            return false;
        }
        finally
        {
            try
            {
                fileWriter.close();
            } catch (IOException e)
            {
                e.printStackTrace();
                return false;
            }
        }
        return true;
    }
}

这个类是生成静态页的方法代码。

 

新建配置类WebConfig

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;

@Configuration
public class WebConfig
{
    @Bean
    public TemplateEngine templateEngineBean()
    {
        ClassLoaderTemplateResolver classLoaderTemplateResolver = new ClassLoaderTemplateResolver();
        classLoaderTemplateResolver.setPrefix("/templates/");
        classLoaderTemplateResolver.setSuffix(".html");
        classLoaderTemplateResolver.setCacheable(false);
        classLoaderTemplateResolver.setCharacterEncoding("utf-8");
        TemplateEngine engine = new TemplateEngine();
        engine.setTemplateResolver(classLoaderTemplateResolver);
        return engine;
    }
}

生成静态页方法中需要用到的TemplateEngine类的实例。这里初始化一个templateEngineBean,并指定模板文件的路径、后缀名、是否开启缓存、编码格式。

 

接下来新建测试类MyTests,调用上边我们准备好的代码。

package com.example.demo;

import com.example.demo.util.FileUtil;
import com.example.demo.util.TemplateEngineUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.thymeleaf.context.Context;

import java.io.File;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyTests
{
    @Autowired
    private TemplateEngineUtils templateEngineUtils;

    @Test
    public void toHtmlPageProcess()
    {
        // 创建文件夹
        String outFilePath = "/Users/wang/Downloads/springBootDemo17/";
        File destFile = new File(outFilePath);
        if(destFile.exists())
        {
            FileUtil.delFolder(outFilePath);
        }
        destFile.mkdirs();

        // 生成静态页
        Context context = new Context();
        context.setVariable("welcomeText", "Welcome to CodeLabX!");

        templateEngineUtils.process("index", context, outFilePath + "index.html");
    }
}

上面代码中的outFilePath可以根据自己电脑上的路径做修改。

执行测试方法,发现/Users/wang/Downloads/springBootDemo17/路径下多了一个文件index.html

 

用文本工具打开后,可以看到:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>生成静态页</h1>
    <br />
    <span>Welcome to CodeLabX!</span>
</body>
</html>

 

最后补充:

如果打算把生成的静态文件直接用来访问,可以这样写路径。生成到templates目录下。

String outFilePath = request.getServletContext().getRealPath("") + "WEB-INF/classes/templates/";

并且打成jar包,放到外部Tomcat下运行。

如果用内部Tomcat直接运行会出现文件已经生成了,但是无法访问的问题。

 

Bootstrap Thumbnail Second
MySQL

MySQL is the world's most popular open source database.

GO

Bootstrap Thumbnail Third
算法基础

本书介绍了什么是计算机算法,如何描述它们,以及如何来评估它们。

GO