真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringBoot中怎么實現(xiàn)頁面靜態(tài)化

SpringBoot中怎么實現(xiàn)頁面靜態(tài)化,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

公司專注于為企業(yè)提供成都網(wǎng)站制作、成都網(wǎng)站設計、外貿(mào)營銷網(wǎng)站建設、微信公眾號開發(fā)、商城網(wǎng)站定制開發(fā),成都微信小程序,軟件按需網(wǎng)站開發(fā)等一站式互聯(lián)網(wǎng)企業(yè)服務。憑借多年豐富的經(jīng)驗,我們會仔細了解各客戶的需求而做出多方面的分析、設計、整合,為客戶設計出具風格及創(chuàng)意性的商業(yè)解決方案,成都創(chuàng)新互聯(lián)公司更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務。

1. 配置Nginx代理靜態(tài)頁面

location / {
    root D:/temp/static;                  # 自定義靜態(tài)文件存放根目錄
    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實現(xiàn)手動把模板渲染結(jié)果寫入到指定位置

Thymeleaf手動渲染原理:當與SpringBoot結(jié)合時,放入Model的數(shù)據(jù)就會被放到上下文(Context)中,并且此時模板解析器(TemplateResolver)已經(jīng)創(chuàng)建完成(默認模板存放位置:templates,默認模板文件類型:html);然后通過模板引擎(TemplateEngine)結(jié)合上下文(Context)與模板解析器(TemplateResolver),利用內(nèi)置的語法規(guī)則解析,從而輸出解析后的文件到指定目錄。

/**
 * 模板引擎處理函數(shù)
 * 
 * @param templateName 模板名
 * @param context      上下文
 * @param writer       輸出目的地的流
 */
templateEngine.process(templateName, context, writer);
  • 具體實現(xiàn)

相關(guān)依賴:


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


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


  org.projectlombok
  lombok

配置文件:

server:
  port: 8080
# 自定義靜態(tài)文件存放根目錄
myserver:
  destPath: D:/temp/static

接口和實現(xiàn)類:

@RestController
public class GenerateApi {
    @Resource
    private GenerateHtml generateHtml;
    /**
     * 生成靜態(tài)首頁
     */
    @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;
    
    /** 靜態(tài)文件存放根目錄 */
    @Value("${myserver.destPath}")
    private String destPath;
    
    /** 模板引擎 */
    @Resource
    private TemplateEngine templateEngine;
    
    /**
     * 生成靜態(tài)首頁
     */
    @Override
    public String generateStaticHome(ServerWebExchange exchange) {
        // 上下文
        SpringWebFluxContext context = new SpringWebFluxContext(exchange);
        // 設置頁面數(shù)據(jù)
        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 "[靜態(tài)頁服務]:生成靜態(tài)首頁成功! ^_^";
        } catch (Exception e) {
            log.error("[靜態(tài)頁服務]:生成靜態(tài)首頁異常!", e);
            return "[靜態(tài)頁服務]:生成靜態(tài)首頁異常!"+e.toString();
        }
    }
}

html模板原型:




    
    Thymeleaf 靜態(tài)頁面
    


	
	

啟動測試:瀏覽器訪問:http://127.0.0.1:8080/generate/home或編寫測試類測試。

3. 將項目resources目錄下靜態(tài)資源復制到指定位置

相關(guān)依賴:


    commons-io
    commons-io
    2.8.0

接口和實現(xiàn)類:

public interface GenerateHtml {
    /**
     * 拷貝靜態(tài)資源文件
     */
    String generateStaticFiles();
}

@Slf4j
@Service
public class GenerateHtmlImpl implements GenerateHtml {
    /** 靜態(tài)文件存放根目錄 */
    @Value("${myserver.destPath}")
    private String destPath;

    /**
     * 拷貝靜態(tài)資源文件
     */
    @Override
    public String generateStaticFiles() {
        try {
            copyResourceToFile();
            return "[靜態(tài)頁服務]:拷貝靜態(tài)資源文件成功! ^_^";
        } catch (Exception e) {
            log.error("[靜態(tài)頁服務]:拷貝靜態(tài)資源文件異常!", e);
            return "[靜態(tài)頁服務]:拷貝靜態(tài)資源文件異常!"+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]獲取輸入流發(fā)生異常!", resource.getURL()));
                    throw new RuntimeException(String.format("[%s]獲取輸入流發(fā)生異常!", 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("創(chuàng)建本地目錄[%s]失敗!", resource.getURL()));
                }
            }
        }
    }

    /**
     * 創(chuàng)建目錄
     */
    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("創(chuàng)建目錄" + dirName + "成功!");
            return true;
        } else {
            log.warn("創(chuàng)建目錄" + dirName + "失??!");
            return false;
        }
    }
}

可在項目啟動后執(zhí)行覆蓋拷貝操作:

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

    @Override
    public void run(String... args) throws Exception {
          log.info("執(zhí)行MyCommandLineRunner:拷貝靜態(tài)文件!");
          // 拷貝靜態(tài)資源文件
          generateHtml.generateStaticFiles();
    }
}
  • 重啟測試: 發(fā)現(xiàn)指定目錄生成了靜態(tài)文件,并且請求速度得到了極大提升。

生成靜態(tài)文件:




    
    Thymeleaf 靜態(tài)頁面
    


    

頁面名字:testGenerateStaticHome

    

頁面版本:20210511-075911

關(guān)于SpringBoot中怎么實現(xiàn)頁面靜態(tài)化問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。


分享名稱:SpringBoot中怎么實現(xiàn)頁面靜態(tài)化
URL鏈接:http://weahome.cn/article/peidpi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部