SpringBoot中怎么实现页面静态化

SpringBoot中怎么实现页面静态化,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

公司专注于为企业提供成都网站制作、成都网站设计、外贸营销网站建设、微信公众号开发、商城网站定制开发,成都微信小程序,软件按需网站开发等一站式互联网企业服务。凭借多年丰富的经验,我们会仔细了解各客户的需求而做出多方面的分析、设计、整合,为客户设计出具风格及创意性的商业解决方案,成都创新互联公司更提供一系列网站制作和网站推广的服务。

1. 配置Nginx代理静态页面

location / {
    root D:/temp/static;                  # 自定义静态文件存放根目录
    set $www_temp_path $request_filename; # 设置请求的文件名到临时变量
    if ($uri = '/') {                     # 若为根目录则加上/index.html
        set $www_temp_path $request_filename/index.html;
    }
    if (!-f $www_temp_path) {             # 若请求的文件不存在,就反向代理服务器的渲染
        proxy_pass http://127.0.0.1:8080;
    }
    # 其他配置...
}

然后重启Nginx

2. Thymeleaf实现手动把模板渲染结果写入到指定位置

Thymeleaf手动渲染原理:当与SpringBoot结合时,放入Model的数据就会被放到上下文(Context)中,并且此时模板解析器(TemplateResolver)已经创建完成(默认模板存放位置:templates,默认模板文件类型:html);然后通过模板引擎(TemplateEngine)结合上下文(Context)与模板解析器(TemplateResolver),利用内置的语法规则解析,从而输出解析后的文件到指定目录。

/**
 * 模板引擎处理函数
 * 
 * @param templateName 模板名
 * @param context      上下文
 * @param writer       输出目的地的流
 */
templateEngine.process(templateName, context, writer);
  • 具体实现

相关依赖:


    org.springframework.boot
    spring-boot-starter-webflux


  org.springframework.boot
  spring-boot-starter-thymeleaf


  org.projectlombok
  lombok

配置文件:

server:
  port: 8080
# 自定义静态文件存放根目录
myserver:
  destPath: D:/temp/static

接口和实现类:

@RestController
public class GenerateApi {
    @Resource
    private GenerateHtml generateHtml;
    /**
     * 生成静态首页
     */
    @GetMapping("/generate/home")
    public  String generateStaticHome(ServerWebExchange exchange) {
        return generateHtml.generateStaticHome(exchange);
    }
}

public interface GenerateHtml {
    String generateStaticHome(ServerWebExchange exchange);
}

@Slf4j
@Service
public class GenerateHtmlImpl implements GenerateHtml {
    /** 打包时间 */
    @Value("${spring.application.build-time}")
    private String buildTime;
    
    /** 静态文件存放根目录 */
    @Value("${myserver.destPath}")
    private String destPath;
    
    /** 模板引擎 */
    @Resource
    private TemplateEngine templateEngine;
    
    /**
     * 生成静态首页
     */
    @Override
    public String generateStaticHome(ServerWebExchange exchange) {
        // 上下文
        SpringWebFluxContext context = new SpringWebFluxContext(exchange);
        // 设置页面数据
        Map modelMap = new HashMap<>();
        modelMap.put("name", "testGenerateStaticHome");
        modelMap.put("version", buildTime);
        context.setVariables(modelMap);
        // 输出流
        File dest = new File(destPath, "index.html");
        if (dest.exists()) {
            boolean delete = dest.delete();
        }
        try (PrintWriter writer = new PrintWriter(dest, "UTF-8")) {
            // 模板引擎生成html
            templateEngine.process("index", context, writer);
            return "[静态页服务]:生成静态首页成功! ^_^";
        } catch (Exception e) {
            log.error("[静态页服务]:生成静态首页异常!", e);
            return "[静态页服务]:生成静态首页异常!"+e.toString();
        }
    }
}

html模板原型:




    
    Thymeleaf 静态页面
    


	
	

启动测试:浏览器访问:http://127.0.0.1:8080/generate/home或编写测试类测试。

3. 将项目resources目录下静态资源复制到指定位置

相关依赖:


    commons-io
    commons-io
    2.8.0

接口和实现类:

public interface GenerateHtml {
    /**
     * 拷贝静态资源文件
     */
    String generateStaticFiles();
}

@Slf4j
@Service
public class GenerateHtmlImpl implements GenerateHtml {
    /** 静态文件存放根目录 */
    @Value("${myserver.destPath}")
    private String destPath;

    /**
     * 拷贝静态资源文件
     */
    @Override
    public String generateStaticFiles() {
        try {
            copyResourceToFile();
            return "[静态页服务]:拷贝静态资源文件成功! ^_^";
        } catch (Exception e) {
            log.error("[静态页服务]:拷贝静态资源文件异常!", e);
            return "[静态页服务]:拷贝静态资源文件异常!"+e.toString();
        }
    }

    /**
     * 资源清单获取并拷贝
     */
    private void copyResourceToFile() throws IOException {
        // 资源清单获取
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        org.springframework.core.io.Resource[] resources = resolver.getResources("static/**");
        for (org.springframework.core.io.Resource resource : resources) {
            String fileName = resource.getFilename();
            assert fileName != null;
            if (fileName.indexOf(".") > 0) {
                InputStream inputStream = null;
                try {
                    inputStream = resource.getInputStream();
                } catch (Exception e) {
                    log.warn(String.format("[%s]获取输入流发生异常!", resource.getURL()));
                    throw new RuntimeException(String.format("[%s]获取输入流发生异常!", resource.getURL()));
                }
                // 分析相对目录
                String tempPath = "";
                String[] urls = resource.getURL().toString().split("/static/");
                if (urls.length >= 2 ){
                    tempPath = urls[urls.length-1];
                } else {
                    throw new RuntimeException("relativeRootPath有误:无法分析相对目录");
                }
                tempPath = tempPath.substring(0, tempPath.length() - fileName.length());
                if (StringUtils.isEmpty(tempPath)) {
                    tempPath = File.separator;
                }
                String filePath = destPath + File.separator + tempPath;
                if (createDir(filePath)) {
                    String destName = filePath + fileName;
                    // 输出流
                    File dest = new File(destName);
                    if (dest.exists()) {
                        boolean delete = dest.delete();
                    }
                    FileUtils.copyInputStreamToFile(inputStream, dest);
                } else {
                    throw new RuntimeException(String.format("创建本地目录[%s]失败!", resource.getURL()));
                }
            }
        }
    }

    /**
     * 创建目录
     */
    private static boolean createDir(String dirName) {
        File dir = new File(dirName);
        if (dir.exists()) {
            return true;
        }
        if (!dirName.endsWith(File.separator)) {
            dirName = dirName + File.separator;
        }
        if (dir.mkdirs()) {
            log.warn("创建目录" + dirName + "成功!");
            return true;
        } else {
            log.warn("创建目录" + dirName + "失败!");
            return false;
        }
    }
}

可在项目启动后执行覆盖拷贝操作:

@Slf4j
@Component
@Order(value = 10)
public class MyCommandLineRunner implements CommandLineRunner {
    @Resource
    private GenerateHtml generateHtml;

    @Override
    public void run(String... args) throws Exception {
          log.info("执行MyCommandLineRunner:拷贝静态文件!");
          // 拷贝静态资源文件
          generateHtml.generateStaticFiles();
    }
}
  • 重启测试: 发现指定目录生成了静态文件,并且请求速度得到了极大提升。

生成静态文件:




    
    Thymeleaf 静态页面
    


    

页面名字:testGenerateStaticHome

    

页面版本:20210511-075911

关于SpringBoot中怎么实现页面静态化问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。


本文名称:SpringBoot中怎么实现页面静态化
文章网址:http://myzitong.com/article/peidpi.html