freemarker模板引擎,一篇文章看懂基本操作与进阶操作

2022-05-09 10:24:02 浏览数 (1)

目录

  • 1 前提
  • 2 freemarker 特性
  • 3 FreeMarker环境搭建
  • 4 简单demo测试创建
  • 5 数据类型
    • 5.1 布尔类型
    • 5.2 日期类型
    • 5.3 数值类型
    • 5.4 字符串类型
    • 5.5 字符串空值情况处理
    • 5.6 sequence 类型
    • 5.7 hash类型
  • 6 常见指令
    • 6.1 assign 自定义变量指令
    • 6.2 if elseif else 逻辑判断指令
    • 6.3 list遍历指令
    • 6.4 marco 自定义指令
    • 6.5 nested 占位指令
    • 6.6 import 导入指令
    • 6.7 include 包含指令
  • 7 运算符

1 前提

2 freemarker 特性

3 FreeMarker环境搭建

1 创建maven环境

pom 文件里面配置

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>FreeMarkerDemo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>FreeMarkerDemo Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
<!--    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>
  </dependencies>

  <build>
    <finalName>FreeMarkerDemo</finalName>

    <plugins>
      <!-- 配置Tomcat插件 ,用于启动项目 -->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <!--如果不设置,则默认为猫的自定义端口,项目路径为http://localhost:默认端口/项目名  -->
        <configuration>
          <!--如果端口号改为8081:那么访问的时候路径的端口就要写成8081,否则404  -->
          <port>8080</port>
          <!-- 如果设置为/,则项目了路径为http://localhost:端口号 /-->
          <!-- 如果设置为/123,则项目了路径为http://localhost:端口号/123 -->
          <path>/123</path>
        </configuration>
      </plugin>
    </plugins>

  </build>
</project>

我们要告诉我们的项目,哪些是freemarker的资源,所以需要配置

代码语言:javascript复制
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  
  <servlet>
    <servlet-name>freemarker</servlet-name>
    <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
    <init-param>
<!--      模板路径-->
      <param-name>TemplatePath</param-name>
<!--      默认在webapp 目录下查找对应的模板文件-->
      <param-value>/</param-value>
    </init-param>

    <init-param>
<!--      模板默认的编码-->
      <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>

4 简单demo测试创建

代码语言:javascript复制
@WebServlet("/f01")
public class FreeMarker01 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        给模板的数据
        req.setAttribute("msg","hello word");
//        请求转发到指定的页面,
        req.getRequestDispatcher("template/f01.ftl").forward(req,resp);

    }
}

启动项目,因为已经有插件,所以直接使用maven进行启动

5 数据类型

5.1 布尔类型

ftl文件里面,直接将Boolean类型的值进行展示,是会出错的,会有上面的提示;

5.2 日期类型

代码语言:javascript复制
    <h2>日期格式</h2>
        ${createTime?date} <br>
        ${createTime?time}  <br>
        ${createTime?datetime}  <br>
        ${createTime?string("yyyy/MM/dd HH:mm:ss")}

5.3 数值类型

代码语言:javascript复制
<h2>数值类型</h2>
${age} <br>
${num} <br>
${avg} <br>
<#--数字过长,会有逗号,可以这样去掉逗号-->
${num?c}<br>
<#-- 将数值转换成货币类型-->
${num?string.currency}<br>
<#--将数值转换为百分比的字符串-->
${avg?string.percent}<br>

5.4 字符串类型

代码语言:javascript复制
<h2>字符串类型</h2>
原数据--------转后数据<br>
字符串截取
${stringxx}---${stringxx?substring(0,2)}  <br>
首字母小写输出
${stringxx}---${stringxx?uncap_first}  <br>
首字母大写输出
${stringxx}---${stringxx?cap_first}  <br>
字母转小写输出
${stringxx}---${stringxx?lower_case}  <br>
字母转大写输出
${stringxx}---${stringxx?upper_case}  <br>
获取字符串长度
${stringxx}---${stringxx?length}  <br>
是否以指定的字母开头(Boolean类型)
${stringxx}---${stringxx?starts_with("str")?string}  <br>
是否以指定的字母结尾(Boolean类型)
${stringxx}---${stringxx?ends_with("str")?string}  <br>
获取指定字符的索引
${stringxx}---${stringxx?index_of("s")}  <br>
去除字符串前后空格
${stringxx}---${stringxx?trim}  <br>
替换指定字符串
${stringxx}---${stringxx?replace("s","ggg")}  <br>

5.5 字符串空值情况处理

5.6 sequence 类型

5.7 hash类型

代码语言:javascript复制
<h2>hashmap</h2>
<br>
key遍历输出:<br>
<#list hashmap?keys  as key>
<#-- starts 是list,star 是遍历出来的每一个元素   -->
    ${key} ------${hashmap[key]} <br>
</#list>
<br>
value遍历输出:<br>
<#list hashmap?values  as value>
<#-- starts 是list,star 是遍历出来的每一个元素   -->
    ${value}  <br>
</#list>
<br>

6 常见指令

6.1 assign 自定义变量指令

代码语言:javascript复制
<#--定义一个变量-->
<#assign str= "hello"  >
${str}<br>
<#--定义多个变量-->
<#assign str1="world" intx=1>
${str1}<br>
${intx}

6.2 if elseif else 逻辑判断指令

代码语言:javascript复制
<h3>简单判断</h3>
<#assign str1=10>
<#if str1 lt 60>
    <h6>你太菜了</h6>
    <#elseif str1 =60 >
    <h6>还好</h6>
    <#else>
</#if>

<h3>判断数据是否存在</h3>
<#assign  list = "">
<#if list??>
    数据存在
    <#else>
    数据不存在
</#if>

6.3 list遍历指令

代码语言:javascript复制
<h3>list 指令</h3>
<#assign userslist = ["lili","huhu","yueyue"]>
<#list userslist as user>
    ${user}
</#list>
<#list userslist as user>
    数据存在
    <#else>
    数组里面么有数据,走这个逻辑,避免空数据
</#list>

6.4 marco 自定义指令

自定义指令

代码语言:javascript复制
<h1>自定义指令(宏)</h1>
<br>
<#--定义一个宏,相当于定义一个变量,名称是address-->
<#macro address>
    我是定义的变量的值
</#macro>
<#--使用宏-->
<br>
<@address></@address>
定义一个有参数的宏
<br>
<#macro address11  name age>
    我的名字是:${name} ,年龄是:${age}
</#macro>
<br>
展示宏里面的东西:
<br>
<@address11 name="lili" age=5></@address11>

6.5 nested 占位指令

6.6 import 导入指令

6.7 include 包含指令

7 运算符

0 人点赞