主题词:Freemarker、freemarker与Spring的整合
- 常见的模板引擎
国内:Beetl enjoy
国外:freemarker velocity Thymeleaf
- 什么是Freemarker?
- FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
- FreeMarker是免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarker Template Language(FTL),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据, 而在模板之外注意于要展示什么数据。
- 简单总结
What:是一个模板引擎,可以将模板和数据整合,生成静态页面
Why:提高高并发系统的响应性能,是一种缓存策略
When:对于频繁使用数据查询但是更新内容很少的应用
- 面试题:高并发网络架构解决方案分析
- Freemarker常用手册
- 官网:
- 英文手册:docs/index.html
- 中文手册:
- 基本原理
- 需求1:使用freemarker在本地硬盘目录下生成html页面
- 创建一个configuration对象。构造函数的参数就是对应的版本号
- 设置模板文件所在的路径
- 设置模板文件使用的字符集,使用UTF-8字符集
- 加载模板,创建模板对象
- 创建数据集,可以是POJO也可以是Map,多使用Map
- 创建一个Writer对象,多创建FileWriter对象,并制定生成的文件名
- 调用模板对象的process方法输出文件
- 关闭流
- 实际代码
@Test public void test1() throws Exception{ //创建配置对象 Configuration configuration = new Configuration()); //设置模板文件所在的路径 con(),"/ftl"); //设置字符集 con("UTF-8"); //创建模板对象 Template template = con("01.ftl"); //创建数据集 Map<String,Object> dataModel = new HashMap<String,Object>(); da("name", "丁昊成"); //创建Writer对象 Writer out = new FileWriter("d:/ftl;); //使用模板对象输出文件 (dataModel, out); //关闭流 out.close(); }
- Freemarker与Spring整合
- 需求2:完成商品详情页系统tt-item-web
- 创建
<!-- 配置freemarker --> <bean id="freemarkerConfig" class="org.;> <property name="templateLoaderPath" value="/WEB-INF/ftl/" /> <property name="defaultEncoding" value="UTF-8" /> </bean>
@Controller public class HtmlGenerateAction { @Autowired private FreeMarkerConfigurer freeMarkerConfigurer; @RequestMapping("/genhtml") @ResponseBody public String genHtml()throws Exception { // 1、从spring容器中获得FreeMarkerConfigurer对象。 // 2、从FreeMarkerConfigurer对象中获得Configuration对象。 Configuration configuration = (); // 3、使用Configuration对象获得Template对象。 Template template = con(";); // 4、创建数据集 Map<String, Object> dataModel = new HashMap<String, Object>(); da("hello", "1000"); // 5、创建输出文件的Writer对象。 Writer out = new FileWriter(new File("D:/ftl;)); // 6、调用模板对象的process方法,生成文件。 (dataModel, out); // 7、关闭流。 out.close(); return "OK"; } }
/** * 监听商品添加消息,生成对应的静态页面 */ public class HtmlGenListener implements messageListener { @Autowired private ItemService itemService; @Autowired private FreeMarkerConfigurer freeMarkerConfigurer; @Override public void onMessage(Message message) { try { //创建一个模板,参考jsp //从消息中取商品id TextMessage textMessage = (TextMessage) message; String text = (); Long itemId = new Long(text); //等待事务提交 (1000); //根据商品id查询商品信息,商品基本信息和商品描述。 TbItem tbItem = i(itemId); Item item = new Item(tbItem); //取商品描述 TbItemDesc itemDesc = i(itemId); //创建一个数据集,把商品数据封装 Map<String, Object> data = new HashMap<String, Object>(); da("item", item); da("itemDesc", itemDesc); //加载模板对象 Configuration configuration = (); Template template = con("i;); //创建一个输出流,指定输出的目录及文件名。 Writer out = new FileWriter("D:/ftl/" + itemId + ".html"); //生成静态页面。 (data, out); //关闭流 out.close(); } catch (Exception e) { e.printStackTrace(); } } }
<!-- 配置消费者 --> <!-- 监听商品添加消息,生成静态页面--> <bean id="htmlGenListener" class="com.d;/> <bean class="org.;> <property name="connectionFactory" ref="connectionFactory" /> <property name="destination" ref="topicDestination" /> <property name="messageListener" ref="htmlGenListener" /> </bean>