1. FreeMarker
-
概述
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 是一个Java类库。 特性: 1.通用目标 能够生成各种文本:HTML、XML、RTF、Java源代码等等。 易于嵌入到你的产品中:轻量级;不需要Servlet环境。 插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等。 你可以按你所需生成文本:保存到本地文件;作为Email 发送;从Web应用程序发送它返回给Web浏览器。 2.强大的模板语言 所有常用的指令:include、if/elseif/else、循环结构。 在模板中创建和改变变量。 几乎在任何地方都可以使用复杂表达式来指定值。 命名的宏,可以具有位置参数和嵌套内容。 名字空间有助于建立和维护可重用的宏库,或将大工程分成模块,而不必担心名字冲突。 输出转换块:在嵌套模板片段生成输出时,转换HTML转义、压缩、语法高亮等等;你可以定义自己的转换。 3.通用数据模型 FreeMarker不是直接反射到Java对象,Java对象通过插件式对象封装,以变量方式在模板中显示。 你可以使用抽象(接口)方式表示对象(JavaBean、XML文档、SQL查询结果集等等),告诉模板开发者使用方法,使其不受技术细节的打扰。 4.为Web准备 在模板语言中内建处理典型Web相关任务(如HTML转义)的结构。 能够集成到Model2 Web应用框架中作为JSP的替代。 支持JSP标记库。 为MVC模式设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员。 5.智能的国际化和本地化 字符集智能化(内部使用UNICODE)。 数字格式本地化敏感。 日期和时间格式本地化敏感。 非US字符集可以用作标识(如变量名)。 多种不同语言的相同模板。 6.强大的XML处理能力 <#recurse> 和 <#visit> 指令(2.3版本)用于递归遍历XML树。在模板中清楚和直接的访问XML对象模型。 开源论坛JForum就是使用了FreeMarker做为页面模板。 格式: ${express} 注释: <!--HTML注释,css,js--> <#--freemarker注释-->
-
配置坐标依赖和部署插件
pom.xml中添加: <!-- freemarker的坐标依赖 --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency> <!-- servlet-api的坐标依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> </dependency> <!--插件地址:Tomcat http://tomcat.apache.org/maven-plugin-2.2/ Jetty https://www.eclipse.org/jetty/documentation/current/jetty-maven- plugin.html --> <!-- 配置jetty插件 --> <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.2.1.v20140609</version> </plugin> web.xml变为: <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <!-- FreeMarker 的Servlet配置 --> <servlet> <servlet-name>freemarker</servlet-name> <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class> <init-param> <!-- 模板路径 --> <param-name>TemplatePath</param-name> <!-- 默认在webapp目录下查找对应的模板文件 --> <param-value>/template</param-value> </init-param> <init-param> <!-- 模板默认的编码:UTF-8 --> <param-name>default_encoding</param-name> <param-value>UTF-8</param-value> </init-param> </servlet> <!-- 处理所有以.ftl结尾的文件;ftl是freemarker默认的文件后缀 --> <servlet-mapping> <servlet-name>freemarker</servlet-name> <url-pattern>*.ftl</url-pattern> </servlet-mapping> </web-app>
-
数据类型
1.布尔型: 等价于Java的Boolean类型。 不同的是不能直接输出,可转换为字符串输出。 ?c ${bool?c} ?string ${bool?string} ?string("","") ${bool?string("数据值是true的时候显示","数据值是flase的时候显示")} ?then("","") ${bool?then("数据值是true的时候显示","数据值是flase的时候显示")} 2.日期型: 等价于java的Date类型。 不同的是不能直接输出,需要转换成字符串再输出。 ?date 年月日 ?date 时分秒 ?datetime 年月日时分秒 ?string("自定义格式")指定格式 y:年 M:月 d:日 H:时 m:分 s:秒 3.数值型: 等价于java 中的int,float,double等数值类型。 可以直接输出,有三种显示形式:数值型(默认)、货币型、百分比型。 1.转字符串 普通字符串 ?c 货币型字符串 ?string.currency 百分比型字符串 ?string.percent 2.保留浮点型数值指定小数位(#表示一个小数位) ?string["0.##"] 4.字符型: 等价于java中的字符串string。 可以直接输出,有很多内置函数。 ?substring(start,end) 截取字符串(左闭右开) ?uncap_first 首字母小写输出 ?cap_first 首字母大写输出 ?lower_case 字母转小写输出 ?upper_case 字母转大写输出 ?length 获取字符串长度 ?starts_with("xx")?string 是否以指定字符开头(boolean类型) ?ends_with("xx")?string 是否以指定字符结尾(boolean类型) ?index_of("xx") 获取指定字符的索引 ?trim 去除字符串前后空格 ?replace("xx","xx") 替换指定字符串 5.sequence类型: 等价于java中的数组,list,set 等集合类型。 通过list指令输出序列 <#list 序列名 as 元素名> ${名称} </#list> ${序列名?size} 获取序列的长度 ${元素名?index} 获取序列元素的下标 ${序列名?first} 获取第一个元素 ${序列名?last} 获取最后一个元素 序列名?reverse 倒序输出 序列名?sort 升序输出 序列名?sort?reverse 降序输出 序列名?sort_by("字段名") 指定字段名排序 注意:一般是JavaBean集合,对应的字段名需要提供get方法。 6.hash类型: 等价于java中的Map类型。 1.key遍历输出 <#list hash?keys as key> ${key} -- ${hash[key]} </#list> 2.value遍历输出 <#list hash?values as value> ${value} </#list>
-
常见指令
1.assign 自定义变量指令 可以创建一个新的变量, 或者替换一个已经存在的变量。 语法: <#assign 变量名=值> 或 <#assign 变量名=值 变量名=值> (定义多个变量) 2.if elseif else 逻辑判断指令 可以使用if ,elseif和else指令来条件判断是否满足某些条件。 格式: <#if condition> ... <#elseif condition2> ... <#elseif condition3> ... <#else> ... </#if> 注意: 1.condition, condition2等:将被计算成布尔值的表达式。 2.elseif和else指令是可选的。 3.list 遍历指令 可以使用list指令来对序列进行遍历。 格式1: <#list sequence as item> </#list> 格式2: <#list sequence as item> <#else> 当没有选项时,执行else指令 </#list> 注意: 1.else 部分是可选的 。 2.sequence:想要迭代的项,可以是序列或集合的表达式 。 3.item:循环变量的名称。 4.当没有迭代项时,才使用else指令, 可以输出一些特殊的内容而不只是空在那里。 4.macro 自定义指令宏 可以使用macro指令来自定义一些自定义指令。 格式1(无参数): <#macro 指令名> 指令内容 </#macro> 使用: <@指令名></@指令名> 格式2(有参数): <#macro 指令名 参数名1 参数名2> 指令内容 </#macro> 使用: <@指令名 参数名1=参数值1 参数名2=参数值2></@指令名> 注意: 1.指令可以被多次使用。 2.自定义指令中可以包含字符串,也可包含内置指令。 5.nested 占位指令 nested指令执行自定义指令开始和结束标签中间的模板片段。 嵌套的片段可以包含模板中任意合法的内容。 一般结合macro指令一起使用。 可以将自定义指令中的内容通过nested指令占位,当使用自定义指令时,会将占位内容显示。 6.import 导入指令 import 指令可以引入一个库。 也就是说,它创建一个新的命名空间,然后在那个命名空间中执行给定路径的模板。 可以使用引入的空间中的指令。 格式: <#import "文件名" as 自定义名称> 7.include 包含指令 可以使用include指令在你的模板中插入另外一个FreeMarker模板文件 。 被包含模板的输出格式是在include标签出现的位置插入的。 被包含的文件和包含它的模板共享变量,就像是被复制粘贴进去的一样。 格式: <#include "文件名">
-
页面静态化
通过freemarker.template.Configuration这个对象对模板进行加载的(它也处理创建和缓存预解析模板的工作), 然后我们通过getTemplate方法获得你想要的模板, 有一点要记住freemarker.template.Configuration在你整个应用必须保证唯一实例。
-
运算符
1.算术运算符 +、-、*、/、% 2.逻辑运算符 &&、||、! 3.比较运算符 > (gt) 大于号,推荐使用gt < (lt) 小于号,推荐使用lt >= (gte) 大于等于, 推荐是用gte <= (lte) 小于等于,推荐使用lte == 等于 != 不等于 4.空值运算符 ?? 判断是否为空,返回布尔类型 如果不为空返回 false, 如果为空返回 true,不能直接输出 ${(name??)?string} ! 设置默认值 如果为空,则设置默认值 1.设置默认为空字符串: ${name!} 2.设置指定默认值 ${name!'zhangsan'}