<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Terry.Li-彬

    虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
    1. 模板+數據模型=輸出
    2. 數據模型
    a) 類似目錄的變量稱為hashes,包含保存下級變量的唯一的查詢名字,充當其它對象的容器,每個都關聯唯一的查詢名字
    b) 類似文件的變量稱為scalars,保存單值,有兩種類型
    i. 字符串:用引號括起,單引號or雙引號
    ii. 數字:不用引號
    iii. 日期:可以是日期,時間或日期-時間
    iv. 布爾值:true或false,通常在<#if …>標記中使用
    v. 對scalars的訪問從root開始,各部分用”.”分隔,如 animals.mouse.price
    c) 另外一種變量是sequences,和hashes類似,充當其它對象的容器,按次序訪問,只是不使用變量名字,而使用數字索引,如animals[0].name,索引值從0開始
    d) 通常每個變量具有上述的一種能力,但一個變量可以具有多種上述能力
    e) 方法
    i. ${avg(3,5,20)} ${avg(student.zhangyaang.age,student.situ.age)}
    f) 宏和變換器:用戶自定義的指令(FTL標記)
    g) 節點:樹形結構中的一個節點,常用于xml處理中
    3. 模板
    a) 文本:直接輸出
    b) ${…}:稱為interpolations,FreeMarker會在輸出時用實際值代替,或#{},只用于文本中
    c) FTL標記:類似于HTML,為了與HTML區分,用#開始,有的以@開始,不會輸出,區分大小寫,FTL標記不能位于另一個FTL標記內部
    d) 注釋:<#--和-->,不會輸出
    e) 多余的空白字符會在模板輸出時移除
    f) 指令
    i. 使用FTL標記引用指令,有三種FTL標記
    1. 開始標記:<#name prarm>
    2. 結束標記:</#name>
    3. 空內容指令標記:<#name param />
    ii. 有兩種類型的指令:預定義指令和用戶定義指令,用戶定義指令要用@替換#
    iii. FTL標記不能夠交叉,應該正確嵌套
    iv. 如果使用不存在的指令,FreeMarker會產生錯誤消息
    v. < , </ 和指令間不允許有空白字符
    g) 表達式
    i. 字符串
    1. 使用單引號或雙引號限定
    2. 特殊字符要轉義
    3. raw字符串,可以認為是文本,其中的$和{等不具有特殊含義,該類字符串在引號前面加r,如${r”${foo}”} ${r”c:"foo"bar”}
    ii. 數字
    1. 直接輸入,不需要引號
    2. 精度數字使用”.”分隔,不能使用分組符號
    3. 不支持科學計數法
    4. 不能省略小數點前面的0
    5. 數字8 ,+8 ,08和8.00 都是相同的
    iii. 布爾值:true 和 false, 不使用引號
    iv. 序列
    1. 有逗號分隔的子變量列表,有方括號限定,如:
    <#list [“winter”, ”spring”, ”summer”, ”autumn”] as x>
    ${x}
    </#list>
    2. 列表的項目是表達式,如:
    [2+2, [1,2,3,4], ”whatnot”]
    3. 可以使用數字范圍定義數字序列,如:
    2..5等同于[2,3,4,5] 注意:數字范圍沒有方括號 如:5..2
    4. 散列(hash) 由逗號的鍵/值列表,有大括號限定,鍵和值之間用冒號分隔
    {“name”:”zhangyang”,”age”:23} 鍵和值都是表達式,但鍵必須是字符串
    v. 獲取變量
    1. 頂層變量:${variable}, 變量名只能是字母, 數字, 下劃線, $, @ 和# 的組合, 不能以數字開頭
    2. 從散列中獲取數據
    a) school.student.name
    b) school.[“student”].name
    c) school[“student”][“name”]
    說明:使用點語法,變量名有頂層變量一樣的限制, 方括號語法沒有該限制
    3. 從序列獲(sequences)得數據: 和散列的方括號語法一樣, 只是方括號的表達式值必須是數字; 注意: 第一個項目的索引是0
    4. 序列片段: 使用[startIndex..endIndex]語法, 從序列中獲得片段(也是序列)
    5. 特殊變量: FreeMarker內定義的變量, 使用 .variablenae 語法訪問
    vi. 字符串操作
    1. Interpolation(或連接操作)
    a) 可以使用${..} 或#{..} 在文本部分插入表達式的值,
    如${“Hello ${user}”} 等于 ${“Hello”+user}
    b) ${..} 只能用于文本部分, 不用于FTL表達式中
    2. 子串
    假設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> 結果: joe的值為30
    ix. 算術運算
    1. +, -- , *, /, %
    ${x / 2}
    2. 操作符兩邊必須是數字
    3. 使用 “+” 操作符時,如果一邊是數字, 一邊是字符串, 就會自動將數字轉換為字符串, 如: ${3+”4”} 結果 34
    4. 使用內建的 int 獲得整數部分
    ${1.1?int} ?1
    ${1.999?int} ?1
    ${(5/2)?int} ?2
    5. 比較操作符
    a) 使用=(或==,完全相等)測試兩個值是否相等, 使用!=測試兩個值是否不相等
    b) = 和!= 兩邊必須是相同類型的值
    c) FreeMarker是精確比較,”x”,”x “和”x”是不等的
    d) 對數字和日期可以使用<, <=, >, 和>=, 但不用用于字符串
    e) 由于FreeMarker 會將>解釋成FTL標記的結束字符, 所以對于>和>=可以使用括號來避免這種情況, 如<#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. 內建函數
    a) 內建函數的用法類似訪問散列的子變量, 只是用”?”|替代”,”
    b) 用于字符串
    i. html: 對字符串進行html編碼
    ii. cap_first: 將字符串轉換成第一個字母大寫
    iii. lower_case: 小寫
    iv. upper_case: 大寫
    v. trim: 去掉字符串前后的空白字符
    c) 用于序列
    i. size: 獲得序列中元素的數目
    d) 用于數字
    i. int: 取得數字的整數部分
    e) 例子:
    test = “tom & jerry”
    ${test?html} ? tom &amp; jerry
    ${test?upper_case?html} ? TOM &amp; JERRY
    8. 操作符優先順序
    h) Interpolation(只用于文本部分)
    i. Interpolation有兩種類型
    1. 通用Interpolation: ${expr}
    a) 插入字符串值: 直接輸出表達式結果
    b) 插入數字值: 根據缺省格式(由#setting指令設置)將表達式轉換成文本輸出; 可以使用內建函數string格式化單個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. 數字Interpolation: ${expr} 或#{expr ; format}
    3. 插入日期: 根據缺省格式(#setting) 將表達式結果轉換成文本輸出; 可以使用內建的函數string 格式化單個Interpolation, 例子:
    ${update?string(“yyyy-MM-dd HH:mm:ss zzzz”)}
    4. 插入布爾值: 說明同上
    <#assign foo = true/>
    ${foo?string(“yes”,”no”)} ?yes
    5. 數字Interpolation的#{expr ; format}形式可以用來格式化數字, format可以是
    a) mX: 小數部分最小X位
    b) MX: 小數部分最大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. 應用
    <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. 應用
    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", "北京中天諾士達");

    SimpleHash my_map2 = new SimpleHash();
    my_map2.put("1", "ehow2");
    my_map2.put("2", "laomiao2");
    my_map2.put("3", "yukai2");
    my_map2.put("zt", "北京中天諾士達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", "北京中天諾士達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", "北京中天諾士達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">明細</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結合
    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) 我們的項目
    <#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個元素賦值給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} //就正常顯示該標題
    <#else> //如果大于15
    ${ls5.CTitle[0..15]}... //就截取前15個,并加上…
    </#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 禮物 閱讀(1537) 評論(0)  編輯  收藏 所屬分類: java
    主站蜘蛛池模板: 国产精品永久免费10000| 免费观看a级毛片| 亚洲一级毛片在线观| 免费看a级黄色片| 成人免费一区二区三区| 国内永久免费crm系统z在线| 久久夜色精品国产嚕嚕亚洲av| 亚洲一区免费视频| 免费人妻精品一区二区三区| 亚洲国产精品无码专区| 在线免费观看一区二区三区| 三年在线观看免费观看完整版中文| 亚洲精品在线免费看| 亚洲国产专区一区| 97国产免费全部免费观看| 日日摸夜夜添夜夜免费视频 | 18成禁人视频免费网站| 亚洲大码熟女在线观看| 久久久久久a亚洲欧洲aⅴ| 四虎成人免费网址在线| 日韩精品无码免费一区二区三区| 亚洲欧美日韩中文高清www777 | 久久精品国产精品亚洲人人| 91免费资源网站入口| 最新国产乱人伦偷精品免费网站 | 国产亚洲综合成人91精品| 毛片免费观看的视频在线| 日本视频免费高清一本18| 国产综合激情在线亚洲第一页 | 免费大片av手机看片| 亚洲午夜精品在线| 亚洲国产精品一区第二页| 免费看国产精品麻豆| 成年女人看片免费视频播放器| 免费毛片在线看不用播放器| 国产精品久久久久久亚洲小说| 亚洲码一区二区三区| 国产成人亚洲综合无码精品| 国产精品亚洲产品一区二区三区| 性色av无码免费一区二区三区| 日韩午夜理论免费TV影院|