首先我要储存数据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;
}
总结:
写这篇博客主要是为了让自己对静态化页面有初步的了解,有一套流程体系,代码不用详记,仅为了让自己有一个念头与了解。