java freemark_Freemarker详解

Yeah.

Test page

Test page

Blah blah...

Import

语法

类似于java里的import,它导入文件,然后就可以在当前文件里使用被导入文件里的宏组件

用例

假设mylib.ftl里定义了宏copyright那么我们在其他模板页面里可以这样使用

"my"在freemarker里被称作namespace

compress

语法

...

#compress>

用来压缩空白空间和空白的行

用例

( 1 2 3   4    5 ${moo} test only   I said, test only   #compress>)

输出

(1 2 3 4 5

moo test only

I said, test only)

escape, noescape

语法

... ...#noescape> ... #escape>

用例

主要使用在相似的字符串变量输出,比如某一个模块的所有字符串输出都必须是html安全的,这个时候就可以使用该表达式 First name: ${firstName} Last name: ${lastName}#noescape> Maiden name: ${maidenName} #escape> 相同表达式 First name: ${firstName?html} Last name: ${lastName } Maiden name: ${maidenName?html}

assign

语法

or or or capture this #assign> or capture this #assign>

用例

生成变量,并且给变量赋值 给seasons赋予序列值   给变量test加1   给my namespage 赋予一个变量bgColor,下面可以通过my.bgColor来访问这个变量   将一段输出的文本作为变量保存在x里 下面的阴影部分输出的文本将被赋值给x ${n} #list> #assign> Number of words: ${x?word_list?size} ${x}   Hello ${user}!#assign>     error         true 同时也支持中文赋值,如: java #assign> ${语法} 打印输出: java

global

语法

or or capture this #global>

setting

语法

用来设置整个系统的一个环境

locale

number_format

boolean_format

date_format, time_format, datetime_format

time_zone

classic_compatible

用例

假如当前是匈牙利的设置,然后修改成美国

${1.2}

${1.2}

输出

1,2

1.2

因为匈牙利是采用“,”作为十进制的分隔符,美国是用“.”

C一些常用方法或注意事项

表达式转换类

${expression}计算expression并输出

#{ expression }数字计算#{ expression ;format}安格式输出数字format为M和m

M表示小数点后最多的位数,m表示小数点后最少的位数如#{121.2322;m2M2}输出121.23

数字循环

1..5 表示从1到5,原型number..number

对浮点取整数

${123.23?int} 输出123

给变量默认值

${var?default(“hello world
”)?html}如果var is null那么将会被hello world
替代

判断对象是不是null

Mouse found 也可以直接${mouse?if_exists})输出布尔形

常用格式化日期

openingTime必须是Date型,详细查看freemarker文档Reference->build-in referece->build-in for date   ${openingTime?date} ${openingTime?date_time} ${openingTime?time}

添加全局共享变量数据模型

在代码里的实现 cfg = Configuration.getDefaultConfiguration(); cfg.setSharedVariable("global", "you good");页面实现可以通过global指令,具体查看指令里的global部分

直接调用java对象的方法

${object.methed(args)}

字符串处理(内置方法)

html安全输出

“abc

返回安全的html输出,替换掉html代码

xml安全输出

var?xml

substring的用法

${user[0]}${user[4]}${user[1..4]} 输出 : ho ello

类似String.split的用法

“abc;def;ghi”?split(“;”)返回sequence

将字符串按空格转化成sequence,然后取sequence的长度

var?word_list效果同 var?split(“ ”)

var?word_list?size

取得字符串长度

var?length

大写输出字符

var?upper_case

小写输出字符

var?lower_case

首字符大写

var?cap_first

首字符小写

var?uncap_first

去掉字符串前后空格

var?trim

每个单词的首字符大写

var?capitalize

类似String.indexof:

“babcdabcd”?index_of(“abc”) 返回1 “babcdabcd”?index_of(“abc”,2) 返回5

类似String.lastIndexOf

last_index_of和String.lastIndexOf类似,同上

下面两个可能在代码生成的时候使用(在引号前加”\”)

j_string: 在字符串引号前加”\” String BEAN_NAME = "${beanName?j_string}"; 打印输出: String BEAN_NAME = "The \"foo\" bean."; js_string: 打印输出 alert("Welcome Big Joe\'s \"right hand\"!");

替换字符串 replace

${s?replace(‘ba’, ‘XY’ )} ${s?replace(‘ba’, ‘XY’ , ‘规则参数’)}将s里的所有的ba替换成xy 规则参数包含:i r m s c f具体含义如下:

·i: 大小写不区分.

·f: 只替换第一个出现被替换字符串的字符串

·r:  XY是正则表达式

·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.

·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.

·c: Permits whitespace and comments in regular expressions.

D freemarker在web开发中注意事项

freemarker与webwork整合

web中常用的几个对象

Freemarker的ftl文件中直接使用内部对象:

${Request ["a"]}

${RequestParameters["a"]}

${Session ["a"]}

${Application ["a"]}

${JspTaglibs ["a"]}

与webwork整合之后 通过配置的servlet 已经把request,session等对象置入了数据模型中

在view中存在下面的对象

我们可以在ftl中${req}来打印req对象

req- the current HttpServletRequest

res- the current HttpServletResponse

stack- the current OgnlValueStack

ognl- the OgnlTool instance

webwork- an instance of FreemarkerWebWorkUtil

action- the current WebWork action

exception-optionalthe Exception instance, if the view is a JSP exception or Servlet exception view

view中值的搜索顺序

${name}将会以下面的顺序查找name值

freemarker variables

value stack

request attributes

session attributes

servlet context attributes

在模板里ftl里使用标签

注意,如果标签的属性值是数字,那么必须采用nubmer=123方式给属性赋值

JSP页面

Keyword:
Exclude:

模板ftl页面

Keyword:
Exclude:
@html.form>

如何初始化共享变量

1.初始化全局共享数据模型

freemark在web上使用的时候对共享数据的初始化支持的不够,不能在配置初始化的时候实现,而必须通过ftl文件来初始化全局变量。这是不能满主需求的,我们需要在servlet init的时候留出一个接口来初始化系统的共享数据

具体到和webwork整合,因为本身webwork提供了整合servlet,如果要增加全局共享变量,可以通过修改com.opensymphony.webwork.views.freemarker.FreemarkerServlet来实现,我们可以在这个servlet初始化的时候来初始化全局共享变量

与webwork整合配置

配置web.xml

freemarker

com.opensymphony.webwork.views.freemarker.FreemarkerServlet

TemplatePath

/

NoCache

true

ContentType

text/html

template_update_delay

0

default_encoding

GBK

number_format

0.##########

1

freemarker

*.ftl

E高级方法

自定义方法

${timer("yyyy-MM-dd H:mm:ss", x)}

${timer("yyyy-MM-dd ", x)}

在模板中除了可以通过对象来调用方法外(${object.methed(args)})也可以直接调用java实现的方法,java类必须实现接口TemplateMethodModel的方法exec(List args). 下面以把毫秒的时间转换成按格式输出的时间为例子

public class LongToDate implements TemplateMethodModel {

public TemplateModel exec(List args) throws TemplateModelException { SimpleDateFormat mydate = new SimpleDateFormat((String) args.get(0))); return mydate.format(new Date(Long.parseLong((String)args.get(1))); } }

将LongToDate对象放入到数据模型中 root.put("timer", new IndexOfMethod()); ftl模板里使用 ${timer("yyyy-MM-dd H:mm:ss", x)} ${timer("yyyy-MM-dd ", x)}

输出

2001-10-12 5:21:12

2001-10-12

自定义Transforms

实现自定义的文本或表达式@transform>的功能,允许对中间的最终文本进行解析转换

例子:实现str@upcase> 将str转换成STR 的功能

代码如下:

import java.io.*;

import java.util.*; import freemarker.template.TemplateTransformModel;   class UpperCaseTransform implements TemplateTransformModel {   public Writer getWriter(Writer out, Map args) { return new UpperCaseWriter(out); }   private class UpperCaseWriter extends Writer { private Writer out; UpperCaseWriter (Writer out) { this.out = out; }   public void write(char[] cbuf, int off, int len) throws IOException { out.write(new String(cbuf, off, len).toUpperCase()); }   public void flush() throws IOException { out.flush(); }   public void close() { } } }

然后将此对象put到数据模型中

root.put("upcase", new UpperCaseTransform());

在view(ftl)页面中可以如下方式使用

hello world

@upcase>

打印输出:

HELLO WORLD

F.Built-ins

${x?upper_case} –小写变大写

${test?html} -转换为HTML编码格式

${repeat("A", B)} – 复制B次A

Example:

${test?html}

${test?upper_case?html}

Assuming thatteststores the string ``Tom & Jerry'', the output will be:

Tom & Jerry

TOM & JERRY

---------

${repeat("What", 3)}

will print::WhatWhatWhat

1. String内置的JavaScript转换: js_string

用途:用于JavaScript转义,转换',",换行等特殊字符

模板:

alert("${errorMessage?js_string}");

输出:

alert("Readonly\'s pet name is \"Cross Bone\"");

2.内置的默认值处理:default

用途: 用于处理默认值

模本:

User: ${userLogin.name?default("Anonymous")}

${(employee.department.manager.name)?default(" ")}

输出:

User: Anonymous

 

注,可以对整个对象树加上(),再用内置处理器这种方便的做法,偶也是最近刚学会的,以前一直用很傻的方法做.....

3. Sequence内置的计数器: xxx_index

用途:显示序号

模板:

${e_index}. ${e.name}

#list>

输出:

1. Readonly

2. Robbin

4. Sequence内置的分段器: chunk

用途:某些比较BT的排版需求

模板:

  • ${cell} #list>

    #list>

    ${cell} #list>

    #list>

    输出:

    • a
    • b
    • c
    • d
      • e
      • f
      • g
      • h
        • i
        • jabcdefghij--

          String

          ${"It's \"quoted\" and

          this is a backslash: \\"}

          ${'It\'s "quoted" and

          this is a backslash: \\'}

          ${r"${foo}"}

          raw字符串,原封不动地现实引号中的内容

          ps:前一种是用双引号来引用字符串,后一种是用单引号来引用字符串。

          分别需要对双引号和单引号进行转义

          ${"${user}${user}${user}${user}"}

          ${user + user + user + user}

          效果相同

          ★substring

          ${user[0]}${user[4]}

          ${user[1..4]}

          ${user[4..]}

          ★number

          不支持科学计数法

          小数点前面的零不能省略

          ★sequences

          ${x}

          #list>

          ${x} #list>

          ${x} #list>

          数组的拼接

          - ${user}

          #list>

          ★hash

          - Joe is ${ages.Joe}

          - Fred is ${ages.Fred}

          - Julia is ${ages.Julia}

          注意重复的键对应的值取最后的一个

          ★运算

          ${5/2?int} 显示2

          cap_first: 首字母大写

          capitalize: 所有单词首刺目大写

          html : 转换为HTML格式

          < replaced with <

          > replaced with >

          & replaced with &

          " replaced with "

          index_of : 显示元素所在的位置

          "abcabc"?index_of("bc")

          返回值为1(下标从0开始)

          Contains:判断是否存在字符

          It contains "ice"#if>

          输出: It contains "ice"

          Replace :替换

          split(“XX”):截取XX之后的字符

          - ${x}

          #list>

          输出:

          - some

          - test

          - text

          starts_with :字符串由什么开始返回布尔型

          trim :去掉空格

          seq_index_of 数组中元素的位置

          ${colors?seq_index_of("blue")}

          输出: 2

          Default :设置变量的默认值

          Exists:放在if句 如果没有…..

          Mouse found

          No mouse found

          #if>

          Creating mouse...

          Mouse found

          No mouse found

          #if>

          输出:

          No mouse found

          Creating mouse...

          Mouse found

          if_exists 放在一般语句

          (${mouse?if_exists})

          Creating mouse...

          (${mouse?if_exists})

          输出:

          ()

          Creating mouse...

          (Jerry)

          删除空白行和空格

          ...

          #compress>

          让此标记内的代码都执行

          #escape>

          From: ${mailMessage.From}

          Subject: ${mailMessage.Subject}

          Message: ${mailMessage.htmlFormattedBody}#noescape>

          ...

          #escape>

          输出:

          From: ${mailMessage.From?html}

          Subject: ${mailMessage.Subject?html}

          Message: ${mailMessage.htmlFormattedBody}

          ...

你可能感兴趣的:(java,freemark)