freemarker解决中文乱码问题

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

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

下面是springmvc的核心代码

 
  1. <!-- freemarker的配置 -->

  2. <bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">

  3. <!-- templateLoaderPath :前缀 -->

  4. <property name="templateLoaderPath" value="/WEB-INF/ftl/"></property>

  5. <!-- 编码 -->

  6. <property name="defaultEncoding" value="utf-8"></property>

  7. <!-- 可选的配置 -->

  8. <property name="freemarkerSettings">

  9. <props>

  10. <prop key="template_update_delay">10</prop>

  11. <prop key="locale">zh_CN</prop>

  12. <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>

  13. <prop key="date_format">yyyy-MM-dd</prop>

  14. <prop key="time_format">HH:mm:ss</prop>

  15. <!-- 页面数值的显示格式 -->

  16. <prop key="number_format">#.##</prop><!-- 88,282,882,888,888 --><!-- 88282882888888.00 -->

  17. </props>

  18. </property>

  19. </bean>

  20.  
  21. <!-- freemarker的解析器 -->

  22. <bean id="freeMarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">

  23. <!-- 后缀

  24. .ftl:是freemarker模板文件的后缀

  25. -->

  26. <property name="suffix" value=".ftl"></property>

  27. <property name="contentType" value="text/html;charset=utf-8"></property>

  28. <!-- 方便页面获得项目的绝对路径 -->

  29. <property name="requestContextAttribute" value="request"></property>

  30. </bean>

然后是controller的核心代码

 
  1. @RequestMapping("/getHtml")

  2. public String getHtml(HttpServletRequest request,HttpServletResponse response) throws Exception{

  3. //第一步 freemarkerConfigurer得到一个Configure对象

  4. Configuration configuration = freeMarkerConfigurer.getConfiguration();

  5. //第二步 得到一个模版文件

  6. Template template = configuration.getTemplate("index.ftl");

  7. //第三步 构建数据模型

  8. Map<String, Object> map = new HashMap<String, Object>();

  9. map.put("uname", "zhangsan");

  10. map.put("bookList", BookDaoImpl.getBookList());

  11. System.out.println(BookDaoImpl.getBookList().get(0).getAuthor());

  12. //第四步 指定一个文件夹 构建一个输出流

  13. String dir = request.getSession().getServletContext().getRealPath("/WEB-INF/");

  14. //PrintWriter printWriter = new PrintWriter(new FileWriter(new File(dir,"index.html")));

  15. System.out.println(dir);

  16. //第五步 数据模型+模版文件 = 输出(控制台输出,html文件)

  17. template.process(map, printWriter);

  18. printWriter.flush();

  19. return "success";

  20. }

最后页面提示成功生成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的环境配置我也配置了默认的编码

 
  1. <!-- 编码 -->

  2. <property name="defaultEncoding" value="utf-8"></property>

所以应该也不是这个原因,后来我找到生成的html文件,发现用浏览器查看源代码虽然会乱码,但用记事本打开的时候所显示并没有乱码,然后判断是输出流的问题,通过网上查找发现FileWriter和FileReader使用的是系统默认的编码方式,因为fileWriter本身不具有用户指定编码的方式,这里选择使用filewriter 的父类OutputStreamWriter来读写操作,把代码

 
  1. String dir = request.getSession().getServletContext().getRealPath("/WEB-INF/");

  2. //PrintWriter printWriter = new PrintWriter(new FileWriter(new File(dir,"index.html")));

替换成

 
  1. String dir = request.getSession().getServletContext().getRealPath("/WEB-INF/index.html");

  2. OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(dir), "UTF-8");

  3. PrintWriter printWriter = new PrintWriter(writer);

后启动程序

乱码解决了,很开心!

猜你喜欢

转载自blog.csdn.net/qq_34627002/article/details/81417040
今日推荐