zoukankan      html  css  js  c++  java
  • FreeMarker入门

    什么是 FreeMarker?

    FreeMarker 是一款模板引擎:即基于模板和数据源生成输出文本(html网页,配置文件,电子邮件,源代码)的通用工具。它是一个 java 类库,最初被设计用来在MVC模式的Web开发框架中生成HTML页面,它没有被绑定到Servlet或HTML或任意Web相关的东西上。也可以用于非Web应用环境中。

    模板编写使用FreeMarker Template Language(FTL)。使用方式类似JSP的EL表达式。模板中专注于如何展示数据,模板之外可以专注于要展示什么数据。

    为什么用 FreeMarker?

    1. FreeMarker 基于数据模型和模板来渲染,将业务逻辑和表现层分离。 JSP开发中,页面会有大量业务逻辑,不利于维护和阅读,使用FreeMarker可以避免这一问题。

    2. **有利于分工合作。**HTML设计师可以关注页面的设计无需面对页面的业务逻辑,同时修改页面代码也不需要程序员编重新译代码。

    3. **提高开发效率。**相对于JSP,FreeMarker不需要每次修改后重新编译,因此在开发调试中可以有效节省时间。

    4. **有利于提高访问速度。**对于不会频繁发生变化的页面,建议使用FreeMarker生成的静态页面。而不是每次都要动态生成的JSP页面。

    5. **可以提高并发量。**例如单台tomcat容器只支持几百并发,如果将静态页面放到性能更好的nginx服务器上,可以支持几万的并发。

    6. 静态页面对SEO更友好。

    7. **不占用JVM的PermGen space。**因为不会被编译成类,所以不会占用web服务器永生代的空间,避免OutOfMemoryError:PermGen space的问题。

    怎么用 FreeMarker?

    在java中使用

    	@Test
    	public void testFreeMarker() throws Exception {
    		// 把freemarker的jar包添加到工程中
    		//创建一个Configuration对象
    		Configuration configuration = new Configuration(Configuration.getVersion());
    		// 告诉config对象模板文件存放的路径。
    		configuration.setDirectoryForTemplateLoading(new File("ftl directory absolute path"));
    		// 设置config的默认字符集。一般是utf-8
    		configuration.setDefaultEncoding("utf-8");
    		//从config对象中获得模板对象。需要制定一个模板文件的名字。
    		Template template = configuration.getTemplate("test.ftl");
    		//创建模板需要的数据集。可以是一个map对象也可以是一个pojo,把模板需要的数据都放入数据集。
    		Map root = new HashMap<>();
    		root.put("hello", "hello freemarker");
    		//创建一个Writer对象,指定生成的文件保存的路径及文件名。
    		Writer out = new FileWriter(new File("out html file absolute path"));
    		//调用模板对象的process方法生成静态文件。需要两个参数数据集和writer对象。
    		template.process(root, out);
    		//关闭writer对象。
    		out.flush();
    		out.close();
    	}
    复制代码

    模板加载器

    当然也可以不指定绝对路径,使用模板加载器,FreeMarker提供了模板加载器可以直接从数据源加载模板。

    • ClassTemplateLoader:从classpath中加载模板。

    • FileTemplateLoader:在文件系统中从指定文件夹加载模板。

    • StringTemplateLoader:从一个字符串 Map 中加载模板。

    • URLTemplateLoader:从 URL 中加载模板。 你必须要实现 getURL 方法。

    • WebappTemplateLoader:从 servlet 上下文中加载模板。

    使用方式:

    Configuration configuration = new Configuration();
    configuration.setTemplateLoader(
    new WebappTemplateLoader(servletContext, "WEB-INF/content"));
    复制代码

    在项目中使用

    在项目中使用的话,可以直接托管给框架即可。

    添加依赖

    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-context-support</artifactId>
    	<version>4.1.3.RELEASE</version>
    </dependency>
    <dependency>
    	<groupId>org.freemarker</groupId>
    	<artifactId>freemarker</artifactId>
    	<version>2.3.23</version>
    </dependency>
    复制代码

    配置spring

    <bean id="freemarkerConfig"
    		class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    		<property name="templateLoaderPath" value="/WEB-INF/ftl/" />
    		<property name="defaultEncoding" value="UTF-8" />
    	</bean>
    复制代码

    然后使用时从FreeMarkerConfigurer拿到Configuration对象:

    Configuration configuration = freeMarkerConfigurer.getConfiguration();
    复制代码

    FreeMarker 基本语法

    简单类型

    使用类似EL表达式。

    ${hello}
    复制代码

    包装类型

    <html>
    <head>
    	<title>${title}</title>
    </head>
    <body>
    	<label>学号:</label>${student.id}<br>
    	<label>姓名:</label>${student.name}<br>
    </body>
    </html>
    复制代码

    遍历集合/数组

    <#list people as p>
    	${p.id}/${p.name}
    </#list>
    复制代码

    获取当前迭代索引

    <#list people as p
    	${p_index}
    </#list>
    复制代码

    添加判断条件

    <#if 条件>
    <#else>
    </#if>
    复制代码

    日期类型

    #默认格式
    1:date
    ${cur_time?date}
    2:datetime
    ${cur_time?datetime}
    3:time
    ${cur_time?time}
    
    #自定义格式
    ${cur_time?string("yyyy-MM-dd HH:mm:ss")}
    复制代码

    处理 null 值

    map.put("val",null)

    val值为:${val!}
    复制代码

    当val为空时,显示为空字符串,即

    val值为:
    复制代码

    也可以指定值为空时的默认值。

    ${val!"默认值"}
    复制代码

    也可以使用条件语句做非空判断。

    <#if curdate ??>
    	当前日期:${curdate?string("yyyy/MM/dd HH:mm:ss")}
    	<#else>
    	curdate属性为null
    	</#if>
    复制代码

    include

    可以引入其他模板片段。

    <#include "/include/head.ftl">
    复制代码

    json 支持

    ?eval可以将字符串转为json对象,然后在模板中当包装类型使用。

    <#assign user = userString?eval>
    User:${user.name}
    复制代码

    共享变量

    可以设置自动添加到所有模板的数据,这样就可以在所有模板中使用。

    configuration.setSharedVariable("share_value_key", "share_value");
    复制代码

    补充

    • 需要使用FreeMarker的页面在数据库更新时要及时更新,否则用户访问到的会是过期的页面。

    • FreeMarker数据模型的map的key只可以是String类型。

  • 相关阅读:
    Clob实践
    Read Clob字段 Function最终版
    asp.net mvc proflie 使用 区别 疑惑
    csdn中关于程序员的一封信
    【解惑】女生适合干计算机什么方面的工作
    网络女友跟现实女友的区别
    [转]俞敏洪老师郑州大学演讲
    【解惑】这么多技术我该怎么学
    google使用技巧
    杨澜给二十几岁女孩子的忠告
  • 原文地址:https://www.cnblogs.com/kkdn/p/9674433.html
Copyright © 2011-2022 走看看