码迷,mamicode.com
首页 > 其他好文 > 详细

模板引擎-beetl

时间:2014-12-09 17:58:13      阅读:299      评论:0      收藏:0      [点我收藏+]

标签:des   style   http   io   ar   os   sp   java   on   

项目背景:

        微门户页面上,介绍商家首页信息,而且这些信息比较少又不经常改变。【前期只单单针对商家首页进行静态处理,再由项目二期需要,再优化产品,优惠,等等模块,独立出专门模板服务类】故改用静态文件方式展示,真有需要时可以组建静态资源服务器,与业务服务器分离,减少服务器压力。

        管理端【发布/更新】商家信息时调用生成静态文件代码。商家实体添加一属性,作为保存静态文件的相对地址,当页面访问商家首页,直接跳转到该相对地址。

        模板文件为【*.html

        生成后的静态文件为【*.html

        文件存放位置如图所示...

        bubuko.com,布布扣

       

         Maven引用

<dependency>
    <groupId>org.beetl</groupId>
    <artifactId>beetl-core</artifactId>
    <version>${org.beetl-core.version}</version>
</dependency>

        

        Controller代码如下

    String srcTemplateFileName = "companyTemplate.html";
    String srcToFileName = "index.html";
    Map<String, String> info = companyService.getStaticInfo(publicAccountId, srcTemplateFileName, srcToFileName);
    //生成静态文件对象
    companyService.updateTemplateCompany(companyId, info);
		
    //更新该实体对象的静态文件路径
    //静态文件路径
    String dbToPath = info.get("dbToPath");
    //静态文件名称
    String toFileName = info.get("toFileName");
    //生成后的静态文件相对路径,持久化到实体中
    entity.setStaticFilePath(dbToPath + toFileName);
    companyService.update(entity);


        Service代码如下

        @Override
	public Map<String, String> getStaticInfo(Long publicAccountId, String templateFileName, String toFileName) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("templateFileName", "company/" + templateFileName);
		map.put("dbToPath", "/resources/static/company/" + dESServiceImpl.encrypt(publicAccountId+"") + "/");
		map.put("toPath", WebUtil.getRequest().getSession().getServletContext().getRealPath("/") + "/resources/static/company/" + dESServiceImpl.encrypt(publicAccountId + "") + "/");
		map.put("toFileName", toFileName);
		//检验生成静态文件目录不存在时自动创建目录
		File file = new File(map.get("toPath"));
		if(!file.exists()){
			file.mkdirs();
		}
		logger.info("生成静态文件时的路径参数:" + map);
		return map;
	}

	@Override
	public void updateTemplateCompany(Long companyId, Map<String, String> map) {
		Company company = super.find(companyId);
		Map<String, Object> param = new HashMap<String, Object>();
		param.put("company", company);
		param.put("basePath", RESOURCESURL);
		param.put("path", WebUtil.getRequest().getContextPath());
		logger.info("生成模板的参数:" + param);
		//模板文件名
		String templateFileName = map.get("templateFileName");
		//静态路径
		String toPath = map.get("toPath");
		//静态文件名
		String toFileName = map.get("toFileName");
		
		TemplateUtil.templateToFile(templateFileName, toPath, toFileName, param);
	}


        Beetl代码很简单的封装如下

    private static final String DEFAULT_CODE = "UTF-8";
 
    /**
     * 模板对象
     */
    private static GroupTemplate gt;
 
    /**
     * 获取webapp的系统路径
     */
    private static final String PATH = WebUtil.getRequest().getSession().getServletContext().getRealPath("/");
 
    /**
     * 存放模板的路径(配置到config.properties)
     */
    private static final String TEMPLATEFILEPATH = ConfigUtils.config.getProperty("defaultTemplatePath");
 
 
    static {
        FileResourceLoader fileResourceLoader = new FileResourceLoader(PATH + TEMPLATEFILEPATH, DEFAULT_CODE);
        logger.info("系统盘模板文件夹:" + PATH + TEMPLATEFILEPATH);
        Configuration cfg = null;
        try {
            cfg = Configuration.defaultConfiguration();
            cfg.setCharset(DEFAULT_CODE);
            gt = new GroupTemplate(fileResourceLoader, cfg);
        } catch (IOException e) {
            e.printStackTrace();
            logger.error("模板引擎初始化失败", e);
        }
    }
 
 
    /**
     * 根据模板文件生成静态文件(html)
     * 
     * @param templateFilePath
     *            存放模板文件路径
     * @param templateFileName
     *            模板文件
     * @param toPath
     *            生成静态文件后存放的路径
     * @param toFileName
     *            生成静态文件后的文件名称
     * @param param
     *            对象参数[实体对象,系统路径等]
     */
    public static void templateToFile(String templateFileName, String toPath,
            String toFileName, Map<String, Object> param) {
        // 测试生成时间
        Long startTime = System.currentTimeMillis();
 
        // 读取模板文件
        Template template = gt.getTemplate(templateFileName);
        logger.info("模板文件存放路径:" + (PATH + TEMPLATEFILEPATH + templateFileName));
 
        // 模板数据绑定
        template.binding(param);
 
        logger.info("静态文件存放路径:" + (toPath + toFileName));
 
        try {
            template.renderTo(new OutputStreamWriter(new FileOutputStream(new File(toPath + toFileName)),DEFAULT_CODE));
        } catch (BeetlException e) {
            logger.error("输出静态文件出错...");
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            logger.error("输出静态文件出错...");
            e.printStackTrace();
        }catch (Exception ex){
 
        }
        logger.info("耗时:" + (System.currentTimeMillis() - startTime) + "‘ms");
    }

        

        模板文件代码略,超级简单。因为用到【template.binding(param)】,把Map传入到页面,所以页面就可以如EL表达式取数据【${company.name}】

        bubuko.com,布布扣

模板引擎-beetl

标签:des   style   http   io   ar   os   sp   java   on   

原文地址:http://my.oschina.net/p2ng/blog/354207

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!