首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

freemarker字符集有关问题

2012-10-30 
freemarker字符集问题在项目中也用到了Freemarker生成静态文件。不过这里我要说的是编码的问题。我们的项目

freemarker字符集问题

       在项目中也用到了Freemarker生成静态文件。不过这里我要说的是编码的问题。我们的项目使用的都是UTF-8编码       当然我把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);         }     }
?

热点排行