总结:静态化页面流程

首先我要储存数据model和模板template

一、数据我就不展示了,只要根据模板的数据模型去取就没什么问题,数据仅仅是数据
二、存储模板template

@Autowired
GridFsTemplate gridFsTemplate;

//存文件
@Test
public void test01() throws FileNotFoundException {
    //获取模板文件的文件指针
    File file = new File("d:/index_banner.ftl");
    //用文件输入流获取对文件内容的操作
    FileInputStream fileInputStream = new FileInputStream(file);
    //GridFs将文件储存后返回ID,表示该文件数据的主键
    ObjectId objectId = gridFsTemplate.store(fileInputStream, "index_banner.ftl");
    //打印ID
    System.out.println("objectId:" + objectId);
}

1、File file = new File(“d:/index_banner.ftl”);是我们已经写好的.ftl模板(和html差不多)
2、将该html文件储存到Mongodb的数据库中,并返回该文件的主键索引ID


静态化页面

页面静态化流程
1、静态化程序获取页面的DataUrl
2、静态化程序远程请求DataUrl获取数据模型。
3、静态化程序获取页面的模板信息
4、执行页面静态化

在这里插入图片描述
父方法:

@Autowired
GridFsTemplate gridFsTemplate;
@Autowired
GridFSBucket gridFSBucket;
@Autowired
RestTemplate restTemplate;
    
public String getPageHtml(String pageId){
     //获取数据模型
     Map modelByPageId = getModelByPageId(pageId);
     //获取页面模板
     String templateByPageId = getTemplateByPageId(pageId);
     //页面静态化
     String html = staticPage(templateByPageId, modelByPageId);
     
     return html;
 }

子方法:

//通过页面ID取出dataUrl再取出该页面的数据模型
  private Map getModelByPageId(String pageId){
      CmsPage cmsPage = getById(pageId);
      //根据页面ID寻找的页面不存在
      if(null==cmsPage){
          ExceptionCast.cast(CmsCode.CMS_PAGE_NOTEXIT);
      }
      String dataUrl = cmsPage.getDataUrl();
      //dataUrl为空抛出异常
      if(StringUtils.isEmpty(dataUrl)){
          ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_DATAISNULL);
      }
      //远程请求http获取数据模型
      ResponseEntity<Map> forEntity = restTemplate.getForEntity(dataUrl, Map.class);
      Map body = forEntity.getBody();
      if(null==body){
          ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_DATAISNULL);
      }
      return body;
  }

  private String getTemplateByPageId(String pageId) {
      CmsPage cmsPage = getById(pageId);
      if(null==cmsPage){
          ExceptionCast.cast(CmsCode.CMS_PAGE_NOTEXIT);
      }
      String templateId = cmsPage.getTemplateId();
      if(StringUtils.isEmpty(templateId)){
          ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_TEMPLATEISNULL);
      }
      Optional<CmsTemplate> optional = cmsTemplateRepository.findById(templateId);
      if(optional.isPresent()){
          CmsTemplate cmsTemplate = optional.get();
          //获取模板文件ID
          String templateFileId = cmsTemplate.getTemplateFileId();
          //根据文件ID查询文件
          GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(templateFileId)));
          //打开一个下载流对象
          GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
          //创建gridFsResource,用于获取流对象
          GridFsResource gridFsResource = new GridFsResource(gridFSFile, gridFSDownloadStream);
          //从流中读取数据
          String content = null;
          try {
              content = IOUtils.toString(gridFsResource.getInputStream(), "utf-8");
          } catch (IOException e) {
              e.printStackTrace();
          }
          if(StringUtils.isEmpty(content)){
              ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_TEMPLATEISNULL);
          }
          return content;
      }
      else {
          ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_TEMPLATEISNULL);
          return null;
      }
  }

  //静态化页面
  private String staticPage(String templateString, Map model){
      //定义配置类
      Configuration configuration = new Configuration(Configuration.getVersion());
      //使用FreeMarker模板加载器将templateString字符串变成模板
      StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
      stringTemplateLoader.putTemplate("template", templateString);
      //在配置中设置模板加载器并生成模板
      configuration.setTemplateLoader(stringTemplateLoader);
      Template template = null;
      try {
          //获取模板
          template = configuration.getTemplate("template", "utf-8");
      } catch (IOException e) {
          e.printStackTrace();
      }
      String content = null;
      try {
          //静态化
          content = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
      } catch (IOException e) {
          e.printStackTrace();
      } catch (TemplateException e) {
          e.printStackTrace();
      }
      return content;
  }

总结:

写这篇博客主要是为了让自己对静态化页面有初步的了解,有一套流程体系,代码不用详记,仅为了让自己有一个念头与了解。

发布了86 篇原创文章 · 获赞 1 · 访问量 4334

猜你喜欢

转载自blog.csdn.net/qq_42039738/article/details/105211862
今日推荐