天天看點

模闆引擎StringTemplate使用

1,特點

1,強制Model和View的分離,也就是View負責呈現,不能修改Model。同時View中不用來包括任何業務邏輯

2,Lazy-Evaluation,所有的Attribute直到st.ToString()調用時才evaluate.這樣的好處是setAttribute是Order  Independent。

3,Recursive enable。

2,屬性(attribute)

StringTemplate文法有兩種組成元素,一種是屬性(attribute),另一種是普通字元(plain text)。在$…$中包圍的是屬性,其餘的都是普通字元。比如:

select $column$ from $table$ 
           

其中紅色部分的$column$和$table$都是屬性。在模闆引擎呈現,即調用st.ToString()時,屬性被實際值替換,而普通字元原封不動地輸出。

我們可以通過下面的方式來向模闆“填充”(push)屬性:

public static void valid1(){
        StringTemplate st = new StringTemplate("select $column$ from $table$");
        st.setAttribute("column","123");
        st.setAttribute("table","234");
        System.out.println(st.toString());
    }
           

屬性的填充方式很簡單,就是調用attribute.ToString()方法的結果,如果attribute是null不會抛出異常,而是輸出空字元串。

Map值 填充

public static void valid2(){
        StringTemplate st = new StringTemplate("select $column$ from $table$");
        Map<String,Object> map = new HashMap<String,Object>();
//        map.put("column","123");
//        map.put("table","234");
        st.setAttributes(map);
        map.put("column","123");
        map.put("table","234");
        System.out.println(st.toString());
    }
           

對象值填充

public class Query {
    private String column ;
    private String table ;
    private String TABLE ;

    public String getColumn() {
        return column;
    }

    public void setColumn(String column) {
        this.column = column;
    }

    public String getTable() {
        return table;
    }

    public void setTable(String table) {
        this.table = table;
    }

    public String getTABLE() {
        return TABLE;
    }

    public void setTABLE(String TABLE) {
        this.TABLE = TABLE;
    }
}

    /**
     * 傳對象
     */
    public static void valid3(){
        StringTemplate st = new StringTemplate("select $b.column$ from $b.table$");
        Query query = new Query();
        query.setColumn("abc");
        query.setTable("bcd");
        query.setTABLE("fff");
        st.setAttribute("b",query);
        System.out.println(st.toString());
    }
           

間接屬性值填充

public static void valid4(){
        StringTemplate st = new StringTemplate("$q.(property)$");
        Query query = new Query();
        query.setColumn("123");
        query.setTable("ttttt");
        query.setTABLE("TTTTT");
        st.setAttribute("q",query);
        st.setAttribute("property","table");
        System.out.println(st.toString());
    }
           

有些StringTemplate的保留字(reserved keyword),是不能作為屬性的:

模闆引擎StringTemplate使用

如果attribute中的property和這些保留字重複了,StringTemplate就會報錯,解決方案是使用間接屬性:

class Query
{
    public string first = "NumberOne";
}
 
StringTemplate st = new StringTemplate("select $q.(IndirectAttr)$");
 
Query q = new Query();
st.SetAttribute("q", q);
st.SetAttribute("IndirectAttr", "first");
Console.WriteLine(st.ToString());  //select NumberOne
//或者直接用Literal String: select $q.("first")$
           

2.2,多值屬性(multi-valued attribute)

所謂多值屬性其實就是像數組一樣的可疊代對象。多值屬性通常有兩種輸出方式:1,類似于String.Join()的拼接。2,疊代。

A)拼接

public static void valid1(){
        StringTemplate st = new StringTemplate("select $columns$ from users");
        List<String> columns = new ArrayList<>();
        columns.add("a");
        columns.add("b");
        st.setAttribute("columns",columns);
        System.out.println(st.toString());
    }//select ab from users
           
public static void valid2(){
        StringTemplate st = new StringTemplate("select $columns; separator=\",\"$ from users");
        List<String> columns = new ArrayList<>();
        columns.add("a");
        columns.add("b");
        st.setAttribute("columns",columns);
        System.out.println(st.toString());//select a,b from users
    }
           
public static void valid3(){
        StringTemplate st = new StringTemplate("select $columns; separator=dilimiter$ from users");
        List<String> columns = new ArrayList<>();
        columns.add("a");
        columns.add("b");
        st.setAttribute("dilimiter",",");
        st.setAttribute("columns",columns);
        System.out.println(st.toString());//select a,b from users
    }
           

B)疊代

//-----------------------  疊代  -------------------------
    public static void valid4(){
        StringTemplate st = new StringTemplate("select $columns:{ <i>$it$</i> }$ from users");
        st.setAttribute("columns","a");
        st.setAttribute("columns","b");
        System.out.println(st.toString());
    }

    public static void valid5(){
        StringTemplate st = new StringTemplate("select $columns:{col|<i>$col$</i>}$ from users");
        st.setAttribute("columns","a");
        st.setAttribute("columns","b");
        System.out.println(st.toString());
    }
           

版權聲明:本文為CSDN部落客「weixin_33744854」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_33744854/article/details/91931868