Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
          1. 模板+數(shù)據(jù)模型=輸出
          2. 數(shù)據(jù)模型
          a) 類似目錄的變量稱為hashes,包含保存下級變量的唯一的查詢名字,充當(dāng)其它對象的容器,每個(gè)都關(guān)聯(lián)唯一的查詢名字
          b) 類似文件的變量稱為scalars,保存單值,有兩種類型
          i. 字符串:用引號括起,單引號or雙引號
          ii. 數(shù)字:不用引號
          iii. 日期:可以是日期,時(shí)間或日期-時(shí)間
          iv. 布爾值:true或false,通常在<#if …>標(biāo)記中使用
          v. 對scalars的訪問從root開始,各部分用”.”分隔,如 animals.mouse.price
          c) 另外一種變量是sequences,和hashes類似,充當(dāng)其它對象的容器,按次序訪問,只是不使用變量名字,而使用數(shù)字索引,如animals[0].name,索引值從0開始
          d) 通常每個(gè)變量具有上述的一種能力,但一個(gè)變量可以具有多種上述能力
          e) 方法
          i. ${avg(3,5,20)} ${avg(student.zhangyaang.age,student.situ.age)}
          f) 宏和變換器:用戶自定義的指令(FTL標(biāo)記)
          g) 節(jié)點(diǎn):樹形結(jié)構(gòu)中的一個(gè)節(jié)點(diǎn),常用于xml處理中
          3. 模板
          a) 文本:直接輸出
          b) ${…}:稱為interpolations,FreeMarker會在輸出時(shí)用實(shí)際值代替,或#{},只用于文本中
          c) FTL標(biāo)記:類似于HTML,為了與HTML區(qū)分,用#開始,有的以@開始,不會輸出,區(qū)分大小寫,FTL標(biāo)記不能位于另一個(gè)FTL標(biāo)記內(nèi)部
          d) 注釋:<#--和-->,不會輸出
          e) 多余的空白字符會在模板輸出時(shí)移除
          f) 指令
          i. 使用FTL標(biāo)記引用指令,有三種FTL標(biāo)記
          1. 開始標(biāo)記:<#name prarm>
          2. 結(jié)束標(biāo)記:</#name>
          3. 空內(nèi)容指令標(biāo)記:<#name param />
          ii. 有兩種類型的指令:預(yù)定義指令和用戶定義指令,用戶定義指令要用@替換#
          iii. FTL標(biāo)記不能夠交叉,應(yīng)該正確嵌套
          iv. 如果使用不存在的指令,FreeMarker會產(chǎn)生錯(cuò)誤消息
          v. < , </ 和指令間不允許有空白字符
          g) 表達(dá)式
          i. 字符串
          1. 使用單引號或雙引號限定
          2. 特殊字符要轉(zhuǎn)義
          3. raw字符串,可以認(rèn)為是文本,其中的$和{等不具有特殊含義,該類字符串在引號前面加r,如${r”${foo}”} ${r”c:"foo"bar”}
          ii. 數(shù)字
          1. 直接輸入,不需要引號
          2. 精度數(shù)字使用”.”分隔,不能使用分組符號
          3. 不支持科學(xué)計(jì)數(shù)法
          4. 不能省略小數(shù)點(diǎn)前面的0
          5. 數(shù)字8 ,+8 ,08和8.00 都是相同的
          iii. 布爾值:true 和 false, 不使用引號
          iv. 序列
          1. 有逗號分隔的子變量列表,有方括號限定,如:
          <#list [“winter”, ”spring”, ”summer”, ”autumn”] as x>
          ${x}
          </#list>
          2. 列表的項(xiàng)目是表達(dá)式,如:
          [2+2, [1,2,3,4], ”whatnot”]
          3. 可以使用數(shù)字范圍定義數(shù)字序列,如:
          2..5等同于[2,3,4,5] 注意:數(shù)字范圍沒有方括號 如:5..2
          4. 散列(hash) 由逗號的鍵/值列表,有大括號限定,鍵和值之間用冒號分隔
          {“name”:”zhangyang”,”age”:23} 鍵和值都是表達(dá)式,但鍵必須是字符串
          v. 獲取變量
          1. 頂層變量:${variable}, 變量名只能是字母, 數(shù)字, 下劃線, $, @ 和# 的組合, 不能以數(shù)字開頭
          2. 從散列中獲取數(shù)據(jù)
          a) school.student.name
          b) school.[“student”].name
          c) school[“student”][“name”]
          說明:使用點(diǎn)語法,變量名有頂層變量一樣的限制, 方括號語法沒有該限制
          3. 從序列獲(sequences)得數(shù)據(jù): 和散列的方括號語法一樣, 只是方括號的表達(dá)式值必須是數(shù)字; 注意: 第一個(gè)項(xiàng)目的索引是0
          4. 序列片段: 使用[startIndex..endIndex]語法, 從序列中獲得片段(也是序列)
          5. 特殊變量: FreeMarker內(nèi)定義的變量, 使用 .variablenae 語法訪問
          vi. 字符串操作
          1. Interpolation(或連接操作)
          a) 可以使用${..} 或#{..} 在文本部分插入表達(dá)式的值,
          如${“Hello ${user}”} 等于 ${“Hello”+user}
          b) ${..} 只能用于文本部分, 不用于FTL表達(dá)式中
          2. 子串
          假設(shè)user的值為”tom cat”
          ${user[0]}${user[4]} ? tc
          ${user[1..4]} ? om c
          vii. 序列操作
          連接操作: 和字符串一樣, 用”+”
          <#list [“joe”,”fred”] + [“julia”,”kate”] as user>
          ${user}
          </#list>
          viii. 散列操作
          連接操作: 和字符串一樣, 用”+”, 如果有相同的key, 右邊的值替換左邊的值(后面的替換前面的), 如
          <#assign ages = {“joe”:23,”fred”:25} + {“joe”:30,”julia”:23}>
          </#assign> 結(jié)果: joe的值為30
          ix. 算術(shù)運(yùn)算
          1. +, -- , *, /, %
          ${x / 2}
          2. 操作符兩邊必須是數(shù)字
          3. 使用 “+” 操作符時(shí),如果一邊是數(shù)字, 一邊是字符串, 就會自動將數(shù)字轉(zhuǎn)換為字符串, 如: ${3+”4”} 結(jié)果 34
          4. 使用內(nèi)建的 int 獲得整數(shù)部分
          ${1.1?int} ?1
          ${1.999?int} ?1
          ${(5/2)?int} ?2
          5. 比較操作符
          a) 使用=(或==,完全相等)測試兩個(gè)值是否相等, 使用!=測試兩個(gè)值是否不相等
          b) = 和!= 兩邊必須是相同類型的值
          c) FreeMarker是精確比較,”x”,”x “和”x”是不等的
          d) 對數(shù)字和日期可以使用<, <=, >, 和>=, 但不用用于字符串
          e) 由于FreeMarker 會將>解釋成FTL標(biāo)記的結(jié)束字符, 所以對于>和>=可以使用括號來避免這種情況, 如<#if (x > y)>
          f) e)的一種替代方法, 使用lt, lte, gt 和gte來替代
          6. 邏輯操作符
          a) &&(and), ||(or), !(not), 只能用于布爾值
          <#if x < 13 && color = “green”>

          </#if>
          <#if ! man>
          woman
          </#if>
          7. 內(nèi)建函數(shù)
          a) 內(nèi)建函數(shù)的用法類似訪問散列的子變量, 只是用”?”|替代”,”
          b) 用于字符串
          i. html: 對字符串進(jìn)行html編碼
          ii. cap_first: 將字符串轉(zhuǎn)換成第一個(gè)字母大寫
          iii. lower_case: 小寫
          iv. upper_case: 大寫
          v. trim: 去掉字符串前后的空白字符
          c) 用于序列
          i. size: 獲得序列中元素的數(shù)目
          d) 用于數(shù)字
          i. int: 取得數(shù)字的整數(shù)部分
          e) 例子:
          test = “tom & jerry”
          ${test?html} ? tom &amp; jerry
          ${test?upper_case?html} ? TOM &amp; JERRY
          8. 操作符優(yōu)先順序
          h) Interpolation(只用于文本部分)
          i. Interpolation有兩種類型
          1. 通用Interpolation: ${expr}
          a) 插入字符串值: 直接輸出表達(dá)式結(jié)果
          b) 插入數(shù)字值: 根據(jù)缺省格式(由#setting指令設(shè)置)將表達(dá)式轉(zhuǎn)換成文本輸出; 可以使用內(nèi)建函數(shù)string格式化單個(gè)Interpolation
          c) 例子
          <#setting number_format=”currency”/> ?金額
          <#assign answer=43/>
          ${answer} ? $43.00
          ${answer?string} ?$43.00
          ${answer?string.number} ?43
          ${answer?string.currency} ?$43.00
          ${answer?string.percent} ?4,300%
          2. 數(shù)字Interpolation: ${expr} 或#{expr ; format}
          3. 插入日期: 根據(jù)缺省格式(#setting) 將表達(dá)式結(jié)果轉(zhuǎn)換成文本輸出; 可以使用內(nèi)建的函數(shù)string 格式化單個(gè)Interpolation, 例子:
          ${update?string(“yyyy-MM-dd HH:mm:ss zzzz”)}
          4. 插入布爾值: 說明同上
          <#assign foo = true/>
          ${foo?string(“yes”,”no”)} ?yes
          5. 數(shù)字Interpolation的#{expr ; format}形式可以用來格式化數(shù)字, format可以是
          a) mX: 小數(shù)部分最小X位
          b) MX: 小數(shù)部分最大X位
          c) 例子
          <#assign x=2.364/>
          <#assign y=4/>
          #{x; M2} ?2.36
          #{y; M2} ?4
          #{x; m1} ?2.4
          #{y; m1} ?4.0
          i) 例子
          i. if指令
          <#if zhangyang.age < situ.age>
          Situ is order
          <#else>
          Zhangyang is order
          </#if>
          ii. list指令 <#list students[0..5] as s_list></#list>取list的前5條記錄
          <table border = “1”>
          <tr>
          <td>name</td><td>age</td>
          <#list students as s_list>
          <td>${s_list.name}</td><td>${s_list.age}</td>
          </#list>
          </tr>
          </table>
          iii. include指令
          <#include “/all/header.html”>

          <#include “/all/footer.html”>
          iv. 應(yīng)用
          <table>
          <#list students as s_list>
          <tr>
          <td>
          <#if s_list.sex =”man”><img src=”/img/boy.gif”/>
          <#else><img src=”/img/girl.gif/>
          </#if>
          ${s_list.name}
          </td>
          <td>${s_list.age}</td>
          </tr>
          </#list>
          </table>
          4. 用戶自定義指令
          a) 宏和變換器
          b) 模板中定義變量
          c) 名字空間(命名空間)
          5. 應(yīng)用
          a) List
          i. 例子1
          List scalarList = new ArrayList();
          scalarList.add("red");
          scalarList.add("green");
          scalarList.add("blue");
          scalarList.add("yellow");
          root.put("scList", scalarList);

          <#list scList as the_value>
          Scalar List值:${the_value}
          </#list>
          ii. 例子2
          public class User {
          private String userId;
          private String userName;
          }

          User u1 = new User();
          u1.setUserId("100");
          u1.setUserName("郜司徒");

          User u2 = new User();
          u2.setUserId("200");
          u2.setUserName("張宇偉");

          User u3 = new User();
          u3.setUserId("300");
          u3.setUserName("馮鈺凱");

          User u4 = new User();
          u4.setUserId("400");
          u4.setUserName("苗先杰");

          SimpleSequence userList = new SimpleSequence(ObjectWrapper.BEANS_WRAPPER);
          userList.add(u1);
          userList.add(u2);
          userList.add(u3);
          userList.add(u4);

          root.put("userList", userList);

          <#list userList as list>
          List對象user的值:${list.userId}
          List的value:${list.userName}
          </#list>
          b) Map
          i. 例子1
          SimpleHash scalarMap = new SimpleHash(ObjectWrapper.BEANS_WRAPPER);
          scalarMap.put("anotherString", "aaaaaaaa");
          scalarMap.put("anotherNumber", new Double(2.5555));

          root.put("scMap", scalarMap);

          <#list scMap?keys as myKey>
          Map key is:${myKey}
          map value is:${scMap[myKey]}
          </#list>
          ii. 例子2
          SimpleHash userMap = new SimpleHash(ObjectWrapper.BEANS_WRAPPER);
          userMap.put("1", u1);
          userMap.put("2", u2);
          userMap.put("3", u3);
          userMap.put("4", u4);
          root.put("user", userMap);

          <#list user?keys as key1>
          ${key1}
          ${user[key1].userId}
          ${user[key1].userName}

          <#assign u = "${user[key1]}">
          User is :${u}
          </#list>
          c) List和Map
          SimpleHash root = new SimpleHash(/*ObjectWrapper.BEANS_WRAPPER*/);
          // Map<String,String> my_map = new HashMap<String,String>();
          SimpleHash my_map = new SimpleHash();
          my_map.put("1", "ehow");
          my_map.put("2", "laomiao");
          my_map.put("3", "yukai");
          my_map.put("zt", "北京中天諾士達(dá)");

          SimpleHash my_map2 = new SimpleHash();
          my_map2.put("1", "ehow2");
          my_map2.put("2", "laomiao2");
          my_map2.put("3", "yukai2");
          my_map2.put("zt", "北京中天諾士達(dá)2");

          SimpleHash my_map3 = new SimpleHash();
          my_map3.put("1", "ehow3");
          my_map3.put("2", "laomiao3");
          my_map3.put("3", "yukai3");
          my_map3.put("zt", "北京中天諾士達(dá)3");

          SimpleHash my_map4 = new SimpleHash();
          my_map4.put("1", "ehow4");
          my_map4.put("2", "laomiao4");
          my_map4.put("3", "yukai4");
          my_map4.put("zt", "北京中天諾士達(dá)4");

          // List<Map> userList = new ArrayList<Map>();

          SimpleSequence userList=new SimpleSequence(/*ObjectWrapper.BEANS_WRAPPER*/);
          userList.add(my_map);
          userList.add(my_map2);
          userList.add(my_map3);

          SimpleSequence userList2 = new SimpleSequence();
          userList2.add(my_map4);
          userList2.add(my_map4);
          userList2.add(my_map4);

          root.put("the_list", userList);
          root.put("other_list", userList2);

          <div id="Layer1">
            <table border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#FF0000">
              <tr>
                <td width="100" height="30" align="center" bgcolor="#FFFFFF">代號</td>
                <td width="100" align="center" bgcolor="#FFFFFF">代號2</td>
                <td width="100" align="center" bgcolor="#FFFFFF">代號3</td>
                <td width="405" height="30" align="center" bgcolor="#FFFFFF">明細(xì)</td>
              </tr>
              <#list the_list as list>
              <tr>
                <td width="100" height="30" align="center" bgcolor="#FFFFFF">${list["1"]}</td>
                <td width="100" align="center" bgcolor="#FFFFFF">${list["2"]}</td>
                <td width="100" align="center" bgcolor="#FFFFFF">${list["3"]}</td>
                <td height="30" align="center" bgcolor="#FFFFFF">${list.zt}</td>
              </tr>
              </#list>
              <#list other_list as list2>
              <tr>
                <td width="100" height="30" align="center" bgcolor="#FFFFFF">${list2["1"]}</td>
                <td width="100" align="center" bgcolor="#FFFFFF">${list2["2"]}</td>
                <td width="100" align="center" bgcolor="#FFFFFF">${list2["3"]}</td>
                <td height="30" align="center" bgcolor="#FFFFFF">${list2["zt"]}</td>
              </tr>
              </#list>
            </table>
          </div>


          d) 與Hibernate結(jié)合
          DAO
          String hql = "select new map(s.s_name as s_n,s.s_addr as s_a,h.h_addr as h_a,u.u_name as u_n) from User_school as s,User_home as h,User_info as u where u.id=h.id and h.id=s.id";
          // String hql = "select new map(s.s_name as s_n,s.s_addr as s_a) from User_school as s";
          List my = session.createQuery(hql).list();
          Hello hello = new Hello();
          hello.sayHello(my);


          通用方法
          public void sayHello(List info){
          ...
          root.put("from_db", info);
          ...
          }

          FTL
          <#list from_db as db>
          ${db.s_n}
          ${db.s_a}
          ${db.h_a}
          ${db.u_n}
          </#list>
          e) 我們的項(xiàng)目
          <#assign n = list5?size /> //定義n的值為list5的大小
          <#if n gt 6> //如果n大于6,頁面中可能要求只顯示6條
          <#assign n = 6 /> //把n重定義為6
          </#if>
          <#if n!=0> //防止n的值為0,也可以寫成<#if n gt 0 >
          <#list 0..(n-1) as i> //把前 n 條 記錄賦值給 i,如果i=3,則[0,1,2]
          <#assign ls5 = list5[i] /> //把list5的第i個(gè)元素賦值給ls5
          <#assign isNew = list5Istrue[i] />
               <tr>
          <td height='25' class='z3'>.<a href='#' onclick="zw('${ls5.CIid}','905','活動展示','');">
          <#if ls5.CTitle?length lt 15> //如果Ctitle的長度小于15,就
          ${ls5.CTitle} //就正常顯示該標(biāo)題
          <#else> //如果大于15
          ${ls5.CTitle[0..15]}... //就截取前15個(gè),并加上…
          </#if>
          <#if isNew="true">
          <img src='/model/img/new-111.gif' width='27' height='11' border='0' />
          </#if>
          </a></td>
          </tr>
          </#list>
          </#if>
          posted on 2008-12-11 14:34 禮物 閱讀(1540) 評論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 开江县| 陇西县| 石林| 蓬莱市| 江山市| 宣汉县| 河西区| 维西| 宜黄县| 天峨县| 阿瓦提县| 清流县| 常宁市| 军事| 抚宁县| 大埔县| 阿瓦提县| 石泉县| 延边| 和平区| 曲麻莱县| 丁青县| 大竹县| 上虞市| 宝坻区| 米泉市| 华蓥市| 高邮市| 延长县| 丰城市| 开远市| 蚌埠市| 萨迦县| 永嘉县| 泸西县| 黎城县| 花垣县| 府谷县| 通河县| 宜黄县| 阳谷县|