FreeMarker使用总结

FreeMarker语法参考 FreeMarker的基本语法,从官方文档翻译的! 立即下载
FreeMarker使用总结
1.FreeMarker概述
  1)FreeMarker是一个模板引擎: 一个基于模板生成文本输出的通用工具,使用纯Java编写。
         模板+数据模型=输出
  2)FreeMarker被设计用来生成HTML Web页面,适合于作为Web应用程序的一个组件,特别适合于MVC应用程序的视图组件。
======================================================================================================================
2.数据模型 - Data Model
  1)典型的数据模型是树性结构,具有任意复杂和深度的层次
     (root)
       |
       +- test = "It is a test"
       |
       +- whatnot
       |     |
       |     +- because = "don't know"
       |
       +- animals
            |   
            +- (1st)
            |    |
            |    +- name = "elephant"
            |    |
            |    +- price = 5000
            |        
            +- (2st)
                 |
                 +- name = "cat"
                 |
                 +- price = 100  
  2)数据模型中变量的种类
     i) Scalars - 存储单一的值,类型可以为字符串/数值/日期时间/布尔型。
         Example. test、because、name、price都是Scalar
     ii) Hashes - 用于存储其余的变量(subvariables,子变量),类似于目录,包含保存下级变量的唯一查询名字。
         Example. (root)、whatnot都是Hashes,访问because的语法:${whatnot.because}
     iii) Sequences - 子变量顺序存放,子变量通过序号(从0开始)访问。
         Example. animals就是Sequences,访问子变量name的语法: ${animals[0].name}
======================================================================================================================
3. 模板 - Templates
        最简单的模板文件可以是一个简单的HTML文件(或者任意的文本文件),模板文件通常包含以下部分:
   1)Comments - 注释,包含在<#--和-->之间
   2)${...} - Inerpolations(插值),FreeMarker会在输出时使用实际值进行替代。
      Example1. test.ftl
        <html>
        <head>
          <title>${test}</title>
        </head>
        <body>
          <h1>The most popular animal</h1>
          <p>
             <#-- the first animal elephant is more popular-->  
             ${animals[0].name} - price:${animals[0].price}
          </p>          
        </body>
        </html>  
      插值的类型:通用Interpolation - ${expr}
                                    数字Interpolation - #{expr}或#{expr;format}
   3) FTL tags - FreeMarker Template Language tags,FTL标记,也称为指令
      i) FTL标记的语法:
                                  开始标记: <#directive_name parameters>
                                  结束标记: </#directive_name>
                                 空标记:      <#directive_name parameters/>
      ii) 指令的类型:预定义指令和用户定义指令(使用@替换#)
======================================================================================================================
4.Value值、Types类型、Expression表达式、操作符
  1)值的类型有:  
    Scalars:
        String
        Number
        Boolean
        Date
    Containers:
        Hash
        Sequence
        Collection
    Subroutines:
        Methods and functions
        User-defined directives
    Miscellaneous/seldom used:
        Node
  2)Expression:  
   (1) 字符串:使用单引号或双引号限定,包含特殊字符需转义。
                         有一类特殊的字符串称为raw字符串,被认为是纯文本,该类字符串在引号前面加r。Example. ${r"${foo}"}
             连接操作 - Example:${"Hello " + user + "!"}
             取子串-     Example:<#assign var1="dangdang2">
                             <a href="#">${var1[0..3]}</a>
    (2)数字:不需要引号,不支持科学计数法,不能省略小数点前面的0。
                                算术运算符有:+、-、×、/、%
                                使用内建的int获得整数部分
            Example:${1.1?int}    - 返回1
                    ${1.999?int}  - 返回1
                    ${-1.1?int}   - 返回-1
                    ${-1.999?int} - 返回-1
    (3)布尔值:true 和false
    (4)序列:由逗号分隔的子变量列表,由方括号限定。
             Example. ["spring","summer","autumn","winter"]
                 [2+2,[1,2,3,4],"whatnot"] - 列表项目是表达式
                 2..5 - 等同于[2,3,4,5],可以使用数字范围定义数字序列,注意数字范围没有方括号
                 5..2 - 可以定义反递增的数字范围
                                序列的连接操作:
                 <#list ["Joe", "Fred"] + ["Julia", "Kate"] as user>
                    - ${user}
                    </#list>
    (5)散列:由逗号分隔的键/值列表,由大括号限定,键和值之间用冒号分隔。
            Example. {"name":"dog","price":120}
                              散列的连接操作:和 字符串一样,使用+,如果具有相同的key,右边的值替代左边的值
           Example:<#assign ages = {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}>
                    - Joe is ${ages.Joe}
                    - Fred is ${ages.Fred}
                    - Julia is ${ages.Julia}
  -------------------------------------------------------------------------------
  3)获取变量
    (1)顶层变量:${variable}
    (2) 从散列中获取数据:${whatnot.because}或者${whatnot["because"]}
    (3) 从序列获取数据:${animals[0].name}
    (4) 获取序列片段:使用[startIndex..endIndex]语法
    (5) 特殊变量:FreeMarker内定义的变量,使用.variable_name语法访问。
======================================================================================================================
5.Interpolation(插值)的使用
      通用Interpolation
    1)插入字符串值:直接输出表达式结果
    2)插入数字值:根据缺省值(由#setting指令设置)将表达式结果转换为文本输出。
      Example:
         <#setting number_format="currency"/>
         <#assign answer=42>
          ${answer}  - 输出$42.00          
          ${answer?string}  - 输出$42.00
          ${answer?string.number}  - 输出42
          ${answer?string.currency}  - 输出$42.00
          ${answer?string.percent}  - 输出4,200%
    3)插入日期值:
      Example:${lastUpdated?string("yyyy-MM-dd HH:mm:ss")
    4)插入布尔值:
      Example:<#assign foo=true>
               ${foo?string("yes","no")}
   -------------------------------------------------------------------------
   数字Interpolation - #{expr;format}
    format的格式:mX 小数部分最小X位,MX 小数部分最大X位
    Example:<#assign x=2.582/>
            <#assign y=4/>
            #{x; M2} <#-- 2.58 -->
            #{y; M2} <#-- 4 -->
            #{x; m1} <#-- 2.6 -->
            #{y; m1} <#-- 4.0 -->
            #{x; m1M2} <#-- 2.58 -->
            #{y; m1M2} <#-- 4.0 -->
======================================================================================================================
6. 常用指令
  1)if,else,elseif
       语法:<#if condition>
          ...
        <#elseif condition2>
          ...
        <#elseif condition3>
          ...
        ...
        <#else>
          ...    
        </#if>
   2)switch, case, default, break
       语法:<#switch value>
          <#case refValue1>
            ...
            <#break>
          <#case refValue2>
            ...
            <#break>
          ...
          <#case refValueN>
            ...
            <#break>
          <#default>
            ...
       </#switch>    
   3)list
       语法: <#list sequence as item>
          ...
        </#list>      
   List指令中的隐含变量:
     item_index:当前迭代项的位置,从0开始。
     item_has_next:用于判断当前迭代项是否有下一项。   
     -------------------------------------------------------------------------------------             
        Example1:
            <#-- 在循环中使用隐含变量 -->
            <#assign seq = ["winter", "spring", "summer", "autumn"]>
            <#list seq as x>
             ${x_index + 1}. ${x}<#if x_has_next>,</#if>
            </#list>
        Example2:
            <#-- 固定次数的循环-->
            <#assign x=3>
            <#list 1..x as i>
              ${i}
            </#list>
        Example3:
             <#-- 散列的循环 -->
            <#assign items={"k1":"one","k2":"two"}>
            <select>
            <#list items?keys as itemKey>
              <option value="${itemKey}">${items[itemKey]}</option>
            </#list>
            </select>
    --------------------------------------------------------------------------------------
   4)include:用于包含其他的模板文件
       语法:<#include path> or <#include path options>
           path: The path of the file to include; an expression that evaluates to a string. (With other words, it doesn't have to be a fixed string, it can also be something like, for example, profile.baseDir + "/menu.ftl".)
           options: One or more of these: encoding=encoding, parse=parse
                  encoding: Expression evaluates to string
                  parse: Expression evaluates to boolean (also accepts a few string values for backward compatibility)
         example1:
                <#-- struts2中主题xhtml下的select.ftl文件 -->
                <#include "/${parameters.templateDir}/${parameters.theme}/controlheader.ftl" />
                <#include "/${parameters.templateDir}/simple/select.ftl" />
                <#include "/${parameters.templateDir}/xhtml/controlfooter.ftl" />
  5) assign:用于定义变量或者替换存在的变量
     语法:<#assign name=value>
        or
        <#assign name1=value1 name2=value2 ... nameN=valueN>
        or
        <#assign same as above... in namespacehash>
        or
        <#assign name>
          capture this
        </#assign>
        or
        <#assign name in namespacehash>
          capture this
        </#assign>
        name: name of the variable. It is not expression. However, it can be written as a string literal, which is useful if the variable name contains reserved characters, for example <#assign "foo-bar" = 1>. Note that this string literal does not expand interpolations (as "${foo}").
        value: the value to store. Expression.
        namespacehash: a hash that was created for a namespace (by import). Expression.
   6)import: 导入一个库到模板中,FreeMarker为导入库创建新的命名空间
       语法:<#import path as hash>
        path: The path of a template. This is an expression that evaluates to a string.
        (With other words, it doesn't have to be a fixed string, it can also be something like, for example, profile.baseDir + "/menu.ftl".)
        hash: The unquoted name of hash variable by which you can access the namespace. Not an expression.
   Example1:
        <#--使用命名空间-->
        <#import "/template/simple/test.ftl" as my>
        <#assign var1="dangdang2" in my>
        <a href="${my.url}">${my.var1}</a>
========================================================================
7.内置函数 - 参阅FreeMarker Manual
8.杂项
  1)宏 - 宏是和某个变量关联的模板片段,以便在模板中通过用户定义指令使用该变量。
  Example1:<#macro greet>
               <font size="2">Hello world!</font>
            </#macro>
            <#--使用宏-->
            <@greet></@greet>
   -----------------------------------------------------------------------------------------
   (1)  嵌套内容 - 用户定义指令可以有嵌套内容,使用<#nested>指令执行指令开始和结束标记之间的模板片段
    Example2:<#macro border>
              <table border=1>
                 <tr><td><#nested></td></tr>
              </table>
           </#macro>
           <!--使用宏-->
           <@border>The bordered text</@border>
    -------------------------------------------------------------------------
   (2)在宏定义中使用循环变量:
                 用户定义指令可以有循环变量,通常用于重复嵌套内容,基本用法是:作为nested指令的
                  参数传递循环变量的实际值,而在调用用户定义指令时,在<@…>开始标记的参数后面指定
                 循环变量的名字
       Example3:
         <#macro repeat count>
            <#list 1..count as x>
            <#nested x, x/2, x==count>
            </#list>
         </#macro>
         <@repeat count=4 ; c, halfc, last>
             ${c}. ${halfc}<#if last> Last!</#if>
         </@repeat>
         输出结果:
            1. 0.5
            2. 1
            3. 1.5
            4. 2 Last!
    -------------------------------------------------------------------------
  2)在模板中定义变量
    (1)plain变量:使用assign指令创建和替换,可以在模板任何地方访问,包括使用include指令插入的模板。
    (2)局部变量:使用local指定创建和替换,只在宏定义体中有效。
    (3)循环变量:只能存在于指令的嵌套内容中,由指令(如list)自动创建。
  3)名字空间
          通常情况下,只使用一个名字空间,称为主名字空间。
         为了创建可重用的宏或其他变量的集合(通常称为库),必须使用多名字空间,以防止命名冲突。
        使用名字空间的步骤:
     Step1.创建库
       Example:《#-- 保存在模板文件inc.ftl-->
                <#macro copyright date>
                  <p>Copyright (C) ${date} Bill Smith. All rights reserved.
                  <br>Email: ${mail}</p>
                </#macro>
                <#assign mail = "billsmith@xxx.com">  
     Step2.使用import指令将库导入到模板中
          <#import "/lib/inc.ftl" as my>
          <#assign mail="fred@xxx.com> <#--定义同名变量,并没有冲突-->
          <@my.copyright date="2010-2011"/>
          ${my.mail}
          ${mail}
======================================================================================================================
9.FreeMarker综合案例 - 分页标签模板文件
<#-- 分页标签模板文件pager.ftl-->
<div class="paginating">
     <div class="pageform">
      <form name="formPager" action="${parameters.url}" method="post">
       <a href="javascript:document.formPager.submit();">确定</a>
       <span>页</span>
       <input name="pageno" type="text" value="1"/>
       <span>共${parameters.pageCount}页 转到</span>
      </form>
     </div>
     <div class="pagepanel">
        <#-- 下一页 -->
        <#if parameters.pageno==parameters.pageCount>
          <a class="pagebtn disabled" href="#"><span>下一页</span></a>        
        <#else>
          <a href="${parameters.url}?pageno=${parameters.pageno+1}" class="pagebtn"><span>下一页</span></a>
        </#if>   
        <#-- 页码 -->     
        <#list parameters.pageCount..1 as x>
           <#assign url=parameters.url+'?pageno='+x/>
           <#if parameters.pageno==x>
              <a href="#" class="pagenum current"><span>${x}</span></a>
           <#else>
             <a href="${url}" class="pagenum"><span>${x}</span></a>
           </#if>
        </#list>      
        <#-- 上一页 -->
        <#if parameters.pageno==1>
          <a class="pagebtn disabled" href="#"><span>上一页</span></a>
        <#else>
          <a href="${parameters.url}?pageno=${parameters.pageno-1}" class="pagebtn"><span>上一页</span></a>
        </#if>  
     </div>
 </div>
======================================================================================================================
(END)
 
            
     

        

   
 
   
                         
                         
                         
                         
                         
                         
                         
                         
                         
                                              
    
               
    

 
        
        
        
        
        
        
         
         
         
         
         
         
         
         
         
        

Sublime的freemarker插件 Sublime的freemarker插件,放入Sublime的 \Data\Packages目录下重启可用 也可以到这里下载: https://github.com/briancavalier/textmate-freemarker-bundle 立即下载

相关推荐

freemarker_常用内置函数

NULL 博文链接:https://zhangyulong.iteye.com/blog/1162387

关于Freemarker模板报错的问题

模板引擎用的是Freemarkker,最近在html页面使用格式化样式时,发现会提示#include标签无效的信息。整个页面显示不出来。 后来发现是因为格式化的div中包含标签。因为#include是freemarker的标签,eclipse只能识别html标签,就会提示无效标签的警告,不影响实际使用。因此放弃格式化包含此标签的div即可。

Anthony_1223的博客 2980

三极管NPN与PNP的工作原理及快速识别技巧

本文深入浅出地解析了三极管NPN与PNP的核心工作原理。通过“水龙头”比喻,阐明其以小电流控制大电流的放大与开关本质。文章重点对比了NPN与PNP在电流方向、电位关系和控制逻辑上的根本区别,并提供了快速识别技巧与实用的选型、应用指南,帮助电子爱好者与工程师快速掌握这两种基础元件的关键知识。

neovim7hacker的博客 454

Freemarker总结

 FreeMarker是一个用Java编写的模板引擎,主要用来生成HTML Web页面,特别是基于MVC模式的应用程序。虽然FreeMarker具有一些编程的能力,但不像PHP,通常由Java程序准备要显示的数据,由FreeMarker模板生成页面。 FreeMarker可以作为Web应用框架一个组件,但它与容器无关,在非Web应用程序环境也能工作的很好。 FreeMarker适合作为MVC的视图

ykdsg的专栏 9236

STM32CubeMX Nucleo F767ZI 教程(1)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 官网上买了个NUCLEO F767ZI 的开发板,144引脚的芯片,https://www.st.com/content/st_com/zh/products/evaluation-tools/prod

fafuwxm 2029

vue3接入大华摄像头

┃ ┃ ┣ 📜PlaybackModal.vue 回放列表模态框。┃ ┃ ┗ 📜VideoGrid.vue 视频播放区域。┃ ┃ ┣ 📜ControlPanel.vue 控制面板。┃ ┃ ┣ 📜DeviceList.vue 设备列表。┃ ┣ 📂module //大华摄像头文件。

💻 专注 Vue 前端与 Java 后端技术 🌱 目前正在深入 Spring Boot、微服务与性能优化 📝 定期分享实战踩坑经验与学习笔记 🤝 欢迎交流,共同进步 915

SpringBoot 整合视图层技术

SpringBoot整合视图层技术 SpringBoot 整合jsp SpringBoot 整合freemarker SpringBoot 整合Thymeleaf 一 SpringBoot 整合jsp技术 1.修改pom文件添加坐标 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3...

sjy_6的博客 1176

Apifox CLI + Claude Skills:将接口自动化测试融入ai

基于 Apifox CLI、Claude Code以及Claude Skills组合,实现自然语言触发接口自动化测试。

wwz_0012的博客 598

FreeMarker常见错误

FreeMarker、指令、标签、break、List

kakakai110的专栏 1846

linux离线安装nginx

linux离线安装nginx

zhang_130914036的博客 9347

QuickFix Java 讲解(五)消息的收发与查看

本系列力求手把手教你怎样利用QuickFix Java 搭建自己的 FIX 协议收发平台,以及其中的注意事项。 所有源码的地址(免费): https://github.com/zongzhec/QuickFixPractise 这节我们讨论将Acceptor和Initiator启动以后,收到的消息极其查看方式。 6. 收发双方的通信 6.1. 启动后的通信和登录 为方便起见,这里我们使用统一的源码:https://github.com/zongzhec/QuickFixPractise ..

2246

freemarker --- 基本使用

freemarker基本使用

Andy的java博客 2169

复现论文《大规模风电场电磁暂态高效建模仿真方法》

本文提出了一种针对大规模风电场电磁暂态(EMT)仿真的高效建模方法。通过三种关键技术实现仿真加速:(1)永磁直驱风电机组一体化等效建模,采用节点导纳矩阵降维将25节点机组简化为4端子电路,仿真速度提升1-3个数量级;(2)基于戴维南/诺顿等效和OpenMP并行计算的风电场整体建模,通过串并联叠加实现节点收缩,30台机组仿真加速近万倍;(3)受控源映射解耦方法提高故障仿真灵活性。复现代码展示了核心算法实现,包括导纳矩阵Schur补降维、多进程并行计算框架以及受控源解耦方法。

huanghm88的专栏 279

Freemarker的使用

和缓存的差别 共同点:都可以减小数据库的访问压力。 区别: (1)缓存技术适用于小规模的数据。以及一些经常变动的数据。 (2)网页静态化技术适用于大规模但是变化不太频繁的数据。 Freemarker指令: assign指令用于在页面上定义一个变量 (1)定义简单类型 <#assign linkman="周先生"> 联系人:${linkman} (2)定义对象类型 <#assign info={"mobile":"13812345678",'address...

m0_64702880的博客 3341

29、集成电路测试技术解析

本文深入解析了集成电路测试技术,涵盖定制电路测试资源与策略、混合模拟/数字电路测试方法、数字测试模式生成难点与解决方案,以及可控性和可观测性的核心概念。同时详细讨论了固定故障、桥接故障和开路故障等主要故障模型及其检测方法。在测试技术的综合应用与优化方面,提出了合理配置测试资源、优化测试模式和设计测试流程的策略。最后展望了测试技术的发展趋势,包括集成化测试、自动化测试和智能化测试。通过全面掌握这些测试技术,可以有效提高集成电路的质量和可靠性,推动集成电路产业的发展。

work3的博客 205

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Freemarker使用详解

1.什么是网页静态化技术 随着用户访问量以及数据量的增大,网页静态化技术方案如今越来越流行。 什么是网页静态化技术呢?简单来说就是将网页以纯静态方式的形式展现。 2.网页静态化技术与缓存技术的比较 共同点:都可以减小数据库的访问压力。 区别: (1)缓存技术适用于小规模的数据。以及一些经常变动的数据。 (2)网页静态化技术适用于大规模但是变化不太频繁的数据。 页面静态化与缓存技术的定义: 页面静态化是指通过一些模板技术(如freemarker)将数据模型生成静态html页面并通过..

qq_45441466的博客 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

freemarker介绍及使用

FreeMarker快速入门 1. FreeMarker介绍 1.1 什么是FreeMarker Apache FreeMarker是一款开源的模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。它不是面向最终用户的,而是一个java类库,是一款程序员可以嵌入他们所开发产品的组件。 模板使用FreeMarker Template Language(FTL)模板语言编写,这是一种简单的专用语言。模板用于展示数据,数据模型用于呈现什么数据。 模板

懵齐的博客 1808

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Spring Boot中使用FreeMarker及FreeMarker入门

文章目录一、FreeMarker简介二、Spring Boot整合FreeMarker1.添加依赖2.相关配置3.FreeMarker文件模板三、使用示例四、FreeMarker常用指令 一、FreeMarker简介 Freemarker 模版后缀为 .ftl(FreeMarker Template Language)。FTL 是一种简单的、专用的语言,它不是像 Java 那样成熟的编程语言。在模...

huangjhai的博客 4043

FreeMarker template使用

赋值:<#assign val = 10> 输出:${val} 算数运算: <#-- 支持"+"、"-"、"*"、"/"、"%"运算符 --> <#assign number1 = 10> <#assign number2 = 5> "+" : ${number1 + number2} "-" : ${number1 - number2} "*" : ${number1 * number2} "/".

weixin_38320510的博客 6571

【Freemarker】Freemarker简介以及基本使用

【Freemarker】Freemarker简介以及基本使用1. 什么是Freemarker?2. Freemarker 快速入门2.1 环境搭建2.2 创建模板文件2.3 生成文件3. Freemarker 基本指令3.1 assign 指令3.2 if 指令3.3 list 指令3.4 include 指令4. 联合使用指令5. 常用内建函数6. 处理不存在的变量 1. 什么是Freemarker? FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网

来日浅谈的博客 3159

FreeMarker使用

FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。是一个Java类库。模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言,不是像PHP那样成熟的编程语言。那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。

2301_76608606的博客 1052

freemarker的使用

之前写过一篇freemarker的模板语法,今天这篇博客是专门记录freemarker如何使用的 freemarker模板语法 点击跳转 首先,导入freemarker的jar包 org.freemarker freemarker 2.3.23 Java代码步骤: 第一步:创建一个Configuration对象,直接new

东天里的冬天 1467

freemarker的使用心得,freemarker使用心得

freemarker目前虽然使用的公司不多,但是在某些时候就必须使用,当需要遍历json数据的时候,目前市面上的好多显示组件都达不到要求唯一能用的也就只有freemarker了。在java里使用的模板引擎有velocity、freemarker,至于velocity由于比较古老加之功能也不及freemarker那么强大使用的人群已经很少了。这次打算系统性的分享我学习freemarker的心得。

LANGZI7758521的专栏 3283

FreeMarker基础使用

一、装配使用 1、导入依赖 <!--SpringBootFreemarker模板依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> 2、在properties里进行配置 ##Freemarker配置 #

qq_57404736的博客 1637

springboot如何使用Freemarker模版引擎

1.Freemarker介绍 Freemarker是三大主流模版引擎之一,与Jsp,Velocity并称“三剑客“。 2.Freemarker集成方案 ①在pom.xml中添加依赖 <!-- freemarker 依赖 --> <dependency> <groupId>org.springframework.boot</groupI...

蔡定努 725
上一篇: MySQL的基本使用
小李飞刀
博客等级 码龄24年 16粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值