`
zhkchi
  • 浏览: 121255 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

关于Freemarker生成静态文件的编码问题

阅读更多
转贴

首先感谢JScud提供的好文章。《使用FreeMarker生成Html静态文件(实例)》
      在我们的项目中也用到了Freemarker生成静态文件。不过这里我要说的是编码的问题。我们的项目使用的都是UTF-8编码,我直接使用 飞云小侠提供的方法生成的文件在UTF-8编码下察看是乱码,而GBK正常(后来发现因为我用的中文操作系统所以用GBK查看正常)。
      当然我把Freemarker的配置都改成了UTF-8,我的模版文件也是UTF-8编码的。下面是原来的代码
    public void setTemplatePath(Resource templatePath) {
        this.templatePath = templatePath;
        //设置freemarker的参数
        freemarkerCfg = new Configuration();
        try {
            freemarkerCfg.setDirectoryForTemplateLoading(this.templatePath.getFile());
            freemarkerCfg.setObjectWrapper(new DefaultObjectWrapper());
            freemarkerCfg.setDefaultEncoding("UTF-8");
        } catch (IOException ex) {
            throw new SystemException("No Directory found,please check you config.");
        }
    }
    /**
     * 生成静态文件
     * @param templateFileName 模版名称eg:(biz/order.ftl)
     * @param propMap 用于处理模板的属性Object映射
     * @param htmlFilePath 要生成的静态文件的路径,相对设置中的根路径,例如 "/biz/2006/5/"
     * @param htmlFileName 要生成的文件名,例如 "123.htm"
     * @return
     */
    private boolean buildHtml(String templateFileName,Map propMap, String htmlFilePath,String htmlFileName){
        try {
            Template template = freemarkerCfg.getTemplate(templateFileName);
            template.setEncoding("UTF-8");
            //创建生成文件目录
            creatDirs(buildPath.getFilename(),htmlFilePath);
            File htmlFile = new File(buildPath + htmlFilePath + htmlFileName);
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile)));
            template.process(propMap,out);
            out.flush();
            return true;
        } catch (TemplateException ex){
            log.error("Build Error"+templateFileName,ex);
            return false;
        } catch (IOException e) {
            log.error("Build Error"+templateFileName,e);
            return false;
        }
        
    }
下面是修改之后的代码
    /**
     * 生成静态文件
     * @param templateFileName 模版名称eg:(biz/order.ftl)
     * @param propMap 用于处理模板的属性Object映射
     * @param htmlFilePath 要生成的静态文件的路径,相对设置中的根路径,例如 "/biz/2006/5/"
     * @param htmlFileName 要生成的文件名,例如 "123.htm"
     * @return
     */
    private boolean buildHtml(String templateFileName,Map propMap, String htmlFilePath,String htmlFileName){
        try {
            Template template = freemarkerCfg.getTemplate(templateFileName);
            template.setEncoding("UTF-8");
            //创建生成文件目录
            creatDirs(buildPath.getFilename(),htmlFilePath);
            File htmlFile = new File(buildPath + htmlFilePath + htmlFileName);
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile),"UTF-8"));
            template.process(propMap,out);
            out.flush();
            return true;
        } catch (TemplateException ex){
            log.error("Build Error"+templateFileName,ex);
            return false;
        } catch (IOException e) {
            log.error("Build Error"+templateFileName,e);
            return false;
        }
        
    }
原因就在于OutputStreamWriter的不同构造方法

OutputStreamWriter(OutputStream out)
          创建使用默认字符编码的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName)
          创建使用指定字符集的 OutputStreamWriter。

 这个是中文JDK的文档说明,刚开始我使用默认的构造函数,所以使用了系统默认的编码,GBK,所以在生成静态文件的时候把UTF-8内容用GBK编码写入了,所以在UTF-8下浏览就有问题。

还有关于修改模版文件同样也要注意这个问题。
    public String loadTemplate(String templateName) {
        StringBuffer sb = new StringBuffer();
        try {
            File file = new File(templatePath+"/"+templateName);
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
            String line = reader.readLine();
            while(line != null)    {
                sb.append(line);
                sb.append("\r\n");
                line = reader.readLine();
            }
            reader.close();
        } catch (IOException e) {
            throw new SystemException("Loading template Error:",e);
        }
        return sb.toString();
    }
    public void saveTemplate(String templateName, String templateContent) {
        try {
            File file = new File(templatePath + "/" + templateName);
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF-8"));
            out.write(templateContent);
            out.flush();
            //扔出templatesave事件
            TemplateSaveEvent evt = new TemplateSaveEvent();
            evt.setTemplateName(templateName);
            dispatchTemplateEvent(evt);
        } catch (IOException e) {
            throw new SystemException("Write template Error",e);
        }
    }
分享到:
评论

相关推荐

    教你如何用FreeMarker生成静态页面.doc

    以下是一个简单的Java代码示例,展示了如何使用FreeMarker生成静态页面: 1. 导入所需的FreeMarker库和IO相关的类。 2. 创建一个名为`FreeMarkerUtil`的公共类。 3. 定义一个静态方法`analysisTemplate`,接收模板...

    freemaker生成静态文件时转换文件原编码GBK为UTF-8

    标题提到的"freemaker生成静态文件时转换文件原编码GBK为UTF-8",这涉及到的是在使用FreeMarker生成静态文件时,如何处理从GBK编码转换到UTF-8编码的问题。 GBK是GB2312编码的扩展,包含了更多的汉字,但在处理多...

    JAVA集成Freemarker生成静态html过程解析

    总结来说,Java集成Freemarker生成静态HTML的过程包括:引入Freemarker依赖、配置模板相关设置、编写模板文件、在Controller中处理请求并返回模板名、以及使用工具类将模板渲染为HTML并保存到磁盘。这个过程在Web...

    FreeMarker教你如何生成html静态页面源码

    5. **生成静态文件**:一旦HTML源码生成,你可以将其写入到磁盘上的一个文件中,从而创建静态页面。确保选择合适的路径,并正确处理文件的创建和覆盖。 6. **优化和调试**:在实际应用中,你可能需要对模板进行优化...

    freemarker 生成docx word所需jar

    4. 使用Freemarker生成XML:通过`Template`类的`process()`方法,将数据模型应用到模板上,生成一个XML字符串。 5. 创建Word文档:使用Apache POI的`XWPFDocument`类实例化一个新的docx文档。 6. 将XML转换为XWPF...

    关于Freemarker生成word的使用(java生成word).pdf

    在Java开发中,利用Freemarker生成Word文档是一种常见的需求,尤其是在处理动态数据和报告生成时。以下将详细介绍如何使用Freemarker和Java生成Word文档。 首先,理解Freemarker的工作原理:Freemarker是一个基于...

    SSH框架和FreeMarker动态网页生成静态技术

    最后,通过FreeMarker的`Template`类加载模板并渲染,生成静态HTML文件,这些文件可以直接被Web服务器提供,无需每次都通过服务器执行动态脚本。 动态网页静态化有诸多优点,例如减少服务器负载、提高页面加载速度...

    可视化div布局 生成freemarker模板

    在FreeMarker与Spring MVC结合使用时,Spring MVC负责处理HTTP请求,将数据模型传递给FreeMarker模板,然后由FreeMarker生成最终的响应。 6. **整合过程**:在实际项目中,开发者会先在可视化布局工具中设计好div...

    用Freemarker生成word文档

    在Java开发中,使用Freemarker生成Word文档能够实现动态数据填充,极大地提高了自动化报告或文档生成的效率。 要使用Freemarker生成Word文档,主要分为以下几个步骤: 1. **创建Word模板**: 首先,你需要在...

    java利用freemarker生成word.pdf

    Java 使用 FreeMarker 生成 Word 和 PDF 文件是一种常见的技术,它允许开发者动态地将数据填充到预先设计好的模板中,以创建定制化的文档。FreeMarker 是一个模板语言,它与 Java 紧密集成,用于生成各种格式的输出...

    java通过freemarker模板导出word含图片

    使用FreeMarker的`Template`类加载模板文件,然后用`process`方法将数据模型与模板结合,生成最终的Word文档。Apache POI库可以帮助我们处理生成的字节流,将其保存为`.doc`文件。 以下是一个简单的代码示例: ``...

    freemarker权威版 网站静态化

    2. **高效渲染**:Freemarker在服务器端生成静态页面,将计算和逻辑处理过程一次性完成,减少了客户端的等待时间。 3. **分离关注点**:开发者可以专注于业务逻辑,而设计师则专注于页面布局,两者的工作无需相互...

    FreeMarker 解析后缀名文件

    当我们需要根据不同的后缀名文件生成相应的输出时,FreeMarker的灵活性就体现出来了。例如,我们可以为每种文件类型创建一个特定的模板,然后根据输入文件的扩展名选择合适的模板进行解析。在Web应用中,这常用于...

    freemarker

    总结来说,FreeMarker是Java Web开发中用于生成静态页面的重要工具,通过与Struts2、Spring、Hibernate等框架集成,可以实现高效、灵活的视图层渲染,并且有利于网站性能优化。在实际项目中,静态化策略可以显著提升...

    freemarker解析成pdf

    1. **创建模板**:在Freemarker中,我们需要创建一个`.ftl`(Freemarker Template Language)文件,其中包含静态文本和动态占位符。动态占位符由${}或#{}包裹,用于插入数据模型中的值。例如,`${title}</h1>`会将...

    freemarker 简单项目示例

    本项目示例将深入探讨如何使用Freemarker来生成静态HTML页面,帮助你理解其基本原理和操作流程。 1. **Freemarker基础** - Freemarker是一个基于模板的开源Java库,它允许开发者通过定义模板语言(FTL,Freemarker...

    FreeMarker

    1. **数据更新问题**:当使用 FreeMarker 生成静态 HTML 页面时,可能会出现数据更新不及时的问题。 2. **学习成本**:虽然 FTL 相对简单,但仍然需要学习新的模板语言。此外,FreeMarker 对变量赋值的要求可能导致...

    Freemarker原理解析

    在实现FreeMarker生成静态页面的过程中,主要有以下几个步骤: 1. **创建FreeMarker模板文件**: 例如,创建一个名为`user.ftl`的模板文件,其中包含HTML结构,并使用`${...}`来标记动态数据的占位符。在这个例子...

    FreeMarkerUtil操作以及类(jsp静态页面生成)

    **使用FreeMarker生成静态页面的步骤** 1. **创建模板**: 设计并编写FreeMarker模板文件,模板中包含HTML结构和FreeMarker指令。 2. **构建数据**: 准备好要展示的数据,可能来自于数据库或其他数据源。 3. **...

    java Freemarker页面静态化实例详解

    在企业级应用中,它常被用来生成静态页面或用于数据展示。 首先,让我们了解 Freemarker 的基本概念。Freemarker 由三个主要部分组成:Freemarker API、数据和模板文件(通常为FTL文件)。API是Java代码,用于与...

Global site tag (gtag.js) - Google Analytics