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

原创 创建时间:2018-12-30 访问量:2515 赞:0 踩:0

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,这样就能完美的实现,后端动态页面静态化了。是不是很开心!!![赞]

评论
 我想说:
==已经到底了==
关注: 粉丝: 积分:
工联信息网
如有问题请致邮箱:need@glxxw2018.com(仅限本站无法查询到的资料);本站能够查询到的资料请关注“工联信息网”公众号,通过页面提供的资源码查询!
不良信息反馈及侵权投诉建议请致邮箱:accusation@glxxw2018.com