freemarker学习笔记

http://freemarker.org/docs/dgui_quickstart_basics.html
freemarker语法:
#assign 定义变量;
例:
<#assign text ="创为">
# text?eval 把变量String类型text变成json类型;
例:
<#assign json=text?eval />
#list json.list as item 相当于foreach循环,循环 json.list 的数据,每个数据为item
例:
<#list json.list as item>



  • ${item.title}


  • if else用法:
    <#if item.img_url ??>

    <#else>

    ??相当于item.img_url !=null另外如下(用大于小于最好用 gt,lt)
    ??是判断对象是否为空,例如:<#if object??>object对象不为空(即object存在)
    ?后面要加关键字,例如:<#if object?exists>object对象不为空
    <#if str??>${str?string}<#--将str以字符串形式显示-->

    1. =(或者==):判断两个值是否相等;
    2. !=:判断两个值是否不相等;
    注: =和!=可以用作字符串、数值和日期的比较,但两边的数据类型必须相同。而且FreeMarker的比较是精确比较,不会忽略大小写及空格。
    3. >(或者gt):大于
    4. >=(或者gte):大于等于
    5. <(或者lt):小于
    6. <=(或者lte):小于等于
    7. &&: 逻辑与;
    8. ||:逻辑或;
    9. !:逻辑非
    

    其他的不会就百度
    获得数据的方法:
    1.getDataMethod()获得文章列表
    参数数量不同,查询方法分别如下:
    参数数量为一:getDataMethod(文章的id)
    参数数量为三:getDataMethod(文章的频道id,从第几条开始查询,查询多少条)
    2.getChannelMethod()获得频道列表
    3. getColumnMethod(频道id)获得栏目列表
    4. getLinkMethod()
    参数数量不同,查询方法分别如下:
    参数数量为一:getDataMethod(友情链接id)
    参数数量为二:getDataMethod(从第几条开始查询,查询多少条)

    所有的方法返回值都是string类型数据,读取数据方式相同如下:
    <#assign slide ="${getDataMethod(36,87,0,3)}">
    <#assign slidej=slide?eval />
    <#list slidej.list as item>
    <#if item_index == 0>


  • <#else>



  • 列表页面自动生成时会返回
    page 当前页数,cnid 频道id,start 从哪条开始,size每页显示条数,total数据总数,pages总页数,pname页面名称,cmid 栏目id 可以直接在列表模板中使用如:
    <#assign news ="${getDataMethod(cnid,start,size)}">
    详细页生成时返回
    article 当前文章id
    prev 上一条文章id
    next 下一条文章id
    首页
    page 当前页数,cnid 频道id,start 从哪条开始,size每页显示条数,total数据总数,pages总页数,pname页面名称
    栏目页
    page 当前页数,cnid 频道id,start 从哪条开始,size每页显示条数,total数据总数,pages总页数,pname页面名称,cmid 栏目id

    生成页面的命名规律:
    主页:是用户自定义的;
    列表页:是用户自定义的名字的基础上 加上_page再加上页数如:list_page3.html即列表页面的第三页;(第一页不加后缀为list.html);
    栏目页:是用户自定义的名字的基础上 加上_cm加上栏目id加上_page再加上页数如clum_cm_page_5; 第一页不加后缀为list.html);
    详细页:是用户自定义的名字的基础上 加上_id加上文章id如detail_id15;

    参考cms项目/gecms/WebRoot/templates/cwcms/的模板

    FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成:
    1,文本:直接输出的部分
    2,注释:<#-- ... -->格式部分,不会输出
    3,插值:即${...}#{...}格式的部分,将使用数据模型中的部分替代输出
    4,FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出

    下面是一个FreeMarker模板的例子,包含了以上所说的4个部分




    Welcome!





    <#-- 注释部分 -->

    <#-- 下面使用插值 -->

    Welcome ${user} !



    We have these animals:



    <#-- 使用FTL指令 -->
    <#list animals as being>

  • ${being.name} for ${being.price} Euros

    <#list>





    1, FTL指令规则

    在FreeMarker中,使用FTL标签来使用指令,FreeMarker有3种FTL标签,这和HTML标签是完全类似的.
    1,开始标签:<#directivename parameter>
    2,结束标签:
    3,空标签:<#directivename parameter/>

    实际上,使用标签时前面的符号#也可能变成@,如果该指令是一个用户指令而不是系统内建指令时,应将#符号改成@符号.
    使用FTL标签时, 应该有正确的嵌套,而不是交叉使用,这和XML标签的用法完全一样.如果全用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息.FreeMarker会忽略FTL标签中的空白字符.值得注意的是< , /> 和指令之间不允许有空白字符.

    2, 插值规则

    FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}#{expr;format}

    2.1 通用插值

    对于通用插值,又可以分为以下4种情况:
    1,插值结果为字符串值:直接输出表达式结果
    2,插值结果为数字值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:
    <#settion number_format="currency"/>
    <#assign answer=42/>
    ${answer}
    ${answer?string} <#-- the same as ${answer} -->
    ${answer?string.number}
    ${answer?string.currency}
    ${answer?string.percent}
    ${answer}
    输出结果是:
    $42.00
    $42.00
    42
    $42.00
    4,200%
    3,插值结果为日期值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:
    ${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}
    ${lastUpdated?string("EEE, MMM d, ''yy")}
    ${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")}
    输出结果是:
    2008-04-08 08:08:08 Pacific Daylight Time
    Tue, Apr 8, ‘03
    Tuesday, April 08, 2003, 08:08:08 PM (PDT)
    4,插值结果为布尔值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:
    <#assign foo=true/>
    ${foo?string("yes", "no")}
    输出结果是:
    yes

    2.2 数字格式化插值

    数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是:
    mX:小数部分最小X位
    MX:小数部分最大X位
    如下面的例子:
    <#assign x=2.582/>
    <#assign y=4/>
    #{x; M2} <#-- 输出2.58 -->
    #{y; M2} <#-- 输出4 -->
    #{x; m2} <#-- 输出2.6 -->
    #{y; m2} <#-- 输出4.0 -->
    #{x; m1M2} <#-- 输出2.58 -->
    #{x; m1M2} <#-- 输出4.0 -->

    3, 表达式

    表达式是FreeMarker模板的核心功能,表达式放置在插值语法${}之中时,表明需要输出表达式的值;表达式语法也可与FreeMarker 标签结合,用于控制输出.实际上FreeMarker的表达式功能非常强大,它不仅支持直接指定值,输出变量值,也支持字符串格式化输出和集合访问等功能.

    3.1 直接指定值

    使用直接指定值语法让FreeMarker直接输出插值中的值,而不是输出变量值.直接指定值可以是字符串,数值,布尔值,集合和MAP对象.

    1,字符串
    直接指定字符串值使用单引号或双引号限定,如果字符串值中包含特殊字符需要转义,看下面的例子:
    ${"我的文件保存在C:\\盘"}
    ${'我名字是\"annlee\"'}
    输出结果是:
    我的文件保存在C:\盘
    我名字是”annlee”

    FreeMarker支持如下转义字符:
    \";双引号(u0022)
    \';单引号(u0027)
    \\;反斜杠(u005C)
    \n;换行(u000A)
    \r;回车(u000D)
    \t;Tab(u0009)
    \b;退格键(u0008)
    \f;Form feed(u000C)
    \l;<
    \g;>
    \a;&
    \{;{
    \xCode;直接通过4位的16进制数来指定Unicode码,输出该unicode码对应的字符.

    如果某段文本中包含大量的特殊符号,FreeMarker提供了另一种特殊格式:可以在指定字符串内容的引号前增加r标记,在r标记后的文件将会直接输出.看如下代码:
    ${r"${foo}"}
    ${r"C:\foo\bar"}
    输出结果是:
    ${foo}
    C:\foo\bar

    2,数值
    表达式中的数值直接输出,不需要引号.小数点使用”.”分隔,不能使用分组”,”符号.FreeMarker目前还不支持科学计数法,所以”1E3”是错误的.在FreeMarker表达式中使用数值需要注意以下几点:
    1,数值不能省略小数点前面的0,所以”.5”是错误的写法
    2,数值8 , +8 , 8.00都是相同的

    3,布尔值
    直接使用true和false,不使用引号.

    4,集合
    集合以方括号包括,各集合元素之间以英文逗号”,”分隔,看如下的例子:
    <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>
    ${x}

    输出结果是:
    星期一
    星期二
    星期三
    星期四
    星期五
    星期六
    星期天

    除此之外,集合元素也可以是表达式,例子如下:
    [2 + 2, [1, 2, 3, 4], "whatnot"]

    还可以使用数字范围定义数字集合,如2..5等同于[2, 3, 4, 5],但是更有效率.注意,使用数字范围来定义集合时无需使用方括号,数字范围也支持反递增的数字范围,如5..2

    5,Map对象
    Map对象使用花括号包括,Map中的key-value对之间以英文冒号”:”分隔,多组key-value对之间以英文逗号”,”分隔.下面是一个例子:
    {"语文":78, "数学":80}
    Map对象的key和value都是表达式,但是key必须是字符串

    3.2 输出变量值

    FreeMarker的表达式输出变量时,这些变量可以是顶层变量,也可以是Map对象中的变量,还可以是集合中的变量,并可以使用点(.)语法来访问Java对象的属性.下面分别讨论这些情况

    1,顶层变量
    所谓顶层变量就是直接放在数据模型中的值,例如有如下数据模型:
    Map root = new HashMap(); //创建数据模型
    root.put("name","annlee"); //name是一个顶层变量

    对于顶层变量,直接使用${variableName}来输出变量值,变量名只能是字母,数字,下划线,$,@和#的组合,且不能以数字开头号.为了输出上面的name的值,可以使用如下语法:
    ${name}

    2,输出集合元素
    如果需要输出集合元素,则可以根据集合元素的索引来输出集合元素,集合元素的索引以方括号指定.假设有索引:
    [“星期一”,”星期二”,”星期三”,”星期四”,”星期五”,”星期六”,”星期天”].该索引名为week,如果需要输出星期三,则可以使用如下语法:
    ${week[2]} //输出第三个集合元素

    此外,FreeMarker还支持返回集合的子集合,如果需要返回集合的子集合,则可以使用如下语法:
    week[3..5] //返回week集合的子集合,子集合中的元素是week集合中的第4-6个元素

    3,输出Map元素
    这里的Map对象可以是直接HashMap的实例,甚至包括JavaBean实例,对于JavaBean实例而言,我们一样可以把其当成属性为key,属性值为value的Map实例.为了输出Map元素的值,可以使用点语法或方括号语法.假如有下面的数据模型:
    Map root = new HashMap();
    Book book = new Book();
    Author author = new Author();
    author.setName("annlee");
    author.setAddress("gz");
    book.setName("struts2");
    book.setAuthor(author);
    root.put("info","struts");
    root.put("book", book);

    为了访问数据模型中名为struts2的书的作者的名字,可以使用如下语法:
    book.author.name //全部使用点语法
    book["author"].name
    book.author["name"] //混合使用点语法和方括号语法
    book["author"]["name"] //全部使用方括号语法

    使用点语法时,变量名字有顶层变量一样的限制,但方括号语法没有该限制,因为名字可以是任意表达式的结果.

    3.3, 字符串操作

    FreeMarker的表达式对字符串操作非常灵活,可以将字符串常量和变量连接起来,也可以返回字符串的子串等.

    字符串连接有两种语法:
    1,使用${..}#{..}在字符串常量部分插入表达式的值,从而完成字符串连接.
    2,直接使用连接运算符+来连接字符串

    例如有如下数据模型:
    Map root = new HashMap(); root.put("user","annlee");
    下面将user变量和常量连接起来:
    ${"hello, ${user}!"} //使用第一种语法来连接
    ${"hello, " + user + "!"} //使用+号来连接
    上面的输出字符串都是hello,annlee!,可以看出这两种语法的效果完全一样.

    值得注意的是,${..}只能用于文本部分,不能用于表达式,下面的代码是错误的:
    <#if ${isBig}>Wow!
    <#if "${isBig}">Wow!
    应该写成:<#if isBig>Wow!

    截取子串可以根据字符串的索引来进行,截取子串时如果只指定了一个索引值,则用于取得字符串中指定索引所对应的字符;如果指定两个索引值,则返回两个索引中间的字符串子串.假如有如下数据模型:
    Map root = new HashMap(); root.put("book","struts2,freemarker");
    可以通过如下语法来截取子串:
    ${book[0]}${book[4]} //结果是su
    ${book[1..4]} //结果是tru

    3.4 集合连接运算符

    这里所说的集合运算符是将两个集合连接成一个新的集合,连接集合的运算符是+,看如下的例子:
    <#list ["星期一","星期二","星期三"] + ["星期四","星期五","星期六","星期天"] as x>
    ${x}

    输出结果是:星期一 星期二 星期三 星期四 星期五 星期六 星期天

    3.5 Map连接运算符

    Map对象的连接运算符也是将两个Map对象连接成一个新的Map对象,Map对象的连接运算符是+,如果两个Map对象具有相同的key,则右边的值替代左边的值.看如下的例子:
    <#assign scores = {"语文":86,"数学":78} + {"数学":87,"Java":93}>
    语文成绩是${scores.语文}
    数学成绩是${scores.数学}
    Java成绩是${scores.Java}
    输出结果是:
    语文成绩是86
    数学成绩是87
    Java成绩是93

    3.6 算术运算符

    FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:+, - , * , / , % 看如下的代码:
    <#assign x=5>
    ${ x * x - 100 }
    ${ x /2 }
    ${ 12 %10 }
    输出结果是:
    -75 2.5 2

    在表达式中使用算术运算符时要注意以下几点:
    1,运算符两边的运算数字必须是数字
    2,使用+运算符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串再连接,如:${3 + "5"},结果是:35

    使用内建的int函数可对数值取整,如:
    <#assign x=5>
    ${ (x/2)?int }
    ${ 1.1?int }
    ${ 1.999?int }
    ${ -1.1?int }
    ${ -1.999?int }
    结果是:2 1 1 -1 -1

    3.7 比较运算符

    表达式中支持的比较运算符有如下几个:
    1,=或者==:判断两个值是否相等.
    2,!=:判断两个值是否不等.
    3,>或者gt:判断左边值是否大于右边值
    4,>=或者gte:判断左边值是否大于等于右边值
    5,<或者lt:判断左边值是否小于右边值
    6,<=或者lte:判断左边值是否小于等于右边值

    注意:=和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,否则会产生错误,而且FreeMarker是精确比较,”x”,”x “,”X”是不等的.其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果,因为 FreeMarker会把>解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,如:<#if (x>y)>

    3.8 逻辑运算符

    逻辑运算符有如下几个:
    逻辑与:&&
    逻辑或:||
    逻辑非:!
    逻辑运算符只能作用于布尔值,否则将产生错误

    3.9 内建函数

    FreeMarker还提供了一些内建函数来转换输出,可以在任何变量后紧跟?,?后紧跟内建函数,就可以通过内建函数来轮换输出变量.下面是常用的内建的字符串函数:
    html:对字符串进行HTML编码
    cap_first:使字符串第一个字母大写
    lower_case:将字符串转换成小写
    upper_case:将字符串转换成大写
    trim:去掉字符串前后的空白字符

    下面是集合的常用内建函数
    size:获取序列中元素的个数

    下面是数字值的常用内建函数
    int:取得数字的整数部分,结果带符号

    例如:
    <#assign test="Tom & Jerry">
    ${test?html}
    ${test?upper_case?html}
    结果是:Tom & Jerry TOM & JERRY

    3.10 空值处理运算符

    FreeMarker对空值的处理非常严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常,因为FreeMarker未赋值的变量强制出错可以杜绝很多潜在的错误,如缺失潜在的变量命名,或者其他变量错误.这里所说的空值,实际上也包括那些并不存在的变量,对于一个Java的 null值而言,我们认为这个变量是存在的,只是它的值为null,但对于FreeMarker模板而言,它无法理解null值,null值和不存在的变量完全相同.

    为了处理缺失变量,FreeMarker提供了两个运算符:
    !:指定缺失变量的默认值
    ??:判断某个变量是否存在

    其中,!运算符的用法有如下两种:
    variable!或variable!defaultValue,第一种用法不给缺失的变量指定默认值,表明默认值是空字符串,长度为0的集合,或者长度为0的Map对象.

    使用!指定默认值时,并不要求默认值的类型和变量类型相同.使用??运算符非常简单,它总是返回一个布尔值,用法为:variable??,如果该变量存在,返回true,否则返回false

    3.11 运算符的优先级

    FreeMarker中的运算符优先级如下(由高到低排列):
    1,一元运算符:!
    2,内建函数:?
    3,乘除法:*, / , %
    4,加减法:- , +
    5,比较:> , < , >= , <= (lt , lte , gt , gte)
    6,相等:== , = , !=
    7,逻辑与:&&
    8,逻辑或:||
    9,数字范围:..

    实际上,我们在开发过程中应该使用括号来严格区分,这样的可读性好,出错少

    4 FreeMarker的常用指令

    FreeMarker的FTL指令也是模板的重要组成部分,这些指令可实现对数据模型所包含数据的抚今迭代,分支控制.除此之外,还有一些重要的功能,也是通过FTL指令来实现的.

    4.1 if指令

    这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下:
    <#if condition>...
    <#elseif condition>...
    <#elseif condition>...
    <#else> ...

    例子如下:
    <#assign age=23>
    <#if (age>60)>老年人
    <#elseif (age>40)>中年
    <#elseif (age>20)>青年
    <#else> 少年人

    输出结果是:青年人
    上面的代码中的逻辑表达式用括号括起来主要是因为里面有>符号,由于FreeMarker会将>符号当成标签的结束字符,可能导致程序出错,为了避免这种情况,我们应该在凡是出现这些符号的地方都使用括号.

    4.2 switch , case , default , break指令

    这些指令显然是分支指令,作用类似于Java的switch语句,switch指令的语法结构如下:
    <#switch value>
    <#case refValue>...<#break>
    <#case refValue>...<#break>
    <#default>...

    4.3 list, break指令

    list指令是一个迭代输出指令,用于迭代输出数据模型中的集合,list指令的语法格式如下:
    <#list sequence as item>
    ...

    上面的语法格式中,sequence就是一个集合对象,也可以是一个表达式,但该表达式将返回一个集合对象,而item是一个任意的名字,就是被迭代输出的集合元素.此外,迭代集合对象时,还包含两个特殊的循环变量:
    item_index:当前变量的索引值
    item_has_next:是否存在下一个对象
    也可以使用<#break>指令跳出迭代

    例子如下:
    <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>
    ${x_index + 1}.${x}<#if x_has_next>,
    <#if x="星期四"><#break>

    4.4 include指令

    include指令的作用类似于JSP的包含指令,用于包含指定页.include指令的语法格式如下:
    <#include filename [options]>
    在上面的语法格式中,两个参数的解释如下:
    filename:该参数指定被包含的模板文件
    options:该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,其中encoding指定包含页面时所用的解码集,而parse指定被包含文件是否作为FTL文件来解析,如果省略了parse选项值,则该选项默认是true.

    4.5 import指令

    该指令用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中,import指令的语法格式如下:
    <#import "/lib/common.ftl" as com>
    上面的代码将导入/lib/common.ftl模板文件中的所有变量,交将这些变量放置在一个名为com的Map对象中.

    4.6 noparse指令

    noparse指令指定FreeMarker不处理该指定里包含的内容,该指令的语法格式如下:
    <#noparse>...

    看如下的例子:
    <#noparse>
    <#list books as book>
    ${book.name}作者:${book.author}


    输出如下:
    <#list books as book>
    ${book.name}作者:${book.author}

    4.7 escape , noescape指令

    escape指令导致body区的插值都会被自动加上escape表达式,但不会影响字符串内的插值,只会影响到body内出现的插值,使用escape指令的语法格式如下:
    <#escape identifier as expression>...
    <#noescape>...

    看如下的代码:
    <#escape x as x?html>
    First name:${firstName}
    Last name:${lastName}
    Maiden name:${maidenName}

    上面的代码等同于:
    First name:${firstName?html}
    Last name:${lastName?html}
    Maiden name:${maidenName?html}

    escape指令在解析模板时起作用而不是在运行时起作用,除此之外,escape指令也嵌套使用,子escape继承父escape的规则,如下例子:
    <#escape x as x?html>
    Customer Name:${customerName}
    Items to ship;
    <#escape x as itemCodeToNameMap[x]>
    ${itemCode1}
    ${itemCode2}
    ${itemCode3}
    ${itemCode4}


    上面的代码类似于:
    Customer Name:${customerName?html}
    Items to ship;
    ${itemCodeToNameMap[itemCode1]?html}
    ${itemCodeToNameMap[itemCode2]?html}
    ${itemCodeToNameMap[itemCode3]?html}
    ${itemCodeToNameMap[itemCode4]?html}

    对于放在escape指令中所有的插值而言,这此插值将被自动加上escape表达式,如果需要指定escape指令中某些插值无需添加escape表达式,则应该使用noescape指令,放在noescape指令中的插值将不会添加escape表达式.

    4.8 assign指令

    assign指令在前面已经使用了多次,它用于为该模板页面创建或替换一个顶层变量,assign指令的用法有多种,包含创建或替换一个顶层变量, 或者创建或替换多个变量等,它的最简单的语法如下:<#assign name=value [in namespacehash]>,这个用法用于指定一个名为name的变量,该变量的值为value,此外,FreeMarker允许在使用 assign指令里增加in子句,in子句用于将创建的name变量放入namespacehash命名空间中.

    assign指令还有如下用法:<#assign name1=value1 name2=value2 ... nameN=valueN [in namespacehash]>,这个语法可以同时创建或替换多个顶层变量,此外,还有一种复杂的用法,如果需要创建或替换的变量值是一个复杂的表达式,则可以使用如下语法格式:<#assign name [in namespacehash]>capture this,在这个语法中,是指将assign指令的内容赋值给name变量.如下例子:
    <#assign x>
    <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天”] as n>
    ${n}


    ${x}
    上面的代码将产生如下输出:星期一 星期二 星期三 星期四 星期五 星期六 星期天

    虽然assign指定了这种复杂变量值的用法,但是我们也不要滥用这种用法,如下例子:<#assign x>Hello ${user}!,以上代码改为如下写法更合适:<#assign x="Hello ${user}!">

    4.9 setting指令

    该指令用于设置FreeMarker的运行环境,该指令的语法格式如下:<#setting name=value>,在这个格式中,name的取值范围包含如下几个:
    locale:该选项指定该模板所用的国家/语言选项
    number_format:指定格式化输出数字的格式
    boolean_format:指定两个布尔值的语法格式,默认值是true,false
    date_format,time_format,datetime_format:指定格式化输出日期的格式
    time_zone:设置格式化输出日期时所使用的时区

    4.10 macro , nested , return指令

    macro可以用于实现自定义指令,通过使用自定义指令,可以将一段模板片段定义成一个用户指令,使用macro指令的语法格式如下:
    <#macro name param1 param2 ... paramN>
    ...
    <#nested loopvar1, loopvar2, ..., loopvarN>
    ...
    <#return>
    ...

    在上面的格式片段中,包含了如下几个部分:
    name:name属性指定的是该自定义指令的名字,使用自定义指令时可以传入多个参数
    paramX:该属性就是指定使用自定义指令时报参数,使用该自定义指令时,必须为这些参数传入值
    nested指令:nested标签输出使用自定义指令时的中间部分
    nested指令中的循环变量:这此循环变量将由macro定义部分指定,传给使用标签的模板
    return指令:该指令可用于随时结束该自定义指令.

    看如下的例子:
    <#macro book> //定义一个自定义指令
    j2ee

    <@book /> //使用刚才定义的指令
    上面的代码输出结果为:j2ee

    在上面的代码中,可能很难看出自定义标签的用处,因为我们定义的book指令所包含的内容非常简单,实际上,自定义标签可包含非常多的内容,从而可以实现更好的代码复用.此外,还可以在定义自定义指令时,为自定义指令指定参数,看如下代码:
    <#macro book booklist> //定义一个自定义指令booklist是参数
    <#list booklist as book>
    ${book}


    <@book booklist=["spring","j2ee"] /> //使用刚刚定义的指令
    上面的代码为book指令传入了一个参数值,上面的代码的输出结果为:spring j2ee

    不仅如此,还可以在自定义指令时使用nested指令来输出自定义指令的中间部分,看如下例子:
    <#macro page title>


    FreeMarker示例页面 - ${title?html}</tit></code> <br> <code></head></code> <br> <code><body></code> <br> <code><h1>${title?html}</h1></code> <br> <code><#nested> //用于引入用户自定义指令的标签</code> <br> <code></body></code> <br> <code></html></code> <br> <code></#macro></code> <br> 上面的代码将一个HTML页面模板定义成一个page指令,则可以在其他页面中如此page指令: <br> <code><#import "/common.ftl" as com> //假设上面的模板页面名为common.ftl,导入页面</code> <br> <code><@com.page title="book list"></code> <br> <code><u1></code> <br> <code><li>spring</li></code> <br> <code><li>j2ee</li></code> <br> <code></ul></code> <br> <code></@com.page></code></p> <p>从上面的例子可以看出,使用macro和nested指令可以非常容易地实现页面装饰效果,此外,还可以在使用nested指令时,指定一个或多个循环变量,看如下代码: <br> <code><#macro book></code> <br> <code><#nested 1> //使用book指令时指定了一个环变量值</code> <br> <code><#nested 2></code> <br> <code></#macro></code> <br> <code><@book ;x> ${x} .图书</@book></code> <br> 当使用nested指令传入变量值时,在使用该自定义指令时,就需要使用一个占位符(如book指令后的;x).上面的代码输出文本如下: <br> 1 .图书 2 .图书 </p> <p>在nested指令中使用循环变量时,可以使用多个循环变量,看如下代码: <br> <code><#macro repeat count></code> <br> <code><#list 1..count as x> //使用nested指令时指定了三个循</code>环变量 <br> <code><#nested x, x/2, x==count></code> <br> <code></#list></code> <br> <code></#macro></code> <br> <code><@repeat count=4 ; c halfc last></code> <br> <code>${c}. ${halfc}<#if last> Last! </#if></code> <br> <code></@repeat></code> <br> 上面的输出结果为: <br> 1. 0.5 2. 1 3. 1.5 4. 2 Last; </p> <p>return指令用于结束macro指令,一旦在macro指令中执行了return指令,则FreeMarker不会继续处理macro指令里的内容,看如下代码: <br> <code><#macro book></code> <br> <code>spring</code> <br> <code><#return></code> <br> <code>j2ee</code> <br> <code></#macro></code> <br> <code><@book /></code> <br> 上面的代码输出:spring,而j2ee位于return指令之后,不会输出. </p> <pre><code>`if, else, elseif ` `switch, case, default, break ` `list, break` `include` `Import ` `compress ` `escape, noescape ` `assign ` `global ` `setting` `macro, nested, return` `t, lt, rt` </code></pre> <p>3一些常用方法或注意事项 <br> 表达式转换类 <br> 数字循环 <br> 对浮点取整数 <br> 给变量默认值 <br> 判断对象是不是null <br> 常用格式化日期 <br> 添加全局共享变量数据模型 <br> 直接调用java对象的方法 <br> 字符串处理(内置方法) <br> 在模板里对sequences和hashes初始化 <br> 注释标志 <br> sequences内置方法 <br> hashes内置方法 <br> 4 freemarker在web开发中注意事项 <br> web中常用的几个对象 <br> view中值的搜索顺序 <br> 在模板里ftl里使用标签 <br> 如何初始化共享变量 <br> 与webwork整合配置 <br> 5高级方法 <br> 自定义方法 <br> 自定义 Transforms </p> <p>1概念 <br> 最常用的3个概念 <br> sequence 序列,对应java里的list、数组等非键值对的集合 <br> hash 键值对的集合 <br> namespace 对一个ftl文件的引用,利用这个名字可以访问到该ftl文件的资源 </p> <p>2指令 <br> if, else, elseif 语法 <br> <code><#if condition></code> <br> <code>...</code> <br> <code><#elseif condition2></code> <br> <code>...</code> <br> <code><#elseif condition3></code> <br> <code>...</code> <br> <code>...</code> <br> <code><#else></code> <br> <code>...</code> <br> <code></#if></code> <br> 用例 <br> <code><#if x = 1></code> <br> <code>x is 1</code> <br> <code></#if></code> <br> <code></code> <br> <code><#if x = 1></code> <br> <code>x is 1</code> <br> <code><#else></code> <br> <code>x is not 1</code> <br> <code></#if></code></p> <p>switch, case, default, break 语法 <br> <code><#switch value></code> <br> <code><#case refValue1></code> <br> <code>...</code> <br> <code><#break></code> <br> <code><#case refValue2></code> <br> <code>...</code> <br> <code><#break></code> <br> <code>...</code> <br> <code><#case refValueN></code> <br> <code>...</code> <br> <code><#break></code> <br> <code><#default></code> <br> <code>...</code> <br> <code></#switch></code></p> <p>用例 <br> 字符串 <br> <code><#switch being.size></code> <br> <code><#case "small"></code> <br> <code>This will be processed if it is small</code> <br> <code><#break></code> <br> <code><#case "medium"></code> <br> <code>This will be processed if it is medium</code> <br> <code><#break></code> <br> <code><#case "large"></code> <br> <code>This will be processed if it is large</code> <br> <code><#break></code> <br> <code><#default></code> <br> <code>This will be processed if it is neither</code> <br> <code></#switch></code> <br> 数字 <br> <code><#switch x></code> <br> <code><#case x = 1></code> <br> <code>1</code> <br> <code><#case x = 2></code> <br> <code>2</code> <br> <code><#default></code> <br> <code>d</code> <br> <code></#switch></code></p> <p>如果x=1 输出 1 2, x=2输出 2, x=3 输出d </p> <p>list, break 语法 <br> <code><#list sequence as item></code> <br> <code>...</code> <br> <code><#if item = "spring"><#break></#if></code> <br> <code>...</code> <br> <code></#list></code> <br> 关键字 <br> item_index:是list当前值的下标 <br> item_has_next:判断list是否还有值 </p> <p>用例 <br> <code><#assign seq = ["winter", "spring", "summer", "autumn"]></code> <br> <code><#list seq as x></code> <br> <code>${x_index + 1}. ${x}<#if x_has_next>,</#if></code> <br> <code></#list></code></p> <p>输出 <br> 1. winter, <br> 2. spring, <br> 3. summer, <br> 4. autumn </p> <p>include 语法 <br> <code><#include filename></code> <br> <code>or</code> <br> <code><#include filename options></code> <br> <code>options包含两个属性</code> <br> <code>encoding=”GBK” 编码格式</code> <br> parse=true 是否作为ftl语法解析,默认是true,false就是以文本方式引入.注意在ftl文件里布尔值都是直接赋值的如parse=true,而不是parse=”true” <br> 用例 <br> /common/copyright.ftl包含内容 <br> Copyright 2001-2002 ${me}<br> <br> All rights reserved. <br> 模板文件 <br> <code><#assign me = "Juila Smith"></code> <br> <code><h1>Some test</h1></code> <br> <code><p>Yeah.</code> <br> <code><hr></code> <br> <code><#include "/common/copyright.ftl" encoding=”GBK”></code> <br> 输出结果 <br> <code><h1>Some test</h1></code> <br> <code><p>Yeah.</code> <br> <code><hr></code> <br> Copyright 2001-2002 Juila Smith <br> All rights reserved. </p> <p>Import 语法 <br> <code><#import path as hash></code> <br> 类似于java里的import,它导入文件,然后就可以在当前文件里使用被导入文件里的宏组件 </p> <p>用例 </p> <p>假设mylib.ftl里定义了宏copyright那么我们在其他模板页面里可以这样使用 <br> <code><#import "/libs/mylib.ftl" as my></code> <br> <code><@my.copyright date="1999-2002"/></code></p> <p>“my”在freemarker里被称作namespace </p> <p>compress 语法 <br> <code><#compress></code> <br> <code>...</code> <br> <code></#compress></code> <br> 用来压缩空白空间和空白的行 <br> 用例 <br> <code><#assign x = " moo \n\n "></code> <br> <code>(<#compress></code> <br> <code>1 2 3 4 5</code> <br> <code>${moo}</code> <br> <code>test only</code> <br> <code></code> <br> <code>I said, test only</code> <br> <code></code> <br> <code></#compress>)</code> <br> 输出 <br> (1 2 3 4 5 <br> moo <br> test only <br> I said, test only) <br> escape, noescape 语法 <br> <code><#escape identifier as expression></code> <br> <code>...</code> <br> <code><#noescape>...</#noescape></code> <br> <code>...</code> <br> <code></#escape></code> <br> 用例 <br> 主要使用在相似的字符串变量输出,比如某一个模块的所有字符串输出都必须是html安全的,这个时候就可以使用该表达式 <br> <code><#escape x as x?html></code> <br> <code>First name: ${firstName}</code> <br> <code><#noescape>Last name: ${lastName}</#noescape></code> <br> <code>Maiden name: ${maidenName}</code> <br> <code></#escape></code> <br> 相同表达式 <br> <code>First name: ${firstName?html}</code> <br> <code>Last name: ${lastName }</code> <br> <code>Maiden name: ${maidenName?html}</code> <br> assign 语法 <br> <code><#assign name=value></code> <br> <code>or</code> <br> <code><#assign name1=value1 name2=value2 ... nameN=valueN></code> <br> <code>or</code> <br> <code><#assign same as above... in namespacehash></code> <br> <code>or</code> <br> <code><#assign name></code> <br> <code>capture this</code> <br> <code></#assign></code> <br> <code>or</code> <br> <code><#assign name in namespacehash></code> <br> <code>capture this</code> <br> <code></#assign></code> <br> 用例 <br> 生成变量,并且给变量赋值 <br> 给seasons赋予序列值 <br> <code><#assign seasons = ["winter", "spring", "summer", "autumn"]></code></p> <p>给变量test加1 <br> <code><#assign test = test + 1></code></p> <p>给my namespage 赋予一个变量bgColor,下面可以通过my.bgColor来访问这个变量 <br> <code><#import "/mylib.ftl" as my></code> <br> <code><#assign bgColor="red" in my></code></p> <p>将一段输出的文本作为变量保存在x里 <br> 下面的阴影部分输出的文本将被赋值给x <br> <code><#assign x></code> <br> <code><#list 1..3 as n></code> <br> <code>${n} <@myMacro /></code> <br> <code></#list></code> <br> <code></#assign></code> <br> <code>Number of words: ${x?word_list?size}</code> <br> <code>${x}</code></p> <pre><code>`<#assign x>Hello ${user}!</#assign> error` `<#assign x=” Hello ${user}!”> true ` </code></pre> <p>同时也支持中文赋值,如: <br> <code><#assign 语法></code> <br> <code>java</code> <br> <code></#assign></code> <br> <code>${语法}</code> <br> 打印输出: <br> java <br> global 语法 <br> <code><#global name=value></code> <br> <code>or</code> <br> <code><#global name1=value1 name2=value2 ... nameN=valueN></code> <br> <code>or</code> <br> <code><#global name></code> <br> <code>capture this</code> <br> <code></#global></code></p> <p>全局赋值语法,利用这个语法给变量赋值,那么这个变量在所有的namespace中是可见的,如果这个变量被当前的assign语法覆盖如<code><#global x=2> <#assign x=1></code> 在当前页面里x=2将被隐藏,或者通过<code>${.global.x}</code>来访问 </p> <p>setting 语法 <br> <code><#setting name=value></code> <br> 用来设置整个系统的一个环境 <br> locale <br> number_format <br> boolean_format <br> date_format, time_format, datetime_format <br> time_zone <br> classic_compatible <br> 用例 <br> 假如当前是匈牙利的设置,然后修改成美国 <br> <code>${1.2}</code> <br> <code><#setting locale="en_US"></code> <br> <code>${1.2}</code> <br> 输出 <br> 1,2 <br> 1.2 <br> 因为匈牙利是采用“,”作为十进制的分隔符,美国是用“.” </p> <p>macro, nested, return 语法 </p> <pre><code>`<#macro name param1 param2 ... paramN> ` ` ...` ` <#nested loopvar1, loopvar2, ..., loopvarN>` ` ...` ` <#return>` ` ...` `</#macro>` </code></pre> <p>用例 <br> <code><#macro test foo bar="Bar" baaz=-1></code> <br> <code>Test text, and the params: ${foo}, ${bar}, ${baaz}</code> <br> <code></#macro></code> <br> <code><@test foo="a" bar="b" baaz=5*5-2/></code> <br> <code><@test foo="a" bar="b"/></code> <br> <code><@test foo="a" baaz=5*5-2/></code> <br> <code><@test foo="a"/></code> <br> 输出 <br> Test text, and the params: a, b, 23 <br> Test text, and the params: a, b, -1 <br> Test text, and the params: a, Bar, 23 <br> Test text, and the params: a, Bar, -1 <br> 定义循环输出的宏 <br> <code><#macro list title items></code> <br> <code><p>${title?cap_first}:</code> <br> <code><ul></code> <br> <code><#list items as x></code> <br> <code><li>${x?cap_first}</code> <br> <code></#list></code> <br> <code></ul></code> <br> <code></#macro></code> <br> <code><@list items=["mouse", "elephant", "python"] title="Animals"/></code> <br> 输出结果 <br> <code><p>Animals:</code> <br> <code><ul></code> <br> <code><li>Mouse</code> <br> <code><li>Elephant</code> <br> <code><li>Python</code> <br> <code></ul></code> <br> 包含body的宏 <br> <code><#macro repeat count></code> <br> <code><#list 1..count as x></code> <br> <code><#nested x, x/2, x==count></code> <br> <code></#list></code> <br> <code></#macro></code> <br> <code><@repeat count=4 ; c halfc last></code> <br> <code>${c}. ${halfc}<#if last> Last!</#if></code> <br> <code></@repeat></code> <br> 输出 <br> 1. 0.5 <br> 2. 1 <br> 3. 1.5 <br> 4. 2 Last! </p> <p>t, lt, rt 语法 <br> <code><#t> 去掉左右空白和回车换行</code> <br> <code></code> <br> <code><#lt>去掉左边空白和回车换行</code> <br> <code></code> <br> <code><#rt>去掉右边空白和回车换行</code> <br> <code></code> <br> <code><#nt>取消上面的效果</code></p> <p>3一些常用方法或注意事项 </p> <p>表达式转换类 <br> <code>${expression}计算expression并输出</code> <br> <code>#{ expression }数字计算#{ expression ;format}安格式输出数字format为M和m</code> <br> M表示小数点后最多的位数,m表示小数点后最少的位数如<code>#{121.2322;m2M2}</code>输出121.23 </p> <p>数字循环 <br> 1..5 表示从1到5,原型number..number <br> 对浮点取整数 <br> <code>${123.23?int} 输出123</code> <br> 给变量默认值 <br> <code>${var?default(“hello world<br>”)?html}如果var is null那么将会被hello world<br>替代</code></p> <p>判断对象是不是null <br> <code><#if mouse?exists></code> <br> <code>Mouse found</code> <br> <code><#else></code> <br> 也可以直接<code>${mouse?if_exists})</code>输出布尔形 <br> 常用格式化日期 <br> openingTime必须是Date型,详细查看freemarker文档 <code>Reference->build-in referece->build-in for date</code></p> <pre><code>`${openingTime?date} ` `${openingTime?date_time}` `${openingTime?time} ` </code></pre> <p>添加全局共享变量数据模型 <br> 在代码里的实现 <br> <code>cfg = Configuration.getDefaultConfiguration();</code> <br> <code>cfg.setSharedVariable("global", "you good");</code> <br> 页面实现可以通过global指令,具体查看指令里的global部分 <br> 直接调用java对象的方法 <br> <code>${object.methed(args)}</code></p> <p>字符串处理(内置方法) <br> html安全输出 <br> <code>“abc<table>sdfsf”?html</code> <br> 返回安全的html输出,替换掉html代码 <br> xml安全输出 <br> var?xml <br> substring的用法 <br> <code><#assign user=”hello jeen”></code> <br> <code>${user[0]}${user[4]}</code> <br> <code>${user[1..4]}</code> <br> 输出 : <br> ho <br> ello <br> 类似String.split的用法 <br> <code>“abc;def;ghi”?split(“;”)返回sequence</code> <br> 将字符串按空格转化成sequence,然后取sequence的长度 <br> <code>var?word_list 效果同 var?split(“ ”)</code> <br> <code>var?word_list?size</code></p> <p>取得字符串长度 <br> <code>var?length</code></p> <p>大写输出字符 <br> <code>var?upper_case</code></p> <p>小写输出字符 <br> <code>var?lower_case</code></p> <p>首字符大写 <br> <code>var?cap_first</code> </p> <p>首字符小写 <br> <code>var?uncap_first</code></p> <p>去掉字符串前后空格 <br> <code>var?trim</code></p> <p>每个单词的首字符大写 <br> <code>var?capitalize</code></p> <p>类似String.indexof: <br> <code>“babcdabcd”?index_of(“abc”) 返回1</code> <br> <code>“babcdabcd”?index_of(“abc”,2) 返回5</code> <br> 类似String.lastIndexOf <br> last_index_of和String.lastIndexOf类似,同上 </p> <p>下面两个可能在代码生成的时候使用(在引号前加”\”) <br> <code>j_string: 在字符串引号前加”\”</code> <br> <code><#assign beanName = 'The "foo" bean.'></code> <br> <code>String BEAN_NAME = "${beanName?j_string}";</code> <br> 打印输出: <br> <code>String BEAN_NAME = "The \"foo\" bean.";</code> <br> <code>js_string:</code> <br> <code><#assign user = "Big Joe's \"right hand\"."></code> <br> <code><script></code> <br> <code>alert("Welcome ${user}!");</code> <br> <code></script></code> <br> 打印输出 <br> <code>alert("Welcome Big Joe\'s \"right hand\"!");</code></p> <p>替换字符串 replace <code> <br> </code>${s?replace(‘ba’, ‘XY’ )} <br> <code>${s?replace(‘ba’, ‘XY’ , ‘规则参数’)}将s里的所有的ba替换成xy 规则参数包含: i r m s c f 具体含义如下:</code> <br> · i: 大小写不区分. <br> · f: 只替换第一个出现被替换字符串的字符串 <br> · r: XY是正则表达式 <br> · m: Multi-line mode for regular expressions. In multi-line mode the expressions ^ and $ match just after or just before, respectively, a line terminator or the end of the string. By default these expressions only match at the beginning and the end of the entire string. <br> · s: Enables dotall mode for regular expressions (same as Perl singe-line mode). In dotall mode, the expression . matches any character, including a line terminator. By default this expression does not match line terminators. <br> · c: Permits whitespace and comments in regular expressions. </p> <p>在模板里对sequences和hashes初始化 <br> sequences </p> <pre><code>`1. [“you”,”me”,”he”] ` `2. 1..100` `3. [ {“Akey”:”Avalue”},{“Akey1”:”Avalue1”},` `{“Bkey”:”Bvalue”},{“Bkey1”:”Bvalue1”}, ` `]` </code></pre> <p><code></code> <br> <code></code> <br> <code>hashes {“you”:”a”,”me”:”b”,”he”:”c”}</code></p> <p>注释标志 <br> <code><#--</code> <br> <code>这里是注释</code> <br> <code>--></code> <br> 旧版本的freemarker采用的是<code><#comment></code> 注释 <code></#comment></code>方法 </p> <p>sequences内置方法 <br> sequence?first <br> 返回sequence的第一个值;前提条件sequence不能是null <br> sequence?last <br> 返回sequence最后一个值 <br> sequence?reverse <br> 反转sequence的值 <br> sequence?size <br> 返回sequence的大小 <br> sequence?sort <br> 对sequence按里面的对象toString()的结果进行排序 <br> sequence?sort_by(value) <br> 对sequence 按里面的对象的属性value进行排序 <br> 如: sequence里面放入的是10 个user对象,user对象里面包含name,age等属性 <br> sequence?sort_by(name) 表示所有的user按user.name进行排序 <br> hashes内置方法 <br> hash?keys <br> 返回hash里的所有keys, 返回结果类型sequence <br> hash?values <br> 返回hash里的所有value, 返回结果类型sequence <br> 4 freemarker在web开发中注意事项 <br> freemarker与webwork整合 <br> web中常用的几个对象 <br> Freemarker的ftl文件中直接使用内部对象: <br> <code>${Request ["a"]}</code> <br> <code>${RequestParameters["a"]}</code> <br> <code>${Session ["a"]}</code> <br> <code>${Application ["a"]}</code> <br> <code>${JspTaglibs ["a"]}</code></p> <p>与webwork整合之后 通过配置的servlet 已经把request,session等对象置入了数据模型中 <br> 在view中存在下面的对象 <br> 我们可以在ftl中<span class="MathJax_Preview" style="color: inherit; display: none;"></span><span class="MathJax" id="MathJax-Element-368-Frame" style="position: relative;"> <span class="math" id="MathJax-Span-31718" style="width: 34.953em; display: inline-block;"><span style="display: inline-block; position: relative; width: 27.952em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(9.152em 1027.95em 18.553em -999.998em); top: -10.098em; left: 0em;"><span class="mrow" id="MathJax-Span-31719"><span style="display: inline-block; position: relative; width: 27.952em; height: 0px;"><span style="position: absolute; clip: rect(3.052em 1024.1em 4.353em -999.998em); top: -3.998em; left: 0em;"><span class="texatom" id="MathJax-Span-31720"><span class="mrow" id="MathJax-Span-31721"><span class="mi" id="MathJax-Span-31722" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31723" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31724" style="font-family: MathJax_Math-italic;">q<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span></span></span><span class="texatom" id="MathJax-Span-31725"><span class="mrow" id="MathJax-Span-31726"><span class="mo" id="MathJax-Span-31727"><span style="font-family: STIXGeneral, "Arial Unicode MS", serif; font-size: 80%; font-style: normal; font-weight: normal;">来</span></span></span></span><span class="texatom" id="MathJax-Span-31728"><span class="mrow" id="MathJax-Span-31729"><span class="mo" id="MathJax-Span-31730"><span style="font-family: STIXGeneral, "Arial Unicode MS", serif; font-size: 80%; font-style: normal; font-weight: normal;">打</span></span></span></span><span class="texatom" id="MathJax-Span-31731"><span class="mrow" id="MathJax-Span-31732"><span class="mo" id="MathJax-Span-31733"><span style="font-family: STIXGeneral, "Arial Unicode MS", serif; font-size: 80%; font-style: normal; font-weight: normal;">印</span></span></span></span><span class="mi" id="MathJax-Span-31734" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31735" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31736" style="font-family: MathJax_Math-italic;">q<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span class="texatom" id="MathJax-Span-31737"><span class="mrow" id="MathJax-Span-31738"><span class="mo" id="MathJax-Span-31739"><span style="font-family: STIXGeneral, "Arial Unicode MS", serif; font-size: 80%; font-style: normal; font-weight: normal;">对</span></span></span></span><span class="texatom" id="MathJax-Span-31740"><span class="mrow" id="MathJax-Span-31741"><span class="mo" id="MathJax-Span-31742"><span style="font-family: STIXGeneral, "Arial Unicode MS", serif; font-size: 80%; font-style: normal; font-weight: normal;">象</span></span></span></span><span class="mo" id="MathJax-Span-31743" style="font-family: MathJax_Main; padding-left: 0.202em;">⋅</span><span class="mi" id="MathJax-Span-31744" style="font-family: MathJax_Math-italic; padding-left: 0.202em;">r</span><span class="mi" id="MathJax-Span-31745" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31746" style="font-family: MathJax_Math-italic;">q<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span class="mo" id="MathJax-Span-31747" style="font-family: MathJax_Main; padding-left: 0.202em;">−</span><span class="mi" id="MathJax-Span-31748" style="font-family: MathJax_Math-italic; padding-left: 0.202em;">t</span><span class="mi" id="MathJax-Span-31749" style="font-family: MathJax_Math-italic;">h</span><span class="mi" id="MathJax-Span-31750" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31751" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-31752" style="font-family: MathJax_Math-italic;">u</span><span class="mi" id="MathJax-Span-31753" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31754" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31755" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31756" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-31757" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31758" style="font-family: MathJax_Math-italic;">H<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.053em;"></span></span><span class="mi" id="MathJax-Span-31759" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31760" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31761" style="font-family: MathJax_Math-italic;">p</span><span class="mi" id="MathJax-Span-31762" style="font-family: MathJax_Math-italic;">S<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.053em;"></span></span><span class="mi" id="MathJax-Span-31763" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31764" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31765" style="font-family: MathJax_Math-italic;">v</span><span class="mi" id="MathJax-Span-31766" style="font-family: MathJax_Math-italic;">l</span><span class="mi" id="MathJax-Span-31767" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31768" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31769" style="font-family: MathJax_Math-italic;">R</span><span class="mi" id="MathJax-Span-31770" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31771" style="font-family: MathJax_Math-italic;">q<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span class="mi" id="MathJax-Span-31772" style="font-family: MathJax_Math-italic;">u</span><span class="mi" id="MathJax-Span-31773" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31774" style="font-family: MathJax_Math-italic;">s</span><span class="mi" id="MathJax-Span-31775" style="font-family: MathJax_Math-italic;">t</span><span class="mo" id="MathJax-Span-31776" style="font-family: MathJax_Main; padding-left: 0.202em;">⋅</span><span class="mi" id="MathJax-Span-31777" style="font-family: MathJax_Math-italic; padding-left: 0.202em;">r</span><span class="mi" id="MathJax-Span-31778" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31779" style="font-family: MathJax_Math-italic;">s</span><span style="display: inline-block; width: 0px; height: 4.002em;"></span></span><span style="position: absolute; clip: rect(3.152em 1018.2em 4.353em -999.998em); top: -2.647em; left: 0em;"><span class="mo" id="MathJax-Span-31780" style="font-family: MathJax_Main;">−</span><span class="mi" id="MathJax-Span-31781" style="font-family: MathJax_Math-italic; padding-left: 0.202em;">t</span><span class="mi" id="MathJax-Span-31782" style="font-family: MathJax_Math-italic;">h</span><span class="mi" id="MathJax-Span-31783" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31784" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-31785" style="font-family: MathJax_Math-italic;">u</span><span class="mi" id="MathJax-Span-31786" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31787" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31788" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31789" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-31790" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31791" style="font-family: MathJax_Math-italic;">H<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.053em;"></span></span><span class="mi" id="MathJax-Span-31792" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31793" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31794" style="font-family: MathJax_Math-italic;">p</span><span class="mi" id="MathJax-Span-31795" style="font-family: MathJax_Math-italic;">S<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.053em;"></span></span><span class="mi" id="MathJax-Span-31796" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31797" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31798" style="font-family: MathJax_Math-italic;">v</span><span class="mi" id="MathJax-Span-31799" style="font-family: MathJax_Math-italic;">l</span><span class="mi" id="MathJax-Span-31800" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31801" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31802" style="font-family: MathJax_Math-italic;">R</span><span class="mi" id="MathJax-Span-31803" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31804" style="font-family: MathJax_Math-italic;">s</span><span class="mi" id="MathJax-Span-31805" style="font-family: MathJax_Math-italic;">p</span><span class="mi" id="MathJax-Span-31806" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-31807" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-31808" style="font-family: MathJax_Math-italic;">s</span><span class="mi" id="MathJax-Span-31809" style="font-family: MathJax_Math-italic;">e</span><span class="mo" id="MathJax-Span-31810" style="font-family: MathJax_Main; padding-left: 0.202em;">⋅</span><span class="mi" id="MathJax-Span-31811" style="font-family: MathJax_Math-italic; padding-left: 0.202em;">s</span><span class="mi" id="MathJax-Span-31812" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31813" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-31814" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-31815" style="font-family: MathJax_Math-italic;">k</span><span style="display: inline-block; width: 0px; height: 4.002em;"></span></span><span style="position: absolute; clip: rect(3.152em 1026em 4.353em -999.998em); top: -1.347em; left: 0em;"><span class="mo" id="MathJax-Span-31816" style="font-family: MathJax_Main;">−</span><span class="mi" id="MathJax-Span-31817" style="font-family: MathJax_Math-italic; padding-left: 0.202em;">t</span><span class="mi" id="MathJax-Span-31818" style="font-family: MathJax_Math-italic;">h</span><span class="mi" id="MathJax-Span-31819" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31820" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-31821" style="font-family: MathJax_Math-italic;">u</span><span class="mi" id="MathJax-Span-31822" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31823" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31824" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31825" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-31826" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31827" style="font-family: MathJax_Math-italic;">O</span><span class="mi" id="MathJax-Span-31828" style="font-family: MathJax_Math-italic;">g<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span class="mi" id="MathJax-Span-31829" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-31830" style="font-family: MathJax_Math-italic;">l</span><span class="mi" id="MathJax-Span-31831" style="font-family: MathJax_Math-italic;">V<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.202em;"></span></span><span class="mi" id="MathJax-Span-31832" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-31833" style="font-family: MathJax_Math-italic;">l</span><span class="mi" id="MathJax-Span-31834" style="font-family: MathJax_Math-italic;">u</span><span class="mi" id="MathJax-Span-31835" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31836" style="font-family: MathJax_Math-italic;">S<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.053em;"></span></span><span class="mi" id="MathJax-Span-31837" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31838" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-31839" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-31840" style="font-family: MathJax_Math-italic;">k</span><span class="mo" id="MathJax-Span-31841" style="font-family: MathJax_Main; padding-left: 0.202em;">⋅</span><span class="mi" id="MathJax-Span-31842" style="font-family: MathJax_Math-italic; padding-left: 0.202em;">o</span><span class="mi" id="MathJax-Span-31843" style="font-family: MathJax_Math-italic;">g<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span class="mi" id="MathJax-Span-31844" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-31845" style="font-family: MathJax_Math-italic;">l</span><span class="mo" id="MathJax-Span-31846" style="font-family: MathJax_Main; padding-left: 0.202em;">−</span><span class="mi" id="MathJax-Span-31847" style="font-family: MathJax_Math-italic; padding-left: 0.202em;">t</span><span class="mi" id="MathJax-Span-31848" style="font-family: MathJax_Math-italic;">h</span><span class="mi" id="MathJax-Span-31849" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31850" style="font-family: MathJax_Math-italic;">O</span><span class="mi" id="MathJax-Span-31851" style="font-family: MathJax_Math-italic;">g<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span class="mi" id="MathJax-Span-31852" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-31853" style="font-family: MathJax_Math-italic;">l</span><span class="mi" id="MathJax-Span-31854" style="font-family: MathJax_Math-italic;">T<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.102em;"></span></span><span class="mi" id="MathJax-Span-31855" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-31856" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-31857" style="font-family: MathJax_Math-italic;">l</span><span class="mi" id="MathJax-Span-31858" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-31859" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-31860" style="font-family: MathJax_Math-italic;">s</span><span class="mi" id="MathJax-Span-31861" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31862" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-31863" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-31864" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-31865" style="font-family: MathJax_Math-italic;">e</span><span style="display: inline-block; width: 0px; height: 4.002em;"></span></span><span style="position: absolute; clip: rect(3.152em 1026.5em 4.353em -999.998em); top: 0.003em; left: 0em;"><span class="mo" id="MathJax-Span-31866" style="font-family: MathJax_Main;">⋅</span><span class="mi" id="MathJax-Span-31867" style="font-family: MathJax_Math-italic; padding-left: 0.202em;">w</span><span class="mi" id="MathJax-Span-31868" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31869" style="font-family: MathJax_Math-italic;">b</span><span class="mi" id="MathJax-Span-31870" style="font-family: MathJax_Math-italic;">w</span><span class="mi" id="MathJax-Span-31871" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-31872" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31873" style="font-family: MathJax_Math-italic;">k</span><span class="mo" id="MathJax-Span-31874" style="font-family: MathJax_Main; padding-left: 0.202em;">−</span><span class="mi" id="MathJax-Span-31875" style="font-family: MathJax_Math-italic; padding-left: 0.202em;">a</span><span class="mi" id="MathJax-Span-31876" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-31877" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-31878" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-31879" style="font-family: MathJax_Math-italic;">s</span><span class="mi" id="MathJax-Span-31880" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31881" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-31882" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-31883" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-31884" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31885" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-31886" style="font-family: MathJax_Math-italic;">f<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.053em;"></span></span><span class="mi" id="MathJax-Span-31887" style="font-family: MathJax_Math-italic;">F<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.102em;"></span></span><span class="mi" id="MathJax-Span-31888" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31889" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31890" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31891" style="font-family: MathJax_Math-italic;">m</span><span class="mi" id="MathJax-Span-31892" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-31893" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31894" style="font-family: MathJax_Math-italic;">k</span><span class="mi" id="MathJax-Span-31895" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31896" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31897" style="font-family: MathJax_Math-italic;">W<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.102em;"></span></span><span class="mi" id="MathJax-Span-31898" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31899" style="font-family: MathJax_Math-italic;">b</span><span class="mi" id="MathJax-Span-31900" style="font-family: MathJax_Math-italic;">W<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.102em;"></span></span><span class="mi" id="MathJax-Span-31901" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-31902" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31903" style="font-family: MathJax_Math-italic;">k</span><span class="mi" id="MathJax-Span-31904" style="font-family: MathJax_Math-italic;">U<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.102em;"></span></span><span class="mi" id="MathJax-Span-31905" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31906" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-31907" style="font-family: MathJax_Math-italic;">l</span><span class="mo" id="MathJax-Span-31908" style="font-family: MathJax_Main; padding-left: 0.202em;">⋅</span><span class="mi" id="MathJax-Span-31909" style="font-family: MathJax_Math-italic; padding-left: 0.202em;">a</span><span class="mi" id="MathJax-Span-31910" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-31911" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31912" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-31913" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-31914" style="font-family: MathJax_Math-italic;">n</span><span style="display: inline-block; width: 0px; height: 4.002em;"></span></span><span style="position: absolute; clip: rect(3.152em 1017.8em 4.353em -999.998em); top: 1.353em; left: 0em;"><span class="mo" id="MathJax-Span-31915" style="font-family: MathJax_Main;">−</span><span class="mi" id="MathJax-Span-31916" style="font-family: MathJax_Math-italic; padding-left: 0.202em;">t</span><span class="mi" id="MathJax-Span-31917" style="font-family: MathJax_Math-italic;">h</span><span class="mi" id="MathJax-Span-31918" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31919" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-31920" style="font-family: MathJax_Math-italic;">u</span><span class="mi" id="MathJax-Span-31921" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31922" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31923" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31924" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-31925" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31926" style="font-family: MathJax_Math-italic;">W<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.102em;"></span></span><span class="mi" id="MathJax-Span-31927" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31928" style="font-family: MathJax_Math-italic;">b</span><span class="mi" id="MathJax-Span-31929" style="font-family: MathJax_Math-italic;">W<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.102em;"></span></span><span class="mi" id="MathJax-Span-31930" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-31931" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-31932" style="font-family: MathJax_Math-italic;">k</span><span class="mi" id="MathJax-Span-31933" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-31934" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-31935" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31936" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-31937" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-31938" style="font-family: MathJax_Math-italic;">n</span><span class="mo" id="MathJax-Span-31939" style="font-family: MathJax_Main; padding-left: 0.202em;">⋅</span><span class="mi" id="MathJax-Span-31940" style="font-family: MathJax_Math-italic; padding-left: 0.202em;">e</span><span class="mi" id="MathJax-Span-31941" style="font-family: MathJax_Math-italic;">x</span><span class="mi" id="MathJax-Span-31942" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-31943" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31944" style="font-family: MathJax_Math-italic;">p</span><span class="mi" id="MathJax-Span-31945" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31946" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-31947" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-31948" style="font-family: MathJax_Math-italic;">n</span><span style="display: inline-block; width: 0px; height: 4.002em;"></span></span><span style="position: absolute; clip: rect(3.152em 1014.55em 4.353em -999.998em); top: 2.652em; left: 0em;"><span class="mo" id="MathJax-Span-31949" style="font-family: MathJax_Main;">−</span><span class="mi" id="MathJax-Span-31950" style="font-family: MathJax_Math-italic; padding-left: 0.202em;">o</span><span class="mi" id="MathJax-Span-31951" style="font-family: MathJax_Math-italic;">p</span><span class="mi" id="MathJax-Span-31952" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31953" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-31954" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-31955" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-31956" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-31957" style="font-family: MathJax_Math-italic;">l</span><span class="mi" id="MathJax-Span-31958" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31959" style="font-family: MathJax_Math-italic;">h</span><span class="mi" id="MathJax-Span-31960" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31961" style="font-family: MathJax_Math-italic;">E<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.053em;"></span></span><span class="mi" id="MathJax-Span-31962" style="font-family: MathJax_Math-italic;">x</span><span class="mi" id="MathJax-Span-31963" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-31964" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31965" style="font-family: MathJax_Math-italic;">p</span><span class="mi" id="MathJax-Span-31966" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31967" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-31968" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-31969" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-31970" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-31971" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-31972" style="font-family: MathJax_Math-italic;">s</span><span class="mi" id="MathJax-Span-31973" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31974" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-31975" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-31976" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-31977" style="font-family: MathJax_Math-italic;">e</span><span class="mo" id="MathJax-Span-31978" style="font-family: MathJax_Main;">,</span><span style="display: inline-block; width: 0px; height: 4.002em;"></span></span><span style="position: absolute; clip: rect(3.052em 1027.95em 4.353em -999.998em); top: 4.103em; left: 0em;"><span class="mi" id="MathJax-Span-31979" style="font-family: MathJax_Math-italic; padding-left: 0.152em;">i</span><span class="mi" id="MathJax-Span-31980" style="font-family: MathJax_Math-italic;">f<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.053em;"></span></span><span class="mi" id="MathJax-Span-31981" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-31982" style="font-family: MathJax_Math-italic;">h</span><span class="mi" id="MathJax-Span-31983" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31984" style="font-family: MathJax_Math-italic;">v</span><span class="mi" id="MathJax-Span-31985" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-31986" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31987" style="font-family: MathJax_Math-italic;">w</span><span class="mi" id="MathJax-Span-31988" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-31989" style="font-family: MathJax_Math-italic;">s</span><span class="mi" id="MathJax-Span-31990" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-31991" style="font-family: MathJax_Math-italic;">J<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.102em;"></span></span><span class="mi" id="MathJax-Span-31992" style="font-family: MathJax_Math-italic;">S<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.053em;"></span></span><span class="mi" id="MathJax-Span-31993" style="font-family: MathJax_Math-italic;">P<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.102em;"></span></span><span class="mi" id="MathJax-Span-31994" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31995" style="font-family: MathJax_Math-italic;">x</span><span class="mi" id="MathJax-Span-31996" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-31997" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-31998" style="font-family: MathJax_Math-italic;">p</span><span class="mi" id="MathJax-Span-31999" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-32000" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-32001" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-32002" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-32003" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-32004" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-32005" style="font-family: MathJax_Math-italic;">S<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.053em;"></span></span><span class="mi" id="MathJax-Span-32006" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-32007" style="font-family: MathJax_Math-italic;">r</span><span class="mi" id="MathJax-Span-32008" style="font-family: MathJax_Math-italic;">v</span><span class="mi" id="MathJax-Span-32009" style="font-family: MathJax_Math-italic;">l</span><span class="mi" id="MathJax-Span-32010" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-32011" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-32012" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-32013" style="font-family: MathJax_Math-italic;">x</span><span class="mi" id="MathJax-Span-32014" style="font-family: MathJax_Math-italic;">c</span><span class="mi" id="MathJax-Span-32015" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-32016" style="font-family: MathJax_Math-italic;">p</span><span class="mi" id="MathJax-Span-32017" style="font-family: MathJax_Math-italic;">t</span><span class="mi" id="MathJax-Span-32018" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-32019" style="font-family: MathJax_Math-italic;">o</span><span class="mi" id="MathJax-Span-32020" style="font-family: MathJax_Math-italic;">n</span><span class="mi" id="MathJax-Span-32021" style="font-family: MathJax_Math-italic;">v</span><span class="mi" id="MathJax-Span-32022" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-32023" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-32024" style="font-family: MathJax_Math-italic;">w</span><span class="mi" id="MathJax-Span-32025" style="font-family: MathJax_Math-italic;">v</span><span class="mi" id="MathJax-Span-32026" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-32027" style="font-family: MathJax_Math-italic;">e</span><span class="mi" id="MathJax-Span-32028" style="font-family: MathJax_Math-italic;">w</span><span class="texatom" id="MathJax-Span-32029"><span class="mrow" id="MathJax-Span-32030"><span class="mo" id="MathJax-Span-32031"><span style="font-family: STIXGeneral, "Arial Unicode MS", serif; font-size: 80%; font-style: normal; font-weight: normal;">中</span></span></span></span><span class="texatom" id="MathJax-Span-32032"><span class="mrow" id="MathJax-Span-32033"><span class="mo" id="MathJax-Span-32034"><span style="font-family: STIXGeneral, "Arial Unicode MS", serif; font-size: 80%; font-style: normal; font-weight: normal;">值</span></span></span></span><span class="texatom" id="MathJax-Span-32035"><span class="mrow" id="MathJax-Span-32036"><span class="mo" id="MathJax-Span-32037"><span style="font-family: STIXGeneral, "Arial Unicode MS", serif; font-size: 80%; font-style: normal; font-weight: normal;">的</span></span></span></span><span class="texatom" id="MathJax-Span-32038"><span class="mrow" id="MathJax-Span-32039"><span class="mo" id="MathJax-Span-32040"><span style="font-family: STIXGeneral, "Arial Unicode MS", serif; font-size: 80%; font-style: normal; font-weight: normal;">搜</span></span></span></span><span class="texatom" id="MathJax-Span-32041"><span class="mrow" id="MathJax-Span-32042"><span class="mo" id="MathJax-Span-32043"><span style="font-family: STIXGeneral, "Arial Unicode MS", serif; font-size: 80%; font-style: normal; font-weight: normal;">索</span></span></span></span><span class="texatom" id="MathJax-Span-32044"><span class="mrow" id="MathJax-Span-32045"><span class="mo" id="MathJax-Span-32046"><span style="font-family: STIXGeneral, "Arial Unicode MS", serif; font-size: 80%; font-style: normal; font-weight: normal;">顺</span></span></span></span><span class="texatom" id="MathJax-Span-32047"><span class="mrow" id="MathJax-Span-32048"><span class="mo" id="MathJax-Span-32049"><span style="font-family: STIXGeneral, "Arial Unicode MS", serif; font-size: 80%; font-style: normal; font-weight: normal;">序</span></span></span></span><span style="display: inline-block; width: 0px; height: 4.002em;"></span></span></span></span><span style="display: inline-block; width: 0px; height: 10.103em;"></span></span></span><span style="display: inline-block; overflow: hidden; vertical-align: -10.434em; border-left: 0px solid; width: 0px; height: 11.503em;"></span></span> <span class="MJX_Assistive_MathML"> r e q 来 打 印 r e q 对 象 · r e q − t h e c u r r e n t H t t p S e r v l e t R e q u e s t · r e s − t h e c u r r e n t H t t p S e r v l e t R e s p o n s e · s t a c k − t h e c u r r e n t O g n l V a l u e S t a c k · o g n l − t h e O g n l T o o l i n s t a n c e · w e b w o r k − a n i n s t a n c e o f F r e e m a r k e r W e b W o r k U t i l · a c t i o n − t h e c u r r e n t W e b W o r k a c t i o n · e x c e p t i o n − o p t i o n a l t h e E x c e p t i o n i n s t a n c e , i f t h e v i e w i s a J S P e x c e p t i o n o r S e r v l e t e x c e p t i o n v i e w v i e w 中 值 的 搜 索 顺 序 </span></span>{name}将会以下面的顺序查找name值 <br> · freemarker variables <br> · value stack <br> · request attributes <br> · session attributes <br> · servlet context attributes <br> 在模板里ftl里使用标签 <br> 注意,如果标签的属性值是数字,那么必须采用nubmer=123方式给属性赋值 <br> JSP页面 <br> <code><%@page contentType="text/html;charset=ISO-8859-2" language="java"%></code> <br> <code><%@taglib uri="/WEB-INF/struts-html.tld" prefix="html"%></code> <br> <code><%@taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%></code> <br> <code></code> <br> <code><html></code> <br> <code><body></code> <br> <code><h1><bean:message key="welcome.title"/></h1></code> <br> <code><html:errors/></code> <br> <code><html:form action="/query"></code> <br> <code>Keyword: <html:text property="keyword"/><br></code> <br> <code>Exclude: <html:text property="exclude"/><br></code> <br> <code><html:submit value="Send"/></code> <br> <code></html:form></code> <br> <code></body></code> <br> <code></html></code> <br> 模板ftl页面 <br> <code><#assign html=JspTaglibs["/WEB-INF/struts-html.tld"]></code> <br> <code><#assign bean=JspTaglibs["/WEB-INF/struts-bean.tld"]></code> <br> <code></code> <br> <code><html></code> <br> <code><body></code> <br> <code><h1><@bean.message key="welcome.title"/></h1></code> <br> <code><@html.errors/></code> <br> <code><@html.form action="/query"></code> <br> <code>Keyword: <@html.text property="keyword"/><br></code> <br> <code>Exclude: <@html.text property="exclude"/><br></code> <br> <code><@html.submit value="Send"/></code> <br> <code></@html.form></code> <br> <code></body></code> <br> <code></html></code></p> <p>如何初始化共享变量 <br> 1. 初始化全局共享数据模型 <br> freemark在web上使用的时候对共享数据的初始化支持的不够,不能在配置初始化的时候实现,而必须通过ftl文件来初始化全局变量。这是不能满主需求的,我们需要在servlet init的时候留出一个接口来初始化系统的共享数据 <br> 具体到和webwork整合,因为本身webwork提供了整合servlet,如果要增加全局共享变量,可以通过修改 com.opensymphony.webwork.views.freemarker.FreemarkerServlet来实现,我们可以在这个 servlet初始化的时候来初始化全局共享变量 <br> 与webwork整合配置 <br> 配置web.xml <br> <code><servlet></code> <br> <code><servlet-name>freemarker</servlet-name></code> <br> <code><servlet-class>com.opensymphony.webwork.views.freemarker.FreemarkerServlet</servlet-class></code> <br> <code><init-param></code> <br> <code><param-name>TemplatePath</param-name></code> <br> <code><param-value>/</param-value></code> <br> <code><!—模板载入文件夹,这里相对context root,递归获取该文件夹下的所有模板--></code> <br> <code></init-param></code> <br> <code><init-param></code> <br> <code><param-name>NoCache</param-name> <!—是否对模板缓存--></code> <br> <code><param-value>true</param-value></code> <br> <code></init-param></code> <br> <code><init-param></code> <br> <code><param-name>ContentType</param-name></code> <br> <code><param-value>text/html</param-value></code> <br> <code></init-param></code> <br> <code><init-param></code> <br> <code><param-name>template_update_delay</param-name></code> <br> <code><!—模板更新时间,0表示每次都更新,这个适合开发时候--></code> <br> <code><param-value>0</param-value></code> <br> <code></init-param></code> <br> <code><init-param></code> <br> <code><param-name>default_encoding</param-name></code> <br> <code><param-value>GBK</param-value></code> <br> <code></init-param></code> <br> <code><init-param></code> <br> <code><param-name>number_format</param-name></code> <br> <code><param-value>0.##########</param-value><!—数字显示格式--></code> <br> <code></init-param></code> <br> <code><load-on-startup>1</load-on-startup></code> <br> <code></servlet></code> <br> <code><servlet-mapping></code> <br> <code><servlet-name>freemarker</servlet-name></code> <br> <code><url-pattern>*.ftl</url-pattern></code> <br> <code></servlet-mapping></code></p> <p>5高级方法 <br> 自定义方法 <br> <code>${timer("yyyy-MM-dd H:mm:ss", x)}</code> <br> <code>${timer("yyyy-MM-dd ", x)}</code></p> <p>在模板中除了可以通过对象来调用方法外<code>(${object.methed(args)})</code>也可以直接调用java实现的方法,java类必须实现接口TemplateMethodModel的方法exec(List args). 下面以把毫秒的时间转换成按格式输出的时间为例子 <br> <code>public class LongToDate implements TemplateMethodModel {</code> <br> <code></code> <br> <code>public TemplateModel exec(List args) throws TemplateModelException {</code> <br> <code>SimpleDateFormat mydate = new SimpleDateFormat((String) args.get(0)));</code> <br> <code>return mydate.format(new Date(Long.parseLong((String)args.get(1)));</code> <br> <code>}</code> <br> <code>}</code> <br> 将LongToDate对象放入到数据模型中 <br> <code>root.put("timer", new IndexOfMethod());</code> <br> ftl模板里使用 <br> <code><#assign x = "123112455445"></code> <br> <code>${timer("yyyy-MM-dd H:mm:ss", x)}</code> <br> <code>${timer("yyyy-MM-dd ", x)}</code></p> <p>输出 <br> 2001-10-12 5:21:12 <br> 2001-10-12 </p> <p>自定义 Transforms <br> 实现自定义的<code><@transform></code>文本或表达式<code></@transform></code>的功能,允许对中间的最终文本进行解析转换 </p> <p>例子:实现<code><@upcase>str</@upcase></code> 将str转换成STR 的功能 </p> <p>代码如下: <br> <code>import java.io.*;</code> <br> <code>import java.util.*;</code> <br> <code>import freemarker.template.TemplateTransformModel;</code> <br> <code></code> <br> <code>class UpperCaseTransform implements TemplateTransformModel {</code> <br> <code></code> <br> <code>public Writer getWriter(Writer out, Map args) {</code> <br> <code>return new UpperCaseWriter(out);</code> <br> <code>}</code> <br> <code></code> <br> <code>private class UpperCaseWriter extends Writer {</code> <br> <code></code> <br> <code>private Writer out;</code> <br> <code></code> <br> <code>UpperCaseWriter (Writer out) {</code> <br> <code>this.out = out;</code> <br> <code>}</code> <br> <code></code> <br> <code>public void write(char[] cbuf, int off, int len)</code> <br> <code>throws IOException {</code> <br> <code>out.write(new String(cbuf, off, len).toUpperCase());</code> <br> <code>}</code> <br> <code></code> <br> <code>public void flush() throws IOException {</code> <br> <code>out.flush();</code> <br> <code>}</code> <br> <code></code> <br> <code>public void close() {</code> <br> <code>}</code> <br> <code>}</code> <br> <code>}</code> <br> 然后将此对象put到数据模型中 <br> root.put(“upcase”, new UpperCaseTransform());</p> <p>在view(ftl)页面中可以如下方式使用 </p> <pre><code><@upcase> hello world </@upcase> </code></pre> <p>打印输出: <br> HELLO WORLD</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1290001633337483264"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(freemarker)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1833387248733745152.htm" title="freemarker模板学习笔记" target="_blank">freemarker模板学习笔记</a> <span class="text-muted">tryCbest</span> <a class="tag" taget="_blank" href="/search/freemarker/1.htm">freemarker</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a> <div>文章目录freemarker常用指令if-elseif-else指令switch,case,default,break指令list,else,items,sep,break指令指令语法指令指令指令指令include指令基础知识带*的pathimport指令assign指令自定义指令参数嵌套内容宏和循环变量freemarker内置函数字符串内置函数数字内置函数哈希表内置函数序列内置函数循环变量内置函</div> </li> <li><a href="/article/1827160981629923328.htm" title="Struts2中的action中result中的type有哪些类型" target="_blank">Struts2中的action中result中的type有哪些类型</a> <span class="text-muted">阿立聊代码</span> <a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a><a class="tag" taget="_blank" href="/search/struts2.0/1.htm">struts2.0</a> <div>Struts2框架默认配置中已经提供了很多的result类型,可以打开struts-default.xml配置文件来查看。chain:Action链式处理的结果类型,也就是将结果转发到这个action中。chart:整合JFreeChart的结果类型dispatcher:用于整合JSP的结果类型freemarker:用于整合freemarker结果类型。httpheader:用于控制特殊的HTTP</div> </li> <li><a href="/article/1771792452601053184.htm" title="[套路] 浏览器引入Vue.js场景-WangEditor富文本编辑器的使用 (永久免费)" target="_blank">[套路] 浏览器引入Vue.js场景-WangEditor富文本编辑器的使用 (永久免费)</a> <span class="text-muted">Grandpa_Rick</span> <a class="tag" taget="_blank" href="/search/%E5%A5%97%E8%B7%AF/1.htm">套路</a><a class="tag" taget="_blank" href="/search/front/1.htm">front</a><a class="tag" taget="_blank" href="/search/end/1.htm">end</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/wangEditor/1.htm">wangEditor</a> <div>系列文章目录[套路]el-table多选属性实现单选效果[套路]基于服务内存实现的中文拼音混合查询[套路]Bypass滑块验证码目录系列文章目录前言一、实现1.1场景1.2Window对象简介1.3引入WangEditor1.4页面配置前言公司使用freemarker的老旧SpringBootWeb后台项目,前两年通过浏览器引入js的方式使用Vue简单升级了下,方便迭代功能.近期一个很简单的功能需</div> </li> <li><a href="/article/1759614945370140672.htm" title="Eureka 集群启动报错" target="_blank">Eureka 集群启动报错</a> <span class="text-muted">hello_zzw</span> <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Eureka/1.htm">Eureka</a> <div>Eureka集群启动时,页面出现如下错误提示FreeMarkertemplateerror(DEBUGmode;useRETHROWinproduction!):Thefollowinghasevaluatedtonullormissing:==>replica.key[intemplate"eureka/navbar.ftl"atline68,column62]----Tip:It'sthest</div> </li> <li><a href="/article/1759573664543633408.htm" title="【Java】电子凭证-Java生成PDF" target="_blank">【Java】电子凭证-Java生成PDF</a> <span class="text-muted">hkk666123</span> <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/HTML/1.htm">HTML</a><a class="tag" taget="_blank" href="/search/%E8%BD%AC/1.htm">转</a><a class="tag" taget="_blank" href="/search/PDF/1.htm">PDF</a><a class="tag" taget="_blank" href="/search/htmlTOPDF/1.htm">htmlTOPDF</a> <div>文章目录背景实现思路技术方案图TemplateEngines(模板引擎)`Thymeleaf``ApacheFreemarker``GroovyTemplates``velocity``HTMLTOPDF`技术各实现对比表WKhtmlTOpdfiTextPhantomJS技术核心:HTML生成PDF背景在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等。方</div> </li> <li><a href="/article/1759573665437020160.htm" title="HTML生成PDF模板(Java iText+FreeMarker生成PDF(HTML转PDF))" target="_blank">HTML生成PDF模板(Java iText+FreeMarker生成PDF(HTML转PDF))</a> <span class="text-muted">慕天蓝</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/xpdf/1.htm">xpdf</a><a class="tag" taget="_blank" href="/search/itext/1.htm">itext</a><a class="tag" taget="_blank" href="/search/freemarker/1.htm">freemarker</a> <div>JavaiText+FreeMarker生成PDF(HTML转PDF)1.背景在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等。方便用户查看,下载,打印。目前常用的解决方案是,把相关数据信息,生成对应的pdf文件返回给用户。本文源码:http://git.oschina.net/lujianing/java_pdf_demo2.iTextiText是著名</div> </li> <li><a href="/article/1759433524378677248.htm" title="java web 前端开发框架和流程" target="_blank">java web 前端开发框架和流程</a> <span class="text-muted">韩大帅666</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>1通常JavaWeb开发框架举个例子,对于广告系统的来说,我们先不管一些job,CACHE,config...这些优化,些框架和分层可以是这样的,MVC的技术选型:V:FreeMarkervsJSP/VelocityC:SpringMVCvsStruts/WebworkM:SPRING/JPA/HibernatevsiBatis2前端V的架构前端开发刚兴起的阶段,前端开发人员的工作经常穿插在后端开</div> </li> <li><a href="/article/1757955135679512576.htm" title="freemarker" target="_blank">freemarker</a> <span class="text-muted">一+一加1</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/cloud/1.htm">cloud</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>一、快速入门(一)、创建工程freemarker-demo引入依赖org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-freemarkerorg.springframework.bootspring-boot-starter-testorg.projectlombokl</div> </li> <li><a href="/article/1757926916267982848.htm" title="用maven配置springboot+freemarker" target="_blank">用maven配置springboot+freemarker</a> <span class="text-muted">weixin_30915951</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>1.创建项目直接点下一步原因:不勾选Createfromarchetype,是项目创建的骨架的时候,由于不知道什么原因就卡住了,一直在刷新2.创建之后完成之后添加依赖org.springframework.bootspring-boot-starter-parent1.3.5.RELEASEorg.springframework.bootspring-boot-starterorg.springf</div> </li> <li><a href="/article/1757926020243013632.htm" title="maven创建webapp+Freemarker组件的实现" target="_blank">maven创建webapp+Freemarker组件的实现</a> <span class="text-muted">诗句藏于尽头</span> <a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a><a class="tag" taget="_blank" href="/search/web/1.htm">web</a><a class="tag" taget="_blank" href="/search/app/1.htm">app</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>下载安装配置mavenMaven官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘123云盘为您提供Maven最新版正式版官方版绿色版下载,Maven安卓版手机版apk免费下载安装到手机,支持电脑端一键快捷安装https://www.123pan.com/s/9QRqVv-TcUY.html链接为3.6.2-3.6.3的版本下载解压其中一个版本开始配置环境变量%MAVEN_HOME%找到对</div> </li> <li><a href="/article/1755889283459203072.htm" title="SpringBoot使用freemarker动态生成word文档" target="_blank">SpringBoot使用freemarker动态生成word文档</a> <span class="text-muted">Spirit_NKlaus</span> <a class="tag" taget="_blank" href="/search/SpringBoot/1.htm">SpringBoot</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>最近做项目有个需求,在动态生成word文档的同时插入电子签名图片,这里使用freemarker来实现。首先引入freemarker依赖:org.freemarkerfreemarker2.3.28首先模板要自己先画好,打开word自己制作一个模板:然后将它另存为xml,修改相关内容后再另存为ftl文件,这样就可以使用了(抓取重要的几个部分)//如果想要打出多个要是用list标签....//文字部分</div> </li> <li><a href="/article/1755679764368080896.htm" title="maven java 如何打纯源码zip包" target="_blank">maven java 如何打纯源码zip包</a> <span class="text-muted">程序男</span> <a class="tag" taget="_blank" href="/search/java%E5%9F%BA%E7%A1%80%E4%B8%93%E9%A2%98/1.htm">java基础专题</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E4%B8%93%E9%A2%98/1.htm">软件工程专题</a><a class="tag" taget="_blank" href="/search/git%26amp%3Bmaven/1.htm">git&maven</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a><a class="tag" taget="_blank" href="/search/pycharm/1.htm">pycharm</a> <div>一、背景打纯源码包给第三方进行安全漏洞扫描二、maven插件项目中加入下面的maven插件maven-source-plugin2.4true*.propertiesfreemarker/*.ftlmapper/*.xmlwebapp/*.xmllicense/*.*compilejar三、使用步骤3.1产出源码jar包ideamaven执行cleancompile命令在target目录下找到*-</div> </li> <li><a href="/article/1755547413398962176.htm" title="SpringBoot02" target="_blank">SpringBoot02</a> <span class="text-muted">建国同学</span> <div>复习@Component启动时,会加载贴了该注解的类instanceof:判断是否是该对象的实例一、集成freemarkerspring.freemarker.prefix:加载模板时候的前缀404:没添加依赖,前后缀spring.freemarker.settings.number_format=0.##数字格式不用逗号隔开配置配置freemarker模板Enable_LiveTemplates</div> </li> <li><a href="/article/1755145468851011584.htm" title="FreeMarker 字符替换,插值 ${} ${!}空值处理 ${?}" target="_blank">FreeMarker 字符替换,插值 ${} ${!}空值处理 ${?}</a> <span class="text-muted">kfepiza</span> <a class="tag" taget="_blank" href="/search/JAVA/1.htm">JAVA</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Spring/1.htm">Spring</a><a class="tag" taget="_blank" href="/search/Spingboot/1.htm">Spingboot</a><a class="tag" taget="_blank" href="/search/SpringCould/1.htm">SpringCould</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>FreeMarker字符替换,插值${}${!}空值处理${?}${}${属性名}可用于取值在Spring中可在请求方法中将值放入HttpServletRequest,Model,ModelMap,ModeAndView中,其中HttpServletRequest,Model,ModelMap可以注入,ModeAndView要自己new注入的Model和ModelMap实例相等==,是同一个实例例</div> </li> <li><a href="/article/1754938329490538496.htm" title="【黑马头条之对象存储服务MinIO】" target="_blank">【黑马头条之对象存储服务MinIO】</a> <span class="text-muted">蛋饼吧</span> <a class="tag" taget="_blank" href="/search/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/1.htm">黑马头条</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>本笔记内容为黑马头条项目的对象存储服务MinIO部分目录一、MinIO简介二、MinIO特点三、开箱使用1、安装启动2、管理控制台四、快速入门1、创建工程,导入pom依赖五、封装MinIO为starter1、创建模块heima-file-starter2、配置类3、封装操作minIO类4、对外加入自动配置5、其他微服务使用五、结合freemarker实现文章详情功能1.需求分析2、实现方案3、实现</div> </li> <li><a href="/article/1754938201216139264.htm" title="黑马头条-day02" target="_blank">黑马头条-day02</a> <span class="text-muted">己不由心王道长</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>文章目录前言一、文章列表加载1.1需求分析1.2表结构分析1.3导入文章数据库1.4实现思路1.5接口定义1.6功能实现二、freemarker2.1freemarker简介2.2环境搭建&&快速入门2.2.1创建测试工程2.3freemarker基础2.3.1基础语法种类2.3.2集合指令2.3.3if指令2.3.4运算符2.3.5空值处理2.3.6内建函数三、对象存储服务MinIO3.1Min</div> </li> <li><a href="/article/1754827222276915200.htm" title="Java 导出word和pdf_Java实现word导出与pdf导出" target="_blank">Java 导出word和pdf_Java实现word导出与pdf导出</a> <span class="text-muted">lihahamiao</span> <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/%E5%AF%BC%E5%87%BAword%E5%92%8Cpdf/1.htm">导出word和pdf</a> <div>实现PDF导出org.freemarkerfreemarker2.3.201、ftl文件是放在了webapp下的WEB-INF/views/ftl下2、图片是存放在webapp下的images中3、路径是为了方便找文件图片。为什么没有放在views下?是因为有在做pdf时需要用到这里的链接访问图片,因为程序是web端的,路径直接获取的绝对路径。4、访问程序为@RequestMapping(valu</div> </li> <li><a href="/article/1754826966457925632.htm" title="word导出手机端乱码或者打不开解决办法" target="_blank">word导出手机端乱码或者打不开解决办法</a> <span class="text-muted">Java大表哥</span> <a class="tag" taget="_blank" href="/search/JAVA/1.htm">JAVA</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E4%B8%AD%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98/1.htm">开发中遇到的问题</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/poi/1.htm">poi</a><a class="tag" taget="_blank" href="/search/freemarker/1.htm">freemarker</a><a class="tag" taget="_blank" href="/search/%E5%AF%BC%E5%87%BAword/1.htm">导出word</a> <div>word导出手机端乱码或者打不开解决办法文章目录word导出手机端乱码或者打不开解决办法**前言:****先看之前的两种方式导出word:**1.[freemarker模板导出word循环图片表格详细教程](https://mp.csdn.net/editor/html/106714402)2.[freemarker模板导出带表格word详细教程](https://mp.csdn.net/edit</div> </li> <li><a href="/article/1754575209630810112.htm" title="thymeleaf 模板使用" target="_blank">thymeleaf 模板使用</a> <span class="text-muted">阿__飞</span> <div>1.导入依赖2.配置模板,开发一般关闭模板缓存#解决模板校验问题spring.thymeleaf.mode=LEGACYHTML5#thymeleaf模板引擎配置#关闭模板缓存spring.thymeleaf.cache=false#模板编码spring.thymeleaf.encoding=UTF-8#freemarker模板引擎配置spring.freemarker.cache=false#模</div> </li> <li><a href="/article/1754523263419039744.htm" title="java生成word文档" target="_blank">java生成word文档</a> <span class="text-muted">威峰</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/word/1.htm">word</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>1.生成文件思路①通过freemarker模板生成文件②根据要生成的word文档,再需要变的数据上改写为变量名,并转存为xml格式1.1如下是要生成的文档样例数据1.2转换为变量名如下1.3生成xml转存文件然后选择xml③组装业务数据④生成文件2.开始写代码①先加入依赖包可以自己下载(我这里是maven配置,在pom文件添加需要的依赖)②编写加载模板方法③导入模板,把刚刚生成的xml文件改为.f</div> </li> <li><a href="/article/1754322363106738176.htm" title="解决springboot项目中后端导出excel表格(freemarker模板)报错" target="_blank">解决springboot项目中后端导出excel表格(freemarker模板)报错</a> <span class="text-muted">周夫子</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>解决springboot项目中后端导出excel表格(freemarker模板)报错1、后端代码部分controller:导出工具类中涉及的方法1:导出工具类中涉及的方法2:2、导出excel表格的模板位置(freemarker模板)模板部分代码(导出内容太多,就不展示全部代码了,如有需要可自行查阅百度!):3、导出后报错内容如下报错位置:正确代码:总结:不加"!",如果无数据导出时,会报错,加上</div> </li> <li><a href="/article/1754286883266904064.htm" title="freemark的使用" target="_blank">freemark的使用</a> <span class="text-muted">二小姐诶</span> <a class="tag" taget="_blank" href="/search/SpringBoot%E7%9B%B8%E5%85%B3/1.htm">SpringBoot相关</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a> <div>freemark最常用的应用于发送邮件模板变量的替换,存储的模板格式为html格式发送邮件时需要预先设置好.ftl模板,并且调整好格式,模板里面的变量以${}标识需要导入依赖org.springframework.bootspring-boot-starter-freemarker创建一个freemark工具类packagecom.example.common.util;importcn.huto</div> </li> <li><a href="/article/1754286371104636928.htm" title="使用freemarker和itextpdf结合,将html转化为pdf" target="_blank">使用freemarker和itextpdf结合,将html转化为pdf</a> <span class="text-muted">二小姐诶</span> <a class="tag" taget="_blank" href="/search/SpringBoot%E7%9B%B8%E5%85%B3/1.htm">SpringBoot相关</a><a class="tag" taget="_blank" href="/search/Java%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/1.htm">Java后端开发</a><a class="tag" taget="_blank" href="/search/pdf/1.htm">pdf</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div>工作中遇到模板中的html,需要转化成pdf作为附件上传到系统于是经过研究分析,得出用freemarker和itextpdf结合maven需要导入包:org.springframework.bootspring-boot-starter-freemarkercom.itextpdfitextpdf${itextpdf.version}com.itextpdf.toolxmlworker5.5.8c</div> </li> <li><a href="/article/1753886887988183040.htm" title="解决SpringBoot jar包中的文件读取问题" target="_blank">解决SpringBoot jar包中的文件读取问题</a> <span class="text-muted">wuxiaopengnihao1</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/jar/1.htm">jar</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>前言SpringBoot微服务已成为业界主流,从开发到部署都非常省时省力,但是最近小明开发时遇到一个问题:在代码中读取资源文件(比如word文档、导出模版等),本地开发时可以正常读取,但是,当我们打成jar包发布到服务器后,再次执行程序时就会抛出找不到文件的异常。背景这个问题是在一次使用freemarker模版引擎导出word报告时发现的。大概说一下docx导出java实现思路:导出word的文档</div> </li> <li><a href="/article/1753671439958949888.htm" title="【SpringBoot】application配置文件(4)" target="_blank">【SpringBoot】application配置文件(4)</a> <span class="text-muted">freedomSTUDENT</span> <a class="tag" taget="_blank" href="/search/SpringBoot/1.htm">SpringBoot</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>freemarker:cache:false这是关于freemarker模板引擎的一个配置,用于控制模板的缓存行为当cache设置为false时,意味着每次请求时都会重新加载和编译模板,而不是从缓存中获取编译模板。将cache设置为false是为了在开发过程中获得最新的模板内容,而不是使用缓存中的旧版本。在生产环境中,为了提高性能,通常会将cache设置为true,这样Freemarker会缓存已</div> </li> <li><a href="/article/1753633452348948480.htm" title="freemarker 格式化时间 出现空值问题" target="_blank">freemarker 格式化时间 出现空值问题</a> <span class="text-muted">my_interface</span> <div>${a.datetime}当输出datetime数据时,如果datetime为null系统将报异常;因此需要在后面加一个!用于设置默认值${a.datetime!'无数据'}或${a.datetime!}当进行时间格式化处理时${a.datetime?string('yyyy')}需要将前面的内容用()括起来才可以使用!如${(a.datetime?string('yyyy'))!'无数据'}或$</div> </li> <li><a href="/article/1752894583810834432.htm" title="使用freemarker 对数据进行导入导出生成excel报表" target="_blank">使用freemarker 对数据进行导入导出生成excel报表</a> <span class="text-muted">3分钟秒懂大数据</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/freemarker/1.htm">freemarker</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%AF%BC%E5%85%A5%E5%AF%BC%E5%87%BA/1.htm">数据导入导出</a> <div>对于导入导出这个功能,真的是研究了好久,最后终于学会使用。现在讲导入导出的具体操作方法进行整理,方便以后使用。我所做的web项目使用的框架是springboot+shiro+mybatis+layui+jsp现在先看看项目架构是如何搭建:首先先建好entity、dao、service、serviceImpl、controller、common、architect等包名现在先进行导出操作:1在pom</div> </li> <li><a href="/article/1752741276865806336.htm" title="使用freemarker生成复杂的excel表格" target="_blank">使用freemarker生成复杂的excel表格</a> <span class="text-muted">龙哥哥_码畜</span> <div>转载至https://blog.csdn.net/u010172714/article/details/72627764,从CSDN转移到这里了。首先这个idea和做法是来自于这位大哥的http://blog.csdn.net/u010722643/article/details/41732607我在公司的开发上运用了这一套,然后+上了自己的一些内容,所以希望大家如果要学习或了解原理的话,还是看看</div> </li> <li><a href="/article/1752687775116705792.htm" title="2018-08-06-Struts2 Freemarker tags 远程代码执行漏洞(S2-053)" target="_blank">2018-08-06-Struts2 Freemarker tags 远程代码执行漏洞(S2-053)</a> <span class="text-muted">最初的美好_kai</span> <div>1.漏洞描述:漏洞名称:Struts2Freemarkertags远程代码执行漏洞(S2-053)漏洞CVE编号:CVE-2017-12611漏洞影响版本:Struts2.0.1-Struts2.3.33,Struts2.5-Struts2.5.102.漏洞环境搭建:首先拉取镜像到本地,如下:dockerpullmedicean/vulapps:s_struts2_s2-053图一拉取完成以后启动</div> </li> <li><a href="/article/1752387147534450688.htm" title="JeecgBoot jmreport/loadTableData RCE漏洞复现(CVE-2023-41544)" target="_blank">JeecgBoot jmreport/loadTableData RCE漏洞复现(CVE-2023-41544)</a> <span class="text-muted">OidBoy_G</span> <a class="tag" taget="_blank" href="/search/%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/1.htm">漏洞复现</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a> <div>0x01产品简介JeecgBoot(或者称为Jeecg-Boot)是一款基于代码生成器的开源企业级快速开发平台,专注于开发后台管理系统、企业信息管理系统(MIS)等应用。它提供了一系列工具和模板,帮助开发者快速构建和部署现代化的Web应用程序。0x02漏洞概述JeecgBootjmreport/loadTableData接口存在FreeMarkerSSTI注入漏洞,攻击者可以通过操纵应用程序的模板</div> </li> <li><a href="/article/126.htm" title="插入表主键冲突做更新" target="_blank">插入表主键冲突做更新</a> <span class="text-muted">a-john</span> <div>有以下场景: 用户下了一个订单,订单内的内容较多,且来自多表,首次下单的时候,内容可能会不全(部分内容不是必须,出现有些表根本就没有没有该订单的值)。在以后更改订单时,有些内容会更改,有些内容会新增。 问题: 如果在sql语句中执行update操作,在没有数据的表中会出错。如果在逻辑代码中先做查询,查询结果有做更新,没有做插入,这样会将代码复杂化。 解决: mysql中提供了一个sql语</div> </li> <li><a href="/article/253.htm" title="Android xml资源文件中@、@android:type、@*、?、@+含义和区别" target="_blank">Android xml资源文件中@、@android:type、@*、?、@+含义和区别</a> <span class="text-muted">Cb123456</span> <a class="tag" taget="_blank" href="/search/%40%2B/1.htm">@+</a><a class="tag" taget="_blank" href="/search/%40/1.htm">@</a><a class="tag" taget="_blank" href="/search/%3F/1.htm">?</a><a class="tag" taget="_blank" href="/search/%40*/1.htm">@*</a> <div>一.@代表引用资源 1.引用自定义资源。格式:@[package:]type/name android:text="@string/hello"   2.引用系统资源。格式:@android:type/name     android:textColor="@android:color/opaque_red"</div> </li> <li><a href="/article/380.htm" title="数据结构的基本介绍" target="_blank">数据结构的基本介绍</a> <span class="text-muted">天子之骄</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E6%95%A3%E5%88%97%E8%A1%A8/1.htm">散列表</a><a class="tag" taget="_blank" href="/search/%E6%A0%91%E3%80%81%E5%9B%BE/1.htm">树、图</a><a class="tag" taget="_blank" href="/search/%E7%BA%BF%E6%80%A7%E7%BB%93%E6%9E%84/1.htm">线性结构</a><a class="tag" taget="_blank" href="/search/%E4%BB%B7%E6%A0%BC%E6%A0%87%E7%AD%BE/1.htm">价格标签</a> <div>数据结构的基本介绍 数据结构就是数据的组织形式,用一种提前设计好的框架去存取数据,以便更方便,高效的对数据进行增删查改。正确选择合适的数据结构,对软件程序的高效执行的影响作用不亚于算法的设计。此外,在计算机系统中数据结构的作用也是非同小可。例如常常在编程语言中听到的栈,堆等,就是经典的数据结构。   经典的数据结构大致如下:   一:线性数据结构 (1):列表 a</div> </li> <li><a href="/article/507.htm" title="通过二维码开放平台的API快速生成二维码" target="_blank">通过二维码开放平台的API快速生成二维码</a> <span class="text-muted">一炮送你回车库</span> <a class="tag" taget="_blank" href="/search/api/1.htm">api</a> <div> 现在很多网站都有通过扫二维码用手机连接的功能,联图网(http://www.liantu.com/pingtai/)的二维码开放平台开放了一个生成二维码图片的Api,挺方便使用的。闲着无聊,写了个前台快速生成二维码的方法。        html代码如下:(二维码将生成在这div下) ? 1  &nbs</div> </li> <li><a href="/article/634.htm" title="ImageIO读取一张图片改变大小" target="_blank">ImageIO读取一张图片改变大小</a> <span class="text-muted">3213213333332132</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/IO/1.htm">IO</a><a class="tag" taget="_blank" href="/search/image/1.htm">image</a><a class="tag" taget="_blank" href="/search/BufferedImage/1.htm">BufferedImage</a> <div> package com.demo; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; /** * @Description 读取一张图片改变大小 * @author FuJianyon</div> </li> <li><a href="/article/761.htm" title="myeclipse集成svn(一针见血)" target="_blank">myeclipse集成svn(一针见血)</a> <span class="text-muted">7454103</span> <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/SVN/1.htm">SVN</a><a class="tag" taget="_blank" href="/search/MyEclipse/1.htm">MyEclipse</a> <div>                                 &n</div> </li> <li><a href="/article/888.htm" title="装箱与拆箱----autoboxing和unboxing" target="_blank">装箱与拆箱----autoboxing和unboxing</a> <span class="text-muted">darkranger</span> <a class="tag" taget="_blank" href="/search/J2SE/1.htm">J2SE</a> <div>4.2 自动装箱和拆箱 基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。虽然为您打包基本数据类型提供了方便,但提供方便的同时表示隐藏了细节,建议在能够区分基本数据类型与对象的差别时再使用。 4.2.1 autoboxing和unboxing 在Java中,所有要处理的东西几乎都是对象(Object)</div> </li> <li><a href="/article/1015.htm" title="ajax传统的方式制作ajax" target="_blank">ajax传统的方式制作ajax</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a> <div>//这是前台的代码 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+</div> </li> <li><a href="/article/1142.htm" title="只用jre的eclipse是怎么编译java源文件的?" target="_blank">只用jre的eclipse是怎么编译java源文件的?</a> <span class="text-muted">avords</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a> <div>eclipse只需要jre就可以运行开发java程序了,也能自动 编译java源代码,但是jre不是java的运行环境么,难道jre中也带有编译工具? 还是eclipse自己实现的?谁能给解释一下呢问题补充:假设系统中没有安装jdk or jre,只在eclipse的目录中有一个jre,那么eclipse会采用该jre,问题是eclipse照样可以编译java源文件,为什么呢? &nb</div> </li> <li><a href="/article/1269.htm" title="前端模块化" target="_blank">前端模块化</a> <span class="text-muted">bee1314</span> <a class="tag" taget="_blank" href="/search/%E6%A8%A1%E5%9D%97%E5%8C%96/1.htm">模块化</a> <div>背景: 前端JavaScript模块化,其实已经不是什么新鲜事了。但是很多的项目还没有真正的使用起来,还处于刀耕火种的野蛮生长阶段。   JavaScript一直缺乏有效的包管理机制,造成了大量的全局变量,大量的方法冲突。我们多么渴望有天能像Java(import),Python (import),Ruby(require)那样写代码。在没有包管理机制的年代,我们是怎么避免所</div> </li> <li><a href="/article/1396.htm" title="处理百万级以上的数据处理" target="_blank">处理百万级以上的数据处理</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E6%9F%A5%E8%AF%A2/1.htm">查询</a> <div>一.处理百万级以上的数据提高查询速度的方法:        1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。         2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 o</div> </li> <li><a href="/article/1523.htm" title="mac 卸载 java 1.7 或更高版本" target="_blank">mac 卸载 java 1.7 或更高版本</a> <span class="text-muted">征客丶</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/OS/1.htm">OS</a> <div>卸载 java 1.7 或更高 sudo rm -rf /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin 成功执行此命令后,还可以执行 java 与 javac 命令 sudo rm -rf /Library/PreferencePanes/JavaControlPanel.prefPane 成功执行此命令后,还可以执行 java </div> </li> <li><a href="/article/1650.htm" title="【Spark六十一】Spark Streaming结合Flume、Kafka进行日志分析" target="_blank">【Spark六十一】Spark Streaming结合Flume、Kafka进行日志分析</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/Stream/1.htm">Stream</a> <div>第一步,Flume和Kakfa对接,Flume抓取日志,写到Kafka中 第二部,Spark Streaming读取Kafka中的数据,进行实时分析   本文首先使用Kakfa自带的消息处理(脚本)来获取消息,走通Flume和Kafka的对接 1. Flume配置 1. 下载Flume和Kafka集成的插件,下载地址:https://github.com/beyondj2ee/f</div> </li> <li><a href="/article/1777.htm" title="Erlang vs TNSDL" target="_blank">Erlang vs TNSDL</a> <span class="text-muted">bookjovi</span> <a class="tag" taget="_blank" href="/search/erlang/1.htm">erlang</a> <div>      TNSDL是Nokia内部用于开发电信交换软件的私有语言,是在SDL语言的基础上加以修改而成,TNSDL需翻译成C语言得以编译执行,TNSDL语言中实现了异步并行的特点,当然要完整实现异步并行还需要运行时动态库的支持,异步并行类似于Erlang的process(轻量级进程),TNSDL中则称之为hand,Erlang是基于vm(beam)开发,</div> </li> <li><a href="/article/1904.htm" title="非常希望有一个预防疲劳的java软件, 预防过劳死和眼睛疲劳,大家一起努力搞一个" target="_blank">非常希望有一个预防疲劳的java软件, 预防过劳死和眼睛疲劳,大家一起努力搞一个</a> <span class="text-muted">ljy325</span> <a class="tag" taget="_blank" href="/search/%E4%BC%81%E4%B8%9A%E5%BA%94%E7%94%A8/1.htm">企业应用</a> <div> 非常希望有一个预防疲劳的java软件,我看新闻和网站,国防科技大学的科学家累死了,太疲劳,老是加班,不休息,经常吃药,吃药根本就没用,根本原因是疲劳过度。我以前做java,那会公司垃圾,老想赶快学习到东西跳槽离开,搞得超负荷,不明理。深圳做软件开发经常累死人,总有不明理的人,有个软件提醒限制很好,可以挽救很多人的生命。 相关新闻: (1)IT行业成五大疾病重灾区:过劳死平均37.9岁 </div> </li> <li><a href="/article/2031.htm" title="读《研磨设计模式》-代码笔记-原型模式" target="_blank">读《研磨设计模式》-代码笔记-原型模式</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ /** * Effective Java 建议使用copy constructor or copy factory来代替clone()方法: * 1.public Product copy(Product p){} * 2.publi</div> </li> <li><a href="/article/2158.htm" title="配置管理---svn工具之权限配置" target="_blank">配置管理---svn工具之权限配置</a> <span class="text-muted">chenyu19891124</span> <a class="tag" taget="_blank" href="/search/SVN/1.htm">SVN</a> <div>今天花了大半天的功夫,终于弄懂svn权限配置。下面是今天收获的战绩。 安装完svn后就是在svn中建立版本库,比如我本地的是版本库路径是C:\Repositories\pepos。pepos是我的版本库。在pepos的目录结构 pepos    component    webapps 在conf里面的auth里赋予的权限配置为 [groups]</div> </li> <li><a href="/article/2285.htm" title="浅谈程序员的数学修养" target="_blank">浅谈程序员的数学修养</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E6%8B%9B%E8%81%98/1.htm">招聘</a> <div>                                 浅谈程序员的数学修养 </div> </li> <li><a href="/article/2412.htm" title="批量执行 bulk collect与forall用法" target="_blank">批量执行 bulk collect与forall用法</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/bulk+collect/1.htm">bulk collect</a><a class="tag" taget="_blank" href="/search/forall/1.htm">forall</a> <div>BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQL引擎发送到PL/SQL引擎。通常可以在SELECT INTO、 FETCH INTO以及RETURNING INTO子句中使用BULK COLLECT。本文将逐一描述BULK COLLECT在这几种情形下的用法。     有关FORALL语句的用法请参考:批量SQL之 F</div> </li> <li><a href="/article/2539.htm" title="Linux下使用rsync最快速删除海量文件的方法" target="_blank">Linux下使用rsync最快速删除海量文件的方法</a> <span class="text-muted">dongwei_6688</span> <a class="tag" taget="_blank" href="/search/OS/1.htm">OS</a> <div>1、先安装rsync:yum install rsync 2、建立一个空的文件夹:mkdir /tmp/test 3、用rsync删除目标目录:rsync --delete-before -a -H -v --progress --stats /tmp/test/ log/这样我们要删除的log目录就会被清空了,删除的速度会非常快。rsync实际上用的是替换原理,处理数十万个文件也是秒删。 </div> </li> <li><a href="/article/2666.htm" title="Yii CModel中rules验证规格" target="_blank">Yii CModel中rules验证规格</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/rules/1.htm">rules</a><a class="tag" taget="_blank" href="/search/yii/1.htm">yii</a><a class="tag" taget="_blank" href="/search/validate/1.htm">validate</a> <div>Yii cValidator主要用法分析:  yii验证rulesit 分类: Yii yii的rules验证 cValidator主要属性 attributes ,builtInValidators,enableClientValidation,message,on,safe,skipOnError  </div> </li> <li><a href="/article/2793.htm" title="基于vagrant的redis主从实验" target="_blank">基于vagrant的redis主从实验</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/vagrant/1.htm">vagrant</a> <div>平台: Mac 工具: Vagrant 系统: Centos6.5 实验目的: Redis主从   实现思路 制作一个基于sentos6.5, 已经安装好reids的box, 添加一个脚本配置从机, 然后作为后面主机从机的基础box   制作sentos6.5+redis的box   mkdir vagrant_redis cd vagrant_</div> </li> <li><a href="/article/2920.htm" title="Memcached(二)、Centos安装Memcached服务器" target="_blank">Memcached(二)、Centos安装Memcached服务器</a> <span class="text-muted">frank1234</span> <a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/memcached/1.htm">memcached</a> <div>一、安装gcc rpm和yum安装memcached服务器连接没有找到,所以我使用的是make的方式安装,由于make依赖于gcc,所以要先安装gcc 开始安装,命令如下,[color=red][b]顺序一定不能出错[/b][/color]: 建议可以先切换到root用户,不然可能会遇到权限问题:su root 输入密码...... rpm -ivh kernel-head</div> </li> <li><a href="/article/3047.htm" title="Remove Duplicates from Sorted List" target="_blank">Remove Duplicates from Sorted List</a> <span class="text-muted">hcx2013</span> <a class="tag" taget="_blank" href="/search/remove/1.htm">remove</a> <div>Given a sorted linked list, delete all duplicates such that each element appear only once. For example,Given 1->1->2, return 1->2.Given 1->1->2->3->3, return&</div> </li> <li><a href="/article/3174.htm" title="Spring4新特性——JSR310日期时间API的支持" target="_blank">Spring4新特性——JSR310日期时间API的支持</a> <span class="text-muted">jinnianshilongnian</span> <a class="tag" taget="_blank" href="/search/spring4/1.htm">spring4</a> <div>Spring4新特性——泛型限定式依赖注入 Spring4新特性——核心容器的其他改进 Spring4新特性——Web开发的增强 Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC  Spring4新特性——Groovy Bean定义DSL Spring4新特性——更好的Java泛型操作API  Spring4新</div> </li> <li><a href="/article/3301.htm" title="浅谈enum与单例设计模式" target="_blank">浅谈enum与单例设计模式</a> <span class="text-muted">247687009</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B/1.htm">单例</a> <div>在JDK1.5之前的单例实现方式有两种(懒汉式和饿汉式并无设计上的区别故看做一种),两者同是私有构 造器,导出静态成员变量,以便调用者访问。 第一种 package singleton; public class Singleton { //导出全局成员 public final static Singleton INSTANCE = new S</div> </li> <li><a href="/article/3428.htm" title="使用switch条件语句需要注意的几点" target="_blank">使用switch条件语句需要注意的几点</a> <span class="text-muted">openwrt</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/break/1.htm">break</a><a class="tag" taget="_blank" href="/search/switch/1.htm">switch</a> <div>1. 当满足条件的case中没有break,程序将依次执行其后的每种条件(包括default)直到遇到break跳出 int main() { int n = 1; switch(n) { case 1: printf("--1--\n"); default: printf("defa</div> </li> <li><a href="/article/3555.htm" title="配置Spring Mybatis JUnit测试环境的应用上下文" target="_blank">配置Spring Mybatis JUnit测试环境的应用上下文</a> <span class="text-muted">schnell18</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a><a class="tag" taget="_blank" href="/search/JUnit/1.htm">JUnit</a> <div>Spring-test模块中的应用上下文和web及spring boot的有很大差异。主要试下来差异有: 单元测试的app context不支持从外部properties文件注入属性 @Value注解不能解析带通配符的路径字符串 解决第一个问题可以配置一个PropertyPlaceholderConfigurer的bean。 第二个问题的具体实例是:    </div> </li> <li><a href="/article/3682.htm" title="Java 定时任务总结一" target="_blank">Java 定时任务总结一</a> <span class="text-muted">tuoni</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/timer/1.htm">timer</a><a class="tag" taget="_blank" href="/search/quartz/1.htm">quartz</a><a class="tag" taget="_blank" href="/search/timertask/1.htm">timertask</a> <div> Java定时任务总结  一.从技术上分类大概分为以下三种方式:  1.Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务;   说明:    java.util.Timer定时器,实际上是个线程,定时执行TimerTask类 &</div> </li> <li><a href="/article/3809.htm" title="一种防止用户生成内容站点出现商业广告以及非法有害等垃圾信息的方法" target="_blank">一种防止用户生成内容站点出现商业广告以及非法有害等垃圾信息的方法</a> <span class="text-muted">yangshangchuan</span> <a class="tag" taget="_blank" href="/search/rank/1.htm">rank</a><a class="tag" taget="_blank" href="/search/%E7%9B%B8%E4%BC%BC%E5%BA%A6%E8%AE%A1%E7%AE%97/1.htm">相似度计算</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E6%9C%AC%E7%9B%B8%E4%BC%BC%E5%BA%A6/1.htm">文本相似度</a><a class="tag" taget="_blank" href="/search/%E8%AF%8D%E8%A2%8B%E6%A8%A1%E5%9E%8B/1.htm">词袋模型</a><a class="tag" taget="_blank" href="/search/%E4%BD%99%E5%BC%A6%E7%9B%B8%E4%BC%BC%E5%BA%A6/1.htm">余弦相似度</a> <div>本文描述了一种在ITEYE博客频道上面出现的新型的商业广告形式及其应对方法,对于其他的用户生成内容站点类型也具有同样的适用性。   最近在ITEYE博客频道上面出现了一种新型的商业广告形式,方法如下:     1、注册多个账号(一般10个以上)。     2、从多个账号中选择一个账号,发表1-2篇博文</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>