模板引擎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),是不能作为属性的:

144731_6jiy_3101476.png

如果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());
    }

 

 

 

转载于:https://my.oschina.net/LucasZhu/blog/1511229

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值