关于freemarker静态化生成html页面 乱码的问题

来源:互联网 发布:ftp 默认端口 编辑:程序博客网 时间:2024/06/05 18:48

今天在整理之前所学的知识,在复习freemarker生成html页面的时候出现了中文乱码的问题,

在费了一番时间后终于找到问题的原因,觉得挺有意思,就把这段记录下来。

下面是springmvc的核心代码

 <!-- freemarker的配置 -->    <bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">    <!-- templateLoaderPath  :前缀 -->    <property name="templateLoaderPath" value="/WEB-INF/ftl/"></property>    <!-- 编码 -->    <property name="defaultEncoding" value="utf-8"></property>    <!-- 可选的配置 -->    <property name="freemarkerSettings">          <props><prop key="template_update_delay">10</prop><prop key="locale">zh_CN</prop><prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop><prop key="date_format">yyyy-MM-dd</prop><prop key="time_format">HH:mm:ss</prop><!-- 页面数值的显示格式 --><prop key="number_format">#.##</prop><!-- 88,282,882,888,888 --><!-- 88282882888888.00  --></props>           </property>     </bean>          <!-- freemarker的解析器 -->     <bean id="freeMarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">     <!-- 后缀     .ftl:是freemarker模板文件的后缀      -->       <property name="suffix" value=".ftl"></property>       <property name="contentType" value="text/html;charset=utf-8"></property>       <!-- 方便页面获得项目的绝对路径 -->       <property name="requestContextAttribute" value="request"></property>     </bean>

然后是controller的核心代码

@RequestMapping("/getHtml")public String getHtml(HttpServletRequest request,HttpServletResponse response) throws Exception{//第一步 freemarkerConfigurer得到一个Configure对象Configuration configuration = freeMarkerConfigurer.getConfiguration();//第二步 得到一个模版文件Template template = configuration.getTemplate("index.ftl");    //第三步 构建数据模型Map<String, Object> map = new HashMap<String, Object>();map.put("uname", "zhangsan");map.put("bookList", BookDaoImpl.getBookList());System.out.println(BookDaoImpl.getBookList().get(0).getAuthor());//第四步 指定一个文件夹 构建一个输出流String dir = request.getSession().getServletContext().getRealPath("/WEB-INF/");//PrintWriter printWriter = new PrintWriter(new FileWriter(new File(dir,"index.html")));System.out.println(dir);//第五步 数据模型+模版文件 = 输出(控制台输出,html文件)template.process(map, printWriter);printWriter.flush();return "success";}
最后页面提示成功生成html页面


但在进入生成的html页面时发生了乱码


在网上也查了下大致给了以下几种解决方案
首先是说ftl文件的head上加上
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
因为我在springmvc的视图解析器配置了
<property name="contentType" value="text/html;charset=utf-8"></property>

所以这个选择首先pass掉,然后说是在controller里加上
configuration.setDefaultEncoding("UTF-8");
不过因为我在freemarker的环境配置我也配置了默认的编码
                <!-- 编码 -->    <property name="defaultEncoding" value="utf-8"></property>
所以应该也不是这个原因,后来我找到生成的html文件,发现用浏览器查看源代码虽然会乱码,但用记事本打开的时候所显示并没有乱码,然后判断是输出流的问题,通过网上查找发现FileWriter和FileReader使用的是系统默认的编码方式,因为fileWriter本身不具有用户指定编码的方式,这里选择使用filewriter 的父类OutputStreamWriter来读写操作,把代码
                String dir = request.getSession().getServletContext().getRealPath("/WEB-INF/");//PrintWriter printWriter = new PrintWriter(new FileWriter(new File(dir,"index.html")));
替换成
                String dir = request.getSession().getServletContext().getRealPath("/WEB-INF/index.html");OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(dir), "UTF-8");PrintWriter printWriter = new PrintWriter(writer);
后启动程序

乱码解决了,很开心!




阅读全文
0 0
原创粉丝点击