今天在整理之前所学的知识,在复习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);
后启动程序
乱码解决了,很开心!