阶段5 3.微服务项目【学成在线】_day04 页面静态化_21-页面静态化-静态化测试-静态化程序编写
public String getPageHtml(String pageId){ /** * 静态化程序获取页面的DataUrl * * 静态化程序远程请求DataUrl获取数据模型 * * 静态化程序获取页面的模板信息 * * 执行页面静态化 */ }
定义getModelByPageId
定义一个专门的代码,用来表示页面找不到
CMS_PAGE_NOTEXISTS(false,24006,"页面不存在!"),
通过restTemplate方法获取dataUrl接口的数据
public Map getModelByPageId(String pageId){
//获取页面信息
CmsPage cmsPage = this.getById(pageId);
if(cmsPage==null){
ExceptionCast.cast(CmsCode.CMS_PAGE_NOTEXISTS);
}
//取出页面的dataUrl
String dataUrl=cmsPage.getDataUrl();
if(StringUtils.isEmpty(dataUrl)){
//页面dataurl为空
ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_DATAISNULL);
}
//通过restTemplate请求dataUrl获取数据
ResponseEntity<Map> forEntity = restTemplate.getForEntity(dataUrl, Map.class);
Map body = forEntity.getBody();
return body;
}
调用获取Map数据
获取页面模板
创建获取模板信息的方法:getTemplateByPageId
private String getTemplateByPageId(String pageId){ //取出页面信息 CmsPage cmsPage = this.getById(pageId); if(cmsPage==null){ ExceptionCast.cast(CmsCode.CMS_PAGE_NOTEXISTS); } //获取页面的模板Id String templateId = cmsPage.getTemplateId(); if(StringUtils.isEmpty(templateId)){ ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_DATAURLISNULL); } }
创建cmsTemplate的Dao
创建到接口:CmsTemplateRepository
在Service注入进来。
继续写方法 getTemplateByPageId下面的代码。拿到模板的id
private String getTemplateByPageId(String pageId){ //取出页面信息 CmsPage cmsPage = this.getById(pageId); if(cmsPage==null){ ExceptionCast.cast(CmsCode.CMS_PAGE_NOTEXISTS); } //获取页面的模板Id String templateId = cmsPage.getTemplateId(); if(StringUtils.isEmpty(templateId)){ ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_DATAURLISNULL); } //查询模板的信息 Optional<CmsTemplate> optional = cmsTemplateRepository.findById(templateId); if(optional.isPresent()){ CmsTemplate cmsTemplate = optional.get(); //获取模板文件Id String templateFileId = cmsTemplate.getTemplateFileId(); } }
直接复制刚才test内的代码
GridFSFile gridFsFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is("5dbeb89bface36388cb8c7d4")));
//打开一个下载流对象
GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFsFile.getObjectId());
//创建GridFsResource对象,获取流
GridFsResource gridFsResource = new GridFsResource(gridFsFile, gridFSDownloadStream);
//从流中取数据
String content = IOUtils.toString(gridFsResource.getInputStream(), "utf-8");
需要注入这两个
这样主方法getPageHtml调用,获取到模板的内容
执行静态化
getPageHtml方法内
封装静态化方法generateHtml
静态化的方法单独封装一个 generateHtml。
processTemplateIntoString需要抛出异常
所以把异常换成Exception,异常类型是最高级别
//执行静态化 private String generateHtml(String templateContent,Map model){ //创建配置文件 Configuration configuration = new Configuration(Configuration.getVersion()); //创建模板加载器 StringTemplateLoader stringTemplateLoader = new StringTemplateLoader(); stringTemplateLoader.putTemplate("template",templateContent); //想configuration配置模板加载器 configuration.setTemplateLoader(stringTemplateLoader); //获取模板 try { Template template = configuration.getTemplate("template"); //调用api进行静态化 String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, model); return content; } catch (Exception e) { e.printStackTrace(); } return null; }
主方法最终调用 返回html内容
最终主方法
拿页面信息,拿到里面模板id,然后去查询gridFS,最终拿到模板文件的内容。然后就可以执行静态化
最终代码
public Map getModelByPageId(String pageId){ //获取页面信息 CmsPage cmsPage = this.getById(pageId); if(cmsPage==null){ ExceptionCast.cast(CmsCode.CMS_PAGE_NOTEXISTS); } //取出页面的dataUrl String dataUrl=cmsPage.getDataUrl(); if(StringUtils.isEmpty(dataUrl)){ //页面dataurl为空 ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_DATAISNULL); } //通过restTemplate请求dataUrl获取数据 ResponseEntity<Map> forEntity = restTemplate.getForEntity(dataUrl, Map.class); Map body = forEntity.getBody(); return body; } private String getTemplateByPageId(String pageId){ //取出页面信息 CmsPage cmsPage = this.getById(pageId); if(cmsPage==null){ ExceptionCast.cast(CmsCode.CMS_PAGE_NOTEXISTS); } //获取页面的模板Id String templateId = cmsPage.getTemplateId(); if(StringUtils.isEmpty(templateId)){ ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_DATAURLISNULL); } //查询模板的信息 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); //从流中取数据 try { String content = IOUtils.toString(gridFsResource.getInputStream(), "utf-8"); return content; } catch (IOException e) { e.printStackTrace(); } } return null; } //执行静态化 private String generateHtml(String templateContent,Map model){ //创建配置文件 Configuration configuration = new Configuration(Configuration.getVersion()); //创建模板加载器 StringTemplateLoader stringTemplateLoader = new StringTemplateLoader(); stringTemplateLoader.putTemplate("template",templateContent); //想configuration配置模板加载器 configuration.setTemplateLoader(stringTemplateLoader); //获取模板 try { Template template = configuration.getTemplate("template"); //调用api进行静态化 String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, model); return content; } catch (Exception e) { e.printStackTrace(); } return null; } //生成静态页 主方法 public String getPageHtml(String pageId){ /** * 静态化程序获取页面的DataUrl * * 静态化程序远程请求DataUrl获取数据模型 * * 静态化程序获取页面的模板信息 * * 执行页面静态化 */ Map model = getModelByPageId(pageId); if(model==null){ //数据模型取不到 ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_DATAURLISNULL); } //获取页面的模板 信息 String template = getTemplateByPageId(pageId); if(StringUtils.isEmpty(template)){ ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_TEMPLATEISNULL);//页面模板为空 } //执行静态化 String html = generateHtml(template, model); return html; }