隨筆-124  評論-49  文章-56  trackbacks-0
           

          A概念

          最常用的3個概念

          sequence 序列,對應java里的list、數組等非鍵值對的集合

          hash      鍵值對的集合

          namespace 對一個ftl文件的引用,利用這個名字可以訪問到該ftl文件的資源

          B指令

          if, else, elseif

          語法

          <#if condition>
           ...
          <#elseif condition2>
           ...
          <#elseif condition3>
           ...
          ...
          <#else>
           ...

          </#if>

          用例

          <#if x = 1>
           x is 1

          </#if>

          <#if x = 1>
           x is 1
          <#else>
           x is not 1

          </#if>

          switch, case, default, break

          語法

          <#switch value>
           <#case refValue1>
              ...
              <#break>
           <#case refValue2>
              ...
              <#break>
           ...
           <#case refValueN>
              ...
              <#break>
           <#default>
              ...
          </#switch>

          用例

          字符串

          <#switch being.size>
           <#case "small">
               This will be processed if it is small
               <#break>
           <#case "medium">
               This will be processed if it is medium
               <#break>
           <#case "large">
               This will be processed if it is large
               <#break>
           <#default>
               This will be processed if it is neither

          </#switch>

          數字

          <#switch x>
           <#case x = 1>
              1
           <#case x = 2>
              2
           <#default>
              d
          </#switch>
           

          如果x=1 輸出 1 2, x=2輸出 2, x=3 輸出d

          list, break

          語法

          <#list sequence as item>
          ...
          <#if item = "spring"><#break></#if>
          ...
          </#list>
          關鍵字
          item_index:是list當前值的下標
          item_has_next:判斷list是否還有值
           

          用例

          <#assign seq = ["winter", "spring", "summer", "autumn"]>
          <#list seq as x>
           ${x_index + 1}. ${x}<#if x_has_next>,</#if>
          </#list>
           
          輸出
           1. winter,
           2. spring,
           3. summer,
           4. autumn  
           
           

          include

          語法

          <#include filename>
          or
          <#include filename options>
          options包含兩個屬性
          encoding=”GBK” 編碼格式
          parse=true 是否作為ftl語法解析,默認是true,false就是以文本方式引入.注意在ftl文件里布爾值都是直接賦值的如parse=true,而不是parse=”true”

          用例

          /common/copyright.ftl包含內容

          Copyright 2001-2002 ${me}<br>
          All rights reserved. 

          模板文件

          <#assign me = "Juila Smith">
          <h1>Some test</h1>
          <p>Yeah.
          <hr>

          <#include "/common/copyright.ftl" encoding=”GBK”> 

          輸出結果

          <h1>Some test</h1>
          <p>Yeah.
          <hr>
          Copyright 2001-2002 Juila Smith
          All rights reserved. 

          Import

          語法

          <#import path as hash>
          類似于java里的import,它導入文件,然后就可以在當前文件里使用被導入文件里的宏組件
           

          用例

          假設mylib.ftl里定義了宏copyright那么我們在其他模板頁面里可以這樣使用

          <#import "/libs/mylib.ftl" as my>
           

          <@my.copyright date="1999-2002"/>

          "my"在freemarker里被稱作namespace

           

          compress

          語法

          <#compress>
           ...

          </#compress>

          用來壓縮空白空間和空白的行

          用例

          <#assign x = "    moo "n"n   ">
          (<#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

          語法

          <#escape identifier as expression>
           ...
           <#noescape>...</#noescape>
           ...
          </#escape>

          用例

          主要使用在相似的字符串變量輸出,比如某一個模塊的所有字符串輸出都必須是html安全的,這個時候就可以使用該表達式
          <#escape x as x?html>
           First name: ${firstName}
           <#noescape>Last name: ${lastName}</#noescape>
           Maiden name: ${maidenName}
          </#escape>
          相同表達式 
            First name: ${firstName?html}
           Last name: ${lastName }
           Maiden name: ${maidenName?html}

          assign

          語法

          <#assign name=value>
          or
          <#assign name1=value1 name2=value2 ... nameN=valueN>
          or
          <#assign same as above... in namespacehash>
          or
          <#assign name>
           capture this
          </#assign>
          or
          <#assign name in namespacehash>
           capture this
          </#assign>

          用例

          生成變量,并且給變量賦值
          給seasons賦予序列值
          <#assign seasons = ["winter", "spring", "summer", "autumn"]>
           
          給變量test加1
          <#assign test = test + 1>
           
          給my namespage 賦予一個變量bgColor,下面可以通過my.bgColor來訪問這個變量
          <#import "/mylib.ftl" as my>
          <#assign bgColor="red" in my>
           
          將一段輸出的文本作為變量保存在x里
          下面的陰影部分輸出的文本將被賦值給x
          <#assign x>
           <#list 1..3 as n>
              ${n} <@myMacro />
           </#list>
          </#assign>
          Number of words: ${x?word_list?size}
          ${x}
           
          <#assign x>Hello ${user}!</#assign>     error
          <#assign x=” Hello ${user}!”>         true
           
          同時也支持中文賦值,如:
          <#assign 語法>
           java
          </#assign>
          ${語法}
          打印輸出:
          java

          global

          語法

          <#global name=value>
          or
          <#global name1=value1 name2=value2 ... nameN=valueN>
          or
          <#global name>
           capture this
          </#global>

          全局賦值語法,利用這個語法給變量賦值,那么這個變量在所有的namespace[A1]中是可見的,如果這個變量被當前的assign語法覆蓋 如<#global x=2> <#assign x=1> 在當前頁面里x=2將被隱藏,或者通過${.global.x}來訪問

          setting

          語法

          <#setting name=value>

          用來設置整個系統的一個環境

          locale

          number_format

          boolean_format

          date_format, time_format, datetime_format

          time_zone

          classic_compatible

          用例

          假如當前是匈牙利的設置,然后修改成美國

          ${1.2}
          <#setting locale="en_US">
          ${1.2} 

          輸出

          1,2
          1.2

          因為匈牙利是采用“,”作為十進制的分隔符,美國是用“.”

          macro, nested, return

          語法

          <#macro name param1 param2 ... paramN>
           ...
           <#nested loopvar1, loopvar2, ..., loopvarN>
           ...
           <#return>
           ...
          </#macro>

          用例

          <#macro test foo bar="Bar"[A2] baaz=-1>
           Test text, and the params: ${foo}, ${bar}, ${baaz}
          </#macro>
          <@test foo="a" bar="b" baaz=5*5-2/>
          <@test foo="a" bar="b"/>
          <@test foo="a" baaz=5*5-2/>

          <@test foo="a"/> 

          輸出

           Test text, and the params: a, b, 23
           Test text, and the params: a, b, -1
           Test text, and the params: a, Bar, 23

           Test text, and the params: a, Bar, -1

          定義循環輸出的宏

          <#macro list title items>
           <p>${title?cap_first}:
           <ul>
              <#list items as x>
                <li>${x?cap_first}
              </#list>
           </ul>
          </#macro>

          <@list items=["mouse", "elephant", "python"] title="Animals"/>

          輸出結果 
          <p>Animals:
           <ul>
                <li>Mouse
                <li>Elephant
                <li>Python

           </ul>

          包含body的宏

          <#macro repeat count>
           <#list 1..count as x>
              <#nested x, x/2, x==count>
           </#list>
          </#macro>
          <@repeat count=4 ; c halfc last>
           ${c}. ${halfc}<#if last> Last!</#if>

          </@repeat> 

          輸出

          1. 0.5
           2. 1
           3. 1.5

           4. 2 Last!

          t, lt, rt

          語法

          <#t> 去掉左右空白和回車換行
           
          <#lt>去掉左邊空白和回車換行
           
          <#rt>去掉右邊空白和回車換行
           
          <#nt>取消上面的效果
           

          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<br>”)?html}如果var is null那么將會被hello world<br>替代

          判斷對象是不是null

              <#if mouse?exists>
               Mouse found
          <#else>
          也可以直接${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<table>sdfsf”?html

          返回安全的html輸出,替換掉html代碼

          xml安全輸出

          var?xml  

          substring的用法

          <#assign user=”hello jeen”>
          ${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:在字符串引號前加”"”
                  <#assign beanName = 'The "foo" bean.'>
                  String BEAN_NAME = "${beanName?j_string}";
          打印輸出:
                  String BEAN_NAME = "The ""foo"" bean.";
          js_string:
                   <#assign user = "Big Joe's ""right hand"".">
          <script>
           alert("Welcome ${user}!");
          </script> 
          打印輸出
                  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.

           
           

          在模板里對sequenceshashes初始化

          sequences 
           
          1.     [“you”,”me”,”he”] 
          2.     1..100
          3.     [ {“Akey”:”Avalue”},{“Akey1”:”Avalue1”},
          {“Bkey”:”Bvalue”},{“Bkey1”:”Bvalue1”},
          ]
           
           
          hashes      {“you”:”a”,”me”:”b”,”he”:”c”}
           
           

          注釋標志

          <#--

          這里是注釋

          -->

          舊版本的freemarker采用的是<#comment> 注釋 </#comment>方法

          sequences內置方法

          sequence?first

          返回sequence的第一個值;前提條件sequence不能是null

          sequence?last

                 返回sequence最后一個值

          sequence?reverse

                 反轉sequence的值

          sequence?size

                 返回sequence的大小

          sequence?sort

                 sequence按里面的對象toString()的結果進行排序

          sequence?sort_by(value)

          sequence 按里面的對象的屬性value進行排序

          : sequence里面放入的是10 user對象,user對象里面包含name,age等屬性

          sequence?sort_by(name) 表示所有的useruser.name進行排序

          hashes內置方法

          hash?keys

                 返回hash里的所有keys, 返回結果類型sequence

          hash?values

                 返回hash里的所有value, 返回結果類型sequence

          D freemarkerweb開發中注意事項

          freemarkerwebwork整合

          web中常用的幾個對象

          與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 - optional the 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頁面

          <%@page contentType="text/html;charset=ISO-8859-2" language="java"%>
          <%@taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
          <%@taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
           
          <html>
           <body>
              <h1><bean:message key="welcome.title"/></h1>
              <html:errors/>
              <html:form action="/query">
                Keyword: <html:text property="keyword"/><br>
                Exclude: <html:text property="exclude"/><br>
                <html:submit value="Send"/>
              </html:form>
           </body>
          </html> 

          模板ftl頁面

          <#assign html=JspTaglibs["/WEB-INF/struts-html.tld"]>
          <#assign bean=JspTaglibs["/WEB-INF/struts-bean.tld"]>
           
          <html>
           <body>
              <h1><@bean.message key="welcome.title"/></h1>
              <@html.errors/>
              <@html.form action="/query">
                Keyword: <@html.text property="keyword"/><br>
                Exclude: <@html.text property="exclude"/><br>
                <@html.submit value="Send"/>
              </@html.form>
           </body>
          </html> 

          如何初始化共享變量

          1. 初始化全局共享數據模型

          freemarkweb上使用的時候對共享數據的初始化支持的不夠,不能在配置初始化的時候實現,而必須通過ftl文件來初始化全局變量。這是不能滿主需求的,我們需要在servlet init的時候留出一個接口來初始化系統的共享數據

          具體到和webwork整合,因為本身webwork提供了整合servlet,如果要增加全局共享變量,可以通過修改com.opensymphony.webwork.views.freemarker.FreemarkerServlet來實現,我們可以在這個servlet初始化的時候來初始化全局共享變量

          webwork整合配置

          配置web.xml

          <servlet>

              <servlet-name>freemarker</servlet-name>

              <servlet-class>com.opensymphony.webwork.views.freemarker.FreemarkerServlet</servlet-class>

              <init-param>

                <param-name>TemplatePath</param-name>

          <param-value>/</param-value>

          <!—模板載入文件夾,這里相對context root,遞歸獲取該文件夾下的所有模板-->

              </init-param>

              <init-param>

                <param-name>NoCache</param-name> <!—是否對模板緩存-->

                <param-value>true</param-value>

              </init-param>

              <init-param>

                <param-name>ContentType</param-name>

                <param-value>text/html</param-value>

              </init-param>

              <init-param>

          <param-name>template_update_delay</param-name>

          <!—模板更新時間,0表示每次都更新,這個適合開發時候-->

                <param-value>0</param-value>

              </init-param>

              <init-param>

                <param-name>default_encoding</param-name>

                <param-value>GBK</param-value>

              </init-param>

              <init-param>

                <param-name>number_format</param-name>

                <param-value>0.##########</param-value><!—數字顯示格式-->

              </init-param>

              <load-on-startup>1</load-on-startup>

           </servlet>

           <servlet-mapping>

              <servlet-name>freemarker</servlet-name>

              <url-pattern>*.ftl</url-pattern>

           </servlet-mapping>

          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模板里使用
          <#assign x = "123112455445">
          ${timer("yyyy-MM-dd H:mm:ss", x)}
          ${timer("yyyy-MM-dd ", x)} 

          輸出

          2001-10-12 5:21:12

          2001-10-12

          自定義 Transforms

          實現自定義的<@transform>文本或表達式</@transform>的功能,允許對中間的最終文本進行解析轉換

          例子:實現<@upcase>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)頁面中可以如下方式使用

          <@upcase>

          hello world

          </@upcase>

          打印輸出:

          HELLO WORLD


           [A1]<#import “lib/abc.ftl” as abc>這里的abc叫做namespace

           [A2]默認值

          posted on 2009-11-03 11:12 junly 閱讀(2207) 評論(0)  編輯  收藏 所屬分類: freemark/velocity
          主站蜘蛛池模板: 彰化县| 建始县| 佳木斯市| 陆良县| 康平县| 辉南县| 犍为县| 青河县| 仙居县| 仪陇县| 楚雄市| 平乡县| 读书| 明水县| 灌南县| 博兴县| 云霄县| 祁门县| 抚顺县| 光泽县| 太原市| 石泉县| 诸城市| 德清县| 定结县| 平阴县| 东辽县| 巧家县| 肇源县| 司法| 封开县| 元朗区| 滨海县| 万州区| 兴和县| 江阴市| 永顺县| 龙州县| 连平县| 崇文区| 洛浦县|