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)站推廣的服務。
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
。
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ù) MapmodelMap = 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
或編寫測試類測試。
相關(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)知識。