一、背景
1、什么是FreeMarker
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写
FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序
虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图)
2、FreeMarker特性
-
- 能够生成各种文本:HTML、XML、RTF、Java源代码等等
- 易于嵌入到你的产品中:轻量级;不需要Servlet环境
- 插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等
- 你可以按你所需生成文本:保存到本地文件;作为Email发送;从Web应用程序发送它返回给Web浏览器
二、整合
本示例是在spring的基础上整合freeMarker,所以对于spring的部分配置不重点关注;
1、项目目录结构
其中:springmvc-servlet是spring与freeMarker整合配置文件,而WEB-INF下的文件夹中,ftl为freeMarker的模板,jsp为spring的模板,resource为一些静态文件;
2、pom.xml中加入freeMarker的依赖
1 <!-- freemarker模板 --> 2 <dependency> 3 <groupId>org.freemarker</groupId> 4 <artifactId>freemarker</artifactId> 5 <version>2.3.23</version> 6 </dependency> 7
3、springmvc-servlet中的配置
1 <!-- 配置Jsp视图解析器 --> 2 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 3 <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView" /> 4 <property name="prefix" value="/WEB-INF/jsp/" /> 5 <property name="suffix" value=".jsp" /> 6 <property name="order" value="1" /> 7 </bean> 8 9 <!-- 配置freeMarker的模板路径 --> 10 <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 11 <property name="templateLoaderPath" value="/WEB-INF/ftl/" /><!--注意这儿不要添加classpath--> 12 <property name="defaultEncoding" value="utf-8" /> 13 <property name="freemarkerVariables"> 14 <map> 15 <entry key="xml_escape" value-ref="fmXmlEscape" /> 16 </map> 17 </property> 18 <property name="freemarkerSettings"> 19 <props> 20 <prop key="template_update_delay">0</prop> 21 <prop key="default_encoding">UTF-8</prop> 22 <prop key="number_format">0.##########</prop> 23 <prop key="date_format">yyyy-MM-dd</prop> 24 <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop> 25 <prop key="locale">zh_CN</prop> 26 <prop key="classic_compatible">true</prop> 27 <prop key="template_exception_handler">ignore</prop> 28 </props> 29 </property> 30 </bean> 31 <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/> 32 33 <!-- 配置freeMarker视图解析器 --> 34 <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 35 <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/> 36 <property name="contentType" value="text/html;charset=UTF-8"></property> 37 <property name="requestContextAttribute" value="request" /> 38 <property name="exposeSpringMacroHelpers" value="true" /> 39 <property name="exposeRequestAttributes" value="true" /> 40 <property name="exposeSessionAttributes" value="true" /> 41 <property name="cache" value="true" /> 42 <property name="prefix" value="" /> 43 <property name="suffix" value=".ftl" /> 44 <property name="order" value="0"/> 45 </bean>
其中:
1)jsp视图解析器与freeMarker视图解析器中的order属性,只有在spring项目多视图时才配置。上面配置中把freemarker的order设置为0,jsp为1。意思是找view时,先找ftl文件,再找jsp文件做为视图;
2)我感觉配置中最重要的属性是templateLoaderPath,即ftl模板的位置。没有这个属性的支持,其他的属性不起作用。我按照网上的一个配置给他的value加了classPaht,结果spring找不到ftl模板位置,让我吃了不少苦头。所以classPath不能有。我的建议是,在spring整合freeMarker时,暂时先不用管jsp是不是404,freeMarker配置完成后,先来一个小示例,如果跳转之后,出现404并且路径后面有jsp,那证明要么是templateLoaderPath属性有问题,要么是order属性有问题。而且跳转成功后看看flt页面${}中的数据有没有解析,如果没有也是不成功的。等到ftl页面显示正常,再考虑jsp与ftl两种视图共存的问题吧。
4、ftl模板。在WEB-INF/ftl下新建test.ftl
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>测试</title> 6 </head> 7 <body> 8 9 姓名:${userName} 10 <br/> 11 年龄:${userAge} 12 13 </body> 14 </html>
5、后端代码。跳转到test.ftl
1 @Controller 2 public class FreemarkerController { 3 4 @RequestMapping("/test") 5 public String sayHello1(ModelMap map){ 6 map.put("userName","小明"); 7 map.put("userAge",23); 8 return "test"; 9 } 10 11 }
6、浏览器显示
备注:Idea和Eclipse为了开发方便,都有ftl的插件,各位有兴趣可以看看。
到此为止,已经成功整合了SpringMVC和Freemarker!