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),是不能作為屬性的:
如果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