springboot+thymeleaf+nginx实现动态页面纯静态化方案

原文地址:http://www.glxxw2018.com/study/blog/detail/9K6elibXWb.html

1、前面有一篇博客介绍了《使用Nginx的try_files实现动态页面纯静态化的简单解决方案》,主要介绍,在nginx可以先使用静态页面,没有找到静态页面后尝试使用反向代理访问后端请求的实现方式。本篇博客主要介绍,如何生成静态内容页面。如博客的内容页面。

2、如果你的模板使用的是thymeleaf,jsp还没有研究过,那么事情就可以得到解决了。例如nginx根目录在/usr/local/nginx/html,那么SpringBoot中的thymeleaf就可以根据请求的路径生成静态页面,并放在对应的目录下,例如,如果请求的路径是http://www.abc.com/blog_nr/xxx.html,那么就生成静态文件xxx.html,并将其放在/usr/local/nginx/html/blog_nr目录下,即静态文件xxx.html的绝对路径为:

/usr/local/nginx/html/blog_nr/xxx.html

3、既然生成了静态页面,那么就有可能要删除这个静态页面,比如更新这篇博客时,就应该删除xxx.html文件,那么下次访问时,nginx从root目录下就找不到这个xxx.html,就会去访问反向代理,请求后端服务。重新生成这个xxx.html文件。

4、我们可以为静态页面文件的生成与删除,编写一个服务Service类,源代码如下所示:

@Service
public class StaticHtmlService {
	
	protected Logger logger = LoggerFactory.getLogger(StaticHtmlService.class);
	
	@Autowired
	private TemplateEngine templateEngine;//这是thymeleaf模板处理引擎
	
	@Autowired
	private ApplicationContext appContext;//这是Spring容器上下文
	
	@Autowired
	private ConfigProperties config;//这是工程中的配置属性,如静态文件的根目录/usr/local/nginx/html
	
	/**
	 * 生成html静态页面
	 * @param modelAndView
	 * @param request
	 * @param response
	 */
	public void genHtmlPage(ModelAndView modelAndView, HttpServletRequest request, HttpServletResponse response) {
		FileWriter fileWriter = null;
		try {
			String fileName = request.getRequestURI();
			if(!fileName.endsWith(".html")) {//将.html结尾的请求生成静态页面
				return;
			}
			fileName = config.getHtmlPath() + fileName;//构造静态html文件完整路径
			File file = new File(fileName);
			if(!file.getParentFile().exists()) {
				file.getParentFile().mkdirs();
			}
			fileWriter = new FileWriter(file);
			SpringWebContext context = new SpringWebContext(request, response, request.getServletContext(), request.getLocale(), modelAndView.getModelMap(), appContext);
			templateEngine.process(modelAndView.getViewName(), context, fileWriter);//将thymeleaf模板生成的结果存入静态文件中
			logger.info("已生成静态文件:" + fileName);
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			IOUtils.closeQuietly(fileWriter);
		}
	}
	
	/**
	 * 用于更新时删除之前生成的静态页面
	 * @param fileName
	 */
	public void deleteHtmlPage(String fileName) {
		try {
			fileName = config.getHtmlPath() + fileName;
			File file = new File(fileName);
			//删除文件或目录
			FileUtils.deleteQuietly(file);
			logger.info("已删除静态文件:" + fileName);
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

}

5、在Controller方法调用这个Service,这样就能完美的实现,后端动态页面静态化了。是不是很开心!!![赞]

工联信息网:http://www.glxxw2018.com

你可能感兴趣的:(springboot+thymeleaf+nginx实现动态页面纯静态化方案)