文章目录
  1. 1. 代码
  2. 2. 解释

对于一些不经常改变的页面,比如商品详情页,我们可以做静态化提升访问速度。

本文介绍另一种页面缓存实现策略,将页面缓存至redis中,从而减少对库的访问,提升访问速度。

代码

@RequestMapping(value="/to_list", produces="text/html")
@ResponseBody
public String list(HttpServletRequest request, HttpServletResponse response, Model model,MiaoshaUser user) {
    model.addAttribute("user", user);
    //取缓存
    String html = redisService.get(GoodsKey.getGoodsList, "", String.class);
    if(!StringUtils.isEmpty(html)) {
        return html;
    }
    List<GoodsVo> goodsList = goodsService.listGoodsVo();
    model.addAttribute("goodsList", goodsList);
    SpringWebContext ctx = new SpringWebContext(request,response,
            request.getServletContext(),request.getLocale(), model.asMap(), applicationContext );
    //手动渲染
    String html = thymeleafViewResolver.getTemplateEngine().process("goods_list", ctx);
    if(!StringUtils.isEmpty(html)) {
        redisService.set(GoodsKey.getGoodsList, "", html);
    }
    return html;
}

解释

首先我们从redis中取页面缓存,如果能取到直接返回。

如果redis中不存在缓存则需要我们手动渲染,即

SpringWebContext ctx = new SpringWebContext(request,response,
            request.getServletContext(),request.getLocale(), model.asMap(), applicationContext );
//手动渲染
String html = thymeleafViewResolver.getTemplateEngine().process("goods_list", ctx);    

这里利用thymleaf的视图解析器获取到了对应的模板引擎,手动的对模型进行了渲染。将得到的html存入缓存同时返回页面。

model.asMap()

这个参数为页面模板中的参数,因此前面需要通过model.setAttribute()进行模板参数的填充

thymeleafViewResolver.getTemplateEngine().process("goods_list", ctx);

这里解析的模板名称即默认下我们要返回的模板名称,直接传入即可。

注意 @RequestMapping需要添加produces=”text/html”属性标记返回的媒体格式为html文档。

文章目录
  1. 1. 代码
  2. 2. 解释
Fork me on GitHub