FreeMarker--02---数据类型

Posted 高高for 循环

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FreeMarker--02---数据类型相关的知识,希望对你有一定的参考价值。


FreeMarker 数据类型

模板中的数据类型:

  • 布尔型:
    等价于 Java 的 Boolean 类型,不同的是不能直接输出,可转换为字符串输出
  • 日期型:
    等价于 java 的 Date 类型,不同的是不能直接输出,需要转换成字符串再输出
  • 数值型:
    等价于 java 中的 int,float,double 等数值类型
    有三种显示形式:数值型(默认)、货币型、百分比型
  • 字符型:
    等价于 java 中的字符串,有很多内置函数
  • sequence 类型:
    等价于 java 中的数组,list,set 等集合类型
  • hash 类型:
    等价于 java 中的 Map 类型

布尔类型

  1. 在Servlet中设置布尔类型的数据-----FreeMarker02.java
/**
 * FreeMarker 数据类型
 */
@WebServlet("/f02")
public class FreeMarker02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        /* 布尔类型 */
        req.setAttribute("flag",true);

        // 请求转发跳转到指定的模板页面   template/f02.ftl
        req.getRequestDispatcher("template/f02.ftl").forward(req,resp);
    }
}

  1. 获取数据—f02.ftl
<h4>FreeMarker 数据类型</h4>
<#--
    FreeMarker 数据类型
        布尔类型
            在freemarker页面中不能直接输出,如果要输出需要转换成字符串
            方式一: ?c
            方式二: ?string  ?string('为true时显示的内容','为false时显示的内容')
-->
<h5>布尔类型</h5>
${flag?c} <br>
${flag?string} <br>
${flag?string('yes','no')} <br>
${flag?string('喜欢','不喜欢')} <br>

<hr>

3.页面

日期类型

  1. 在Servlet中设置日期类型的数据
// 日期类型
request.setAttribute("createDate",new Date());

  1. 获取数据
<#--
数据类型:日期类型
在freemarker中日期类型不能直接输出;如果输出要先转成日期型或字符串
1. 年月日 ?date
2. 时分秒 ?time
3. 年月日时分秒 ?datetime
4. 指定格式 ?string("自定义格式")
y:年 M:月 d:日
H:时 m:分 s:秒
-->
<#-- 输出日期格式 -->
${createDate?date} <br>
<#-- 输出时间格式 -->
${createDate?time} <br>
<#-- 输出日期时间格式 -->
${createDate?datetime} <br>
<#-- 输出格式化日期格式 -->
${createDate?string("yyyy年MM月dd日 HH:mm:ss")} <br>

3.页面

数值类型

  1. 在Servlet设置数值型的数据
// 数值类型
request.setAttribute("age",18); // 数值型
request.setAttribute("salary",10000); // 数值型
request.setAttribute("avg",0.545); // 浮点型
  1. 获取数据
<#--
数据类型:数值类型
在freemarker中数值类型可以直接输出;
1. 转字符串
普通字符串 ?c
货币型字符串 ?string.currency
百分比型字符串 ?string.percent
2. 保留浮点型数值指定小数位(#表示一个小数位)
?string["0.##"]
-->
<#-- 直接输出数值型 -->
${age} <br>
${salary} <br>
<#-- 将数值转换成字符串输出 -->
${salary?c} <br>
<#-- 将数值转换成货币类型的字符串输出 -->
${salary?string.currency} <br>
<#-- 将数值转换成百分比类型的字符串输出 -->
${avg?string.percent} <br>
<#-- 将浮点型数值保留指定小数位输出 (##表示保留两位小数) -->
${avg?string["0.##"]} <br>

3.页面

字符串类型

  1. 在Servlet设置字符串类型的数据
/* 字符串类型 */
        req.setAttribute("msg","Hello");
        req.setAttribute("msg2","freemarker");
  1. 获取数据
<#--
     FreeMarker 数据类型
        字符串类型
            在freemarker中字符串类型可以直接输出;
            1. 截取字符串(左闭右开) ?substring(start,end)
            2. 首字母小写输出  ?uncap_first
            3. 首字母大写输出  ?cap_first
            4. 字母转小写输出  ?lower_case
            5. 字母转大写输出  ?upper_case
            6. 获取字符串长度  ?length
            7. 是否以指定字符开头(boolean类型) ?starts_with("xx")?string
            8. 是否以指定字符结尾(boolean类型) ?ends_with("xx")?string
            9. 获取指定字符的索引  ?index_of("xx")
            10. 去除字符串前后空格 ?trim
            11. 替换指定字符串  ?replace("xx","xx")
-->
<h5>字符串类型</h5>
${msg} -- ${msg2} <br>
${msg?string} -- ${msg2?string} <br>
<#-- 1. 截取字符串(左闭右开) ?substring(start,end) -->
${msg?substring(0,2)} <br>
<#-- 2. 首字母小写输出  ?uncap_first -->
${msg?uncap_first} <br>
<#-- 3. 首字母大写输出  ?cap_first -->
${msg2?cap_first} <br>
<#-- 4. 字母转小写输出  ?lower_case  -->
${msg?lower_case} <br>
<#-- 5. 字母转大写输出  ?upper_case -->
${msg2?upper_case} <br>
<#--6. 获取字符串长度  ?length-->
${msg?length} <br>
<#--7. 是否以指定字符开头(boolean类型) ?starts_with("xx")?string-->
${msg?starts_with("a")?string} <br>
<#--8. 是否以指定字符结尾(boolean类型) ?ends_with("xx")?string-->
${msg?ends_with("o")?string} <br>
<#--9. 获取指定字符的索引  ?index_of("xx")-->
${msg2?index_of("m")} <br>
<#--10. 去除字符串前后空格 ?trim-->
${msg2?trim}<br>
<#--11. 替换指定字符串  ?replace("xx","xx")-->
${msg?replace("He","We")}<br>
<hr>

字符串空值情况处理

FreeMarker 的变量必须赋值,否则就会抛出异常。而对于 FreeMarker 来说,null 值和不存在的变量是完全一样的,因为 FreeMarker 无法理解 null 值。
FreeMarker 提供两个运算符来避免空值:

  • ! :指定缺失变量的默认值 ${value!}:如果value值为空,则默认值是空字符串
    ${value!“默认值”}:如果value值为空,则默认值是字符串"默认值"
  • ?? :判断变量是否存在 如果变量存在,返回 true,否则返回 false ${(value??)?string}

<#-- 如果值不存在,直接输出会报错 -->
<#–${str}–>
<#-- 使用!,当值不存在时,默认显示空字符串 -->
${str!}

<#-- 使用!“xx”,当值不存在时,默认显示指定字符串 -->
${str!“这是一个默认值”}

<#-- 使用??,判断字符串是否为空;返回布尔类型。如果想要输出,需要将布尔类型转换成字符串 -->
${(str??)?string}

  1. 在Servlet设置字符串类型的数据
  // 空数据
        req.setAttribute("str1",null);
        req.setAttribute("str2","");
  1. 获取数据
<#--
    空值处理
        FreeMarker 提供两个运算符来避免空值:

		 !  :指定缺失变量的默认值

			${value!}:如果value值为空,则默认值是空字符串

			${value!"默认值"}:如果value值为空,则默认值是字符串"默认值"

		 ?? :判断变量是否存在

			如果变量存在,返回 true,否则返回 false

			${(value??)?string}
-->
<#-- 不存在的值,报错 -->
<#--${aa}-->
<#-- 值为null的数据 -->
<#--${str1} <br>-->
<#-- 值为空字符串的数据 -->
${str2} <br>
<#--  !  :指定缺失变量的默认值 -->
${str1!}  <br> <#--如果value值为空,则默认值是空字符串-->
${str1!"str1的数据不存在"}  <br> <#--如果value值为空,则默认值是字符串"默认值"-->
<#--  ?? :判断变量是否存在  -->
${(str1??)?c}
<hr>

3.页面

sequence 类型

序列类型 (数组、List、Set)

通过list指令输出序列

       <#list 序列名 as 元素名>
           ${元素名}
      </#list>
  1. 在Servlet中设置序列类型的数据
// 序列类型 (数组、List、Set)
// 数组操作
String[] stars = new String[]{"周杰伦","林俊杰","陈奕迅","五月天"};
request.setAttribute("stars",stars);
// List操作
List<String> citys = Arrays.asList("上海","北京","杭州","深圳");
request.setAttribute("cityList",citys);
// JavaBean集合
List<User> userList = new ArrayList<>();
userList.add(new User(1,"zhangsan",22));
userList.add(new User(2,"lisi",18));
userList.add(new User(3,"wangwu",20));
request.setAttribute("userList",userList);
  1. 获取数据
<#--
    FreeMarker 数据类型
        序列类型(数组、List、Set)
            通过list指令输出序列
            <#list 序列名 as 元素名>
                ${元素名}
            </#list>

            获取序列的长度        ${序列名?size}
            获取序列元素的下标     ${元素名?index}
            获取第一个元素        ${序列名?first}
            获取最后一个元素      ${序列名?last}

            倒序输出    	 序列名?reverse
            升序输出    	 序列名?sort
            降序输出    	 序列名?sort?reverse
            指定字段名排序    序列名?sort_by("字段名")
                注:一般是JavaBean集合,对应的字段名需要提供get方法

-->
<#-- 数组操作 -->
<#list stars as star>
  下标:${star?index} - 姓名:${star} <br>
</#list>
获取序列的长度:${stars?size} <br>
获取第一个元素:${stars?first} <br>
获取最后一个元素: ${stars?last} <br>
<hr>
<#-- List操作 -->
<#list cityList as city>
    ${city} -
</#list>
<br>
<#--倒序输出    	 序列名?reverse-->
<#list cityList?reverse as city>
    ${city} -
</#list>
<br>
<#--升序输出    	 序列名?sort-->
<#list cityList?sort as city>
    ${city} -
</#list>
<br>
<#--降序输出    	 序列名?sort?reverse-->
<#list cityList?sort?reverse as city>
    ${city} -
</#list>
<br>
<hr>
<#list userList as user >
    编号:${user.userId} &nbsp; 姓名:${user.uname} &nbsp; ${user.uage} <br>
</#list>
<br>
<#list userList?sort_by("uage") as user >
编号:${user.userId} &nbsp; 姓名:${user.uname} &nbsp; ${user.uage} <br>
</#list>
<br>
<hr>

3.页面

hash 类型

相当于java里面的Map操作

通过list指令输出序列

      获取map的key及key对应的value
           <#list hash?keys as key>
                ${key} - ${hash[key]}
            </#list>
            获取map的value
             <#list hash?values as value>
                ${value}
            </#list>
  1. 在Servlet中设置hash类型的数据
// Map操作
Map<String,String> cityMap = new HashMap<>();
cityMap.put("sh","上海");
cityMap.put("bj","北京");
cityMap.put("sz","深圳");
request.setAttribute("cityMap",cityMap);
  1. 获取数据
<#--
    FreeMarker 数据类型
        hash类型
            通过list指令输出
            获取map的key及key对应的value
            <#list hash?keys as key>
                ${key} - ${hash[key]}
            </#list>
            获取map的value
             <#list hash?values as value>
                ${value}
            </#list>
-->
<#-- key遍历输出 -->
<#list cityMap?keys as key>
    ${key} - ${cityMap[key]} <br>
</#list>
<br>
<#-- value遍历输出 -->
<#list cityMap?values as value>
    ${value} --
</#list>

3.页面

总的代码和页面效果

  • FreeMarker02.java
import com.xxxx.entity.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;

/**
 * FreeMarker 数据类型
 */
@WebServlet("/f02")
public class FreeMarker02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        /* 布尔类型 */
        req.setAttribute("flag",true);

        /* 日期类型 */
        req.setAttribute("createDate",new Date());

        /* 数值类型 */
        req.setAttribute("age",18);
        req.setAttribute("num",10000);
        req.setAttribute("avg",5.5467);

        /* 字符串类型 */
        req.setAttribute("msg","Hello");
        req.setAttribute("msg2","freemarker");

        // 空数据
        req.setAttribute("str1",null);
        req.setAttribute("str2","");

        /* 序列类型 (数组、List、Set) */
        // 数组
        String[] stars = new String[]{"周杰伦","林俊杰","五月天","陈奕迅"};
        req.setAttribute("stars",stars);
        // List操作
        List<String> citys = Arrays.asList("上海","北京","杭州","深圳");
        req.setAttribute("cityList",citys);
        // JavaBean集合
        List<User> userList = new ArrayList<>();
        userList.add(new User(1,"zhangsan",22));
        userList.add(new User(2,"lisi",18));
        userList对这个带有 & 不带 = 的代码片段返回类型感到非常困惑

对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段

视图或片段库为常见数据类型组成 UI

一个具有两种显示类型的片段[关闭]

(转) Java中的负数及基本类型的转型详解

从 Apollo 缓存中读取特定类型的所有片段