一:获取页面DataUrl并请求

    /**
     * 获取数据模型(根据获取的DataUrl请求数据)
     * @author : yechaoze
     * @date : 2019/6/8 19:04
     * @param pageId :
     * @return : java.util.Map
     */
    private Map getModelByPageId(String pageId){

        CmsPage cmsPage = this.findByID(pageId);
        if (cmsPage==null){
            ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_NOTEXISTS);
        }
        String dataUrl = cmsPage.getDataUrl();
        if (dataUrl==null){
            ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_DATAURLISNULL);
        }
        //根据restTemplate请求DataUri获取数据
        ResponseEntity<Map> forEntity = restTemplate.getForEntity(dataUrl, Map.class);
        Map body = forEntity.getBody();
        return body;

    }

二:获取页面模板信息

    /**
     * 获取页面模板信息
     * @author : yechaoze
     * @date : 2019/6/8 19:10
     * @param pageId :
     * @return : java.lang.String
     */
    public String getTemplate(String pageId){

        //获取页面信息
        CmsPage cmsPage = this.findByID(pageId);
        if (cmsPage==null){
            ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_NOTEXISTS);
        }
        String templateId = cmsPage.getTemplateId();
        if (templateId==null){
            ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_TEMPLATEISNULL);
        }
        //查询模板信息
        Optional<CmsTemplate> template = cmsTemplateResitory.findById(templateId);
        if (template.isPresent()){
            CmsTemplate cmsTemplate = template.get();
            //获取模板文件id
            String templateFileId = cmsTemplate.getTemplateFileId();
            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;

    }

注意点

GridFsTemplate与GridFSBucket需要事先注入
且GridFsBucket需要在配置类中配置(代码如下)

@Configuration
public class CmsConfig {

    @Value("${spring.data.mongodb.database}")
    String db;
    @Bean
    public GridFSBucket getGridFSBucket(MongoClient mongoClient){
        MongoDatabase database = mongoClient.getDatabase(db);
        GridFSBucket bucket = GridFSBuckets.create(database);
        return bucket;
    }
}

三:执行静态化

    /**
     * 执行静态化
     * @author : yechaoze
     * @date : 2019/6/8 20:41
     * @param template :
     * @param model :
     * @return : java.lang.String
     */
    private String generateHtml(String template,Map model){

        //创建配置对象
        Configuration configuration=new Configuration(Configuration.getVersion());
        //创建模板加载器
        StringTemplateLoader stringTemplateLoader=new StringTemplateLoader();
        stringTemplateLoader.putTemplate("template",template);
        //向配置对象配置模板加载器
        configuration.setTemplateLoader(stringTemplateLoader);
        //获取模板
        try {
            Template configurationTemplate = configuration.getTemplate("template");
            //调用api进行静态化
            String content = FreeMarkerTemplateUtils.processTemplateIntoString(configurationTemplate , model);
            return content;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

四:主方法中依次调用

    /**
     * 获取静态页面数据
     * @author : yechaoze
     * @date : 2019/6/8 19:05
     * @param pageId :
     * @return : java.lang.String
     */
    public String getHtml(String pageId){

        //获取数据模型
        Map model = this.getModelByPageId(pageId);
        if (model==null){
            ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_DATAISNULL);
        }

        //获取页面模板
        String template = this.getTemplate(pageId);
        if (StringUtils.isEmpty(template)){
            ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_TEMPLATEISNULL);
        }

        //执行静态化
        String generateHtml = this.generateHtml(template, model);
        return generateHtml;

    }

五:静态化的思路整理

获取DataUrl并执行请求

1.根据pageId获取页面信息
2.从页面信息中调用get方法获取DataUrl
3.使用restTemplate请求DataUrl并返回Map

获取模板信息

1.根据pageId获取页面信息
2.从页面信息中获取templateId
3.根据templateId获取模板信息并取出文件id
4.使用GridFS下载流以及文件id取出模板信息

执行静态化

1.创建FreeMarker包下的Configuration对象
2.创建模板加载器
3.在Configuration中配置加载器
4.从对象中取出模板
5.最后调用FreeMarker的api执行静态化

六:单元测试

一定要确保数据库中的所有信息都要匹配,模板和模型的数据一定能实现静态化


For sharing , For emulating , For enterprising