freemarker学习

一、Freemarker引入

image-20230712201411737

二、环境搭建和测试

pom.xml

<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>FMDemo01</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>FMDemo01 Maven Webapp</name><url>http://maven.apache.org</url><dependencies><!--加入FreeMarker依赖坐标,FreeMarker模版引擎就是这里提供的(FreemarkerServlet)--><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version></dependency><!--加入servlet依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies><build><finalName>FMDemo01</finalName></build>
</project>

web.xml

<!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目录下查找对应的模版文件,我们会将模版文件放在webapp下--><param-value>/</param-value></init-param><init-param><!--默认编码格式:UTF-8--><param-name>default_encoding</param-name><param-value>UTF-8</param-value></init-param></servlet><servlet-mapping><servlet-name>freemarker</servlet-name><url-pattern>*.ftl</url-pattern></servlet-mapping></web-app>

freemarker

<#--freemarker注释,隐式注释,浏览器中看不到-->
<!-- html注释 -->
<h2>${msg}</h2>

controller

package com.itheima.controller;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;/*** Description:* date: 2023/7/12 20:51** @since JDK 11*/
@WebServlet("/fm01")
public class FMServlet01 extends HttpServlet {public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setAttribute("msg","hello world!");request.getRequestDispatcher("f01.ftl").forward(request,response);}
}

三、数据类型

1、布尔型

controller

package com.itheima.controller;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;/*** Description:* date: 2023/7/12 21:08** @since JDK 11*/
@WebServlet("/fm02")
public class FMServlet02 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setAttribute("bool",true);req.getRequestDispatcher("f02.ftl").forward(req,resp);}
}

f02.ftl

<#--是错误的,freemarker中不允许输出布尔类型的值,会报错
<h2>${bool}</h2>-->
<h1>布尔类型的转换</h1>
<#--方式一:?c-->
<h2>${bool?c}</h2>
<#--方式二:?string  弃用-->
<h2>${bool?string}</h2>
<#--${bool?string("bool为true时返回这个","bool为false时返回这个")-->
<h2>${bool?string("yes","false")}</h2>
<#--方式三:?then("true时返回这个","false时返回这个")-->
<h2>${bool?then("then_true","then_false")}</h2>

2、日期型

image-20230712212942749

controller

package com.itheima.controller;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.Date;/*** Description:* date: 2023/7/12 21:08** @since JDK 11*/
@WebServlet("/fm02")
public class FMServlet02 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//布尔类型req.setAttribute("bool",true);//日期类型req.setAttribute("date",new Date());req.getRequestDispatcher("f02.ftl").forward(req,resp);}
}

f02.ftl

<#--freemarker注释,隐式注释,浏览器中看不到-->
<!-- html注释 -->
<#--是错误的,freemarker中不允许输出布尔类型的值,会报错
<h2>${bool}</h2>-->
<h1>布尔类型的转换</h1>
<#--方式一:?c-->
<h2>${bool?c}</h2>
<#--方式二:?string  弃用-->
<h2>${bool?string}</h2>
<#--${bool?string("bool为true时返回这个","bool为false时返回这个")-->
<h2>${bool?string("yes","false")}</h2>
<#--方式三:?then("true时返回这个","false时返回这个")-->
<h2>${bool?then("then_true","then_false")}</h2>
<hr><br/><h1>日期类型</h1>
<#--在freemarker中,日期类型也不支持直接输出如果要输出,先转换成日期型或字符串-->
<h3>${date?date}</h3>
<h3>${date?time}</h3>
<h3>${date?datetime}</h3>
<h3>${date?string("yyyy-MM-dd,HH:mm:ss")}</h3>

3、数值类型

image-20230712214134331
package com.itheima.controller;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.Date;/*** Description:* date: 2023/7/12 21:08** @since JDK 11*/
@WebServlet("/fm02")
public class FMServlet02 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//布尔类型req.setAttribute("bool",true);//日期类型req.setAttribute("date",new Date());
//		数值类型req.setAttribute("age",18);req.setAttribute("salary",16800);req.setAttribute("double",0.5485);
//		请求转发到模版2req.getRequestDispatcher("f02.ftl").forward(req,resp);}
}
<#--freemarker注释,隐式注释,浏览器中看不到-->
<!-- html注释 -->
<#--是错误的,freemarker中不允许输出布尔类型的值,会报错
<h2>${bool}</h2>-->
<h1>布尔类型的转换</h1>
<#--方式一:?c-->
<h2>${bool?c}</h2>
<#--方式二:?string  弃用-->
<h2>${bool?string}</h2>
<#--${bool?string("bool为true时返回这个","bool为false时返回这个")-->
<h2>${bool?string("yes","false")}</h2>
<#--方式三:?then("true时返回这个","false时返回这个")-->
<h2>${bool?then("then_true","then_false")}</h2>
<hr><br/>
<h1>日期类型</h1>
<#--在freemarker中,日期类型也不支持直接输出如果要输出,先转换成日期型或字符串-->
<h3>${date?date}</h3>
<h3>${date?time}</h3>
<h3>${date?datetime}</h3>
<h3>${date?string("yyyy-MM-dd,HH:mm:ss")}</h3>
<hr><br/><h1>数值类型,可以直接表示</h1>
${age?c}<br>
${salary?string.currency}<br>
${double?string.percent},自动四舍五入<br>
${double?string["0.##"]},自动四舍五入<br>

4、字符串类型

image-20230712221101976
<h1>字符串类型的展示</h1>
<h4>${str1?substring(1,3)}截取字符串,左闭右开</h4>
<h4>${str1?uncap_first}首字符小写</h4>
<h4>${str1?cap_first}首字符大写</h4>
<h4>${str1?lower_case}全部小写</h4>
<h4>${str1?substring(1,3)}</h4>
<h4>${str1?upper_case}全部大写</h4>
package com.itheima.controller;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.Date;/*** Description:* date: 2023/7/12 21:08** @since JDK 11*/
@WebServlet("/fm02")
public class FMServlet02 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//布尔类型req.setAttribute("bool",true);//日期类型req.setAttribute("date",new Date());
//		数值类型req.setAttribute("age",18);req.setAttribute("salary",16800);req.setAttribute("double",0.5485);
//		字符串类型的展示req.setAttribute("str1","WWW.ee");
//		请求转发到模版2req.getRequestDispatcher("f02.ftl").forward(req,resp);}
}

5、字符串空值类型的处理

image-20230712221959451
package com.itheima.controller;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.Date;/*** Description:* date: 2023/7/12 21:08** @since JDK 11*/
@WebServlet("/fm02")
public class FMServlet02 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		空字符串的处理req.setAttribute("a",null);req.setAttribute("b","");
//		请求转发到模版2req.getRequestDispatcher("f02.ftl").forward(req,resp);}
}
<#--freemarker注释,隐式注释,浏览器中看不到-->
<!-- html注释 -->
<#--是错误的,freemarker中不允许输出布尔类型的值,会报错
<h2>${bool}</h2>-->
<h1>布尔类型的转换</h1>
<#--方式一:?c-->
<h2>${bool?c}</h2>
<#--方式二:?string  弃用-->
<h2>${bool?string}</h2>
<#--${bool?string("bool为true时返回这个","bool为false时返回这个")-->
<h2>${bool?string("yes","false")}</h2>
<#--方式三:?then("true时返回这个","false时返回这个")-->
<h2>${bool?then("then_true","then_false")}</h2>
<hr><br/>
<h1>日期类型</h1>
<#--在freemarker中,日期类型也不支持直接输出如果要输出,先转换成日期型或字符串-->
<h3>${date?date}</h3>
<h3>${date?time}</h3>
<h3>${date?datetime}</h3>
<h3>${date?string("yyyy-MM-dd,HH:mm:ss")}</h3>
<hr><br/><h1>数值类型,可以直接表示</h1>
${age?c}<br>
${salary?string.currency}<br>
${double?string.percent},自动四舍五入<br>
${double?string["0.##"]},自动四舍五入<br><hr><br/>
<h1>字符串类型的展示</h1>
<h4>${str1?substring(1,3)}截取字符串,左闭右开</h4>
<h4>${str1?uncap_first}首字符小写</h4>
<h4>${str1?cap_first}首字符大写</h4>
<h4>${str1?lower_case}全部小写</h4>
<h4>${str1?substring(1,3)}</h4>
<h4>${str1?upper_case}全部大写</h4><hr><br/>
<h1>空值情况的处理:</h1>
<h2>freemarker中对null和未定义的变量输出时都会报错,但是对空字符串不会报错</h2>
${a!}<br>
${b}<br>
${c!}<br>
${c???c}  ?c转为字符串类型

6、序列类型

package com.itheima.controller;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.Date;/*** Description:* date: 2023/7/12 21:08** @since JDK 11*/
@WebServlet("/fm02")
public class FMServlet02 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		存储数组在request作用域中String[] arr = new String[]{"alili","clili","blili","dlili"};req.setAttribute("arr",arr);
//		请求转发到模版2req.getRequestDispatcher("f02.ftl").forward(req,resp);}
}

存储集合

package com.itheima.controller;import com.itheima.pojo.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.Arrays;
import java.util.Date;
import java.util.List;/*** Description:* date: 2023/7/12 21:08** @since JDK 11*/
@WebServlet("/fm02")
public class FMServlet02 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		存储数组在request作用域中String[] arr = new String[]{"alili","clili","blili","dlili"};req.setAttribute("arr",arr);//		存储map在request作用域中User user1 = new User("xx1",18);User user2 = new User("xx2",20);User user3 = new User("xx3",22);List<User> list = Arrays.asList(user1,user2,user3);req.setAttribute("list",list);
//		请求转发到模版2req.getRequestDispatcher("f02.ftl").forward(req,resp);}
}
<hr><br>
<h1>序列类型</h1>
<#list arr as el>${el}----${el?index}<br>
</#list><hr>
获取数组的大小:${arr?size}<br/><hr>
获取数组的第一个元素:${arr?first}<br/><hr>
获取数组的最后一个元素:${arr?last}<br/><hr>使数组反转输出<br>
<#list arr?reverse as el>${el}----${el?index}<br>
</#list>
<hr>
使数组升序输出<br>
<#list arr?sort as el>${el}----${el?index}<br/>
</#list>
<hr>
使数组降序输出<br>
<#list arr?sort?reverse as el>${el}----${el?index}<br/>
</#list>
<hr><br><h1>存储集合</h1>
<#list list as el>${el.name} and ${el.age}<br>
</#list>
image-20230712230432753

7、***hash类型->map重点

package com.itheima.controller;import com.itheima.pojo.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.*;/*** Description:* date: 2023/7/12 21:08** @since JDK 11*/
@WebServlet("/fm02")
public class FMServlet02 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		存储map在request作用域中Map<String,String> city = new HashMap<String, String>();city.put("beijing","北京");city.put("shanghai","上海");city.put("jinan","济南");req.setAttribute("city",city);
//		请求转发到模版2req.getRequestDispatcher("f02.ftl").forward(req,resp);}
}
<hr><br/>
<h1>map</h1>
<h2>map循环</h2>
<#list city?keys as key>${key}----${city[key]}----${key_index}--<#--key_index返回索引坐标--><#--key_has_next 返回布尔值,判断是否还有下一个元素--><#if key_has_next>还有下一个---hello</#if><br>
</#list>
<hr>
<#list city?values as v>${v}<br/>
</#list><h2>可以直接对map进行value的输出</h2>
${city["beijing"]!"xx"}<br>
${city["jinan"]!"xx"}<br>
${city["1234"]!"xx"}<br>
image-20230712231300364

四、freemarker常见指令

1、定义变量

<#--定义变量-->
<#assign name="xxx" age=12 array=[1,"xxx"]>
${name} and ${age}<br>
${array[0]}<br>
${array[1]}<br>
<h2>对array进行拼接</h2>
${array?join("___")}
package com.itheima.controller;import com.itheima.pojo.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.*;/*** Description:* date: 2023/7/12 21:08** @since JDK 11*/
@WebServlet("/fm03")
public class FMServlet03 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//定义变量req.getRequestDispatcher("f03.ftl").forward(req,resp);}
}
image-20230712233012151

2、***ifelse

image-20230712233226410 image-20230712233319769 image-20230712233400660

3、list指令

image-20230712233641162

五、模版复用

后端

package com.itheima.controller;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.HashMap;
import java.util.Map;/*** Description:* date: 2023/7/12 21:08** @since JDK 11*/
@WebServlet("/index1")
public class FMServlet04 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Map<String,String> city = new HashMap<String, String>();city.put("0","北京");city.put("1","上海");city.put("2","济南");req.setAttribute("map",city);req.getRequestDispatcher("index.ftl").forward(req,resp);}
}

前端

1、共用select、option

index.ftl

<#import "optionmodel.ftl" as op>
<@op.optionfun map></@op.optionfun>

optionmodel.ftl

<#macro optionfun map><select><#list map?keys as key><option value="${key}">${map[key]}</option></#list></select></#macro>

image-20230714000245873

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/21344.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

函数和控制流

专栏简介&#xff1a;本专栏作为Rust语言的入门级的文章&#xff0c;目的是为了分享关于Rust语言的编程技巧和知识。对于Rust语言&#xff0c;虽然历史没有C、和python历史悠远&#xff0c;但是它的优点可以说是非常的多&#xff0c;既继承了C运行速度&#xff0c;还拥有了Java…

ELK日志记录——Kibana组件——grok 正则捕获插件、mutate数据修改插件、multiline 多行合并插件、date 时间处理插件

grok 正则捕获插件 grok 使用文本片段切分的方式来切分日志事件 内置正则表达式调用 %{SYNTAX:SEMANTIC} ●SYNTAX代表匹配值的类型&#xff0c;例如&#xff0c;0.11可以NUMBER类型所匹配&#xff0c;10.222.22.25可以使用IP匹配。 ●SEMANTIC表示存储该值的一个变量声明&…

【Java】一只小菜坤的编程题之旅【2】

文章目录 1丶丑数2、各位相加3丶搜索插入位置4丶第一个错误的版本 1丶丑数 因为丑数只能被2&#xff0c;3&#xff0c;5整除&#xff0c;所以让n依次去除2&#xff0c;3&#xff0c;5&#xff0c;如果最后是n为1&#xff0c;就说明是丑数。 class Solution {public boolean is…

C语言实现扫雷【经典】

前言   本篇文章要实现的是扫雷游戏&#xff0c;其代码实现与上一篇的三子棋游戏类同&#xff0c;都是在棋盘的基础上&#xff0c;与电脑进行对抗&#xff0c;不同的是&#xff0c;扫雷游戏一开始电脑就已经随机布置好了所有“雷”。 请戳 --->三子棋 扫雷游戏 1. 扫雷游…

Kafka入门,offset的默认维护位置(二十一)

offset的默认维护位置 0.9版本之前&#xff1a;consumer默认将offset保持在zookeeper中 从0.9版本开始&#xff0c;consumer默认将offset保存在kafka一个内置的topic中&#xff0c;该topic为__consumer_offsets __consumer_offsets 主题里面采用key和value方式存储数据&#x…

SQL 删除重复的电子邮箱

196 删除重复的电子邮箱 SQL架构 表: Person -------------------- | Column Name | Type | -------------------- | id | int | | email | varchar | -------------------- id是该表的主键列。 该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。 删除 所有重复的电…

Spring Boot 中的 SQL 注入攻击是什么,原理,如何预防

Spring Boot 中的 SQL 注入攻击是什么&#xff0c;原理&#xff0c;如何预防 随着互联网的发展&#xff0c;Web 应用程序的数量不断增加&#xff0c;而 SQL 注入攻击也成为了常见的网络安全问题之一。SQL 注入攻击是通过在 Web 应用程序中注入恶意的 SQL 代码&#xff0c;从而…

【Android知识笔记】系统进程(一)

Android 系统进程有哪些 先来一个整体结构图从宏观上理解Android系统的进程结构布局: 这里我们简单总结一下: 系统的第一个进程其实是0号进程(又叫swapper进程/Idle进程) 0号进程fork出了1号进程(init进程)和2号进程(kthreadd进程) 1号进程是所有普通用户进程的祖先,2号进程…

03-2_Qt 5.9 C++开发指南_Qt全局定义、容器类、容器类的迭代器、Qt类库的模块

本篇简要介绍Qt全局定义中的数据类型、函数、宏定义&#xff1b;容器类中&#xff1a;顺序容器类、关联容器类&#xff1b;容器类的迭代器&#xff1b;Qt类库的模块。 文章目录 1.Qt全局定义1.1 数据类型定义1.2 函数1.3 宏定义1.3.1 QT_VERSION1.3.2 QT_VERSION_CHECK1.3.3 Q…

ModaHub魔搭社区:AI原生云向量数据库MIlvus Cloud实现 HNSW

实现 HNSW HNSW 并不简单,因此我们只在此处进行最简单的实现。像之前一样,我们首先创建一组(128 维)向量的数据集: >>> import numpy as np >>> dataset = np.random.normal(size=(1000, 128)) 第一步是构建 HNSW 索引。为此,我们需要将每个向量添加…

理清ROS通信的一些细节

目标&#xff1a;掌握ros的python编程 基本教程&#xff1a;https://www.bilibili.com/video/BV1sU4y1z7mw/?spm_id_from333.788&vd_source32148098d54c83926572ec0bab6a3b1d terminator 快捷键需要自己去重新启用 ctrlshifte 横向分屏 ctrlshifto 纵向分屏 ctrlshiftw …

C基础day7(2023.7.7)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;二维数组地址 int main(int argc, const char *argv[]) {int arr[2][3]{11,22,33,44,55,66};for(int i0;i<2;i){for(int j0;j<3;j){printf("arr[%d][%d]%p\n",i,j,&arr[i][j]);}}…