博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模板引擎StringTemplate使用
阅读量:5919 次
发布时间:2019-06-19

本文共 4486 字,大约阅读时间需要 14 分钟。

hot3.png

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
map = new HashMap
();// 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
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
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
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:{ $it$ }$ 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|$col$}$ from users");        st.setAttribute("columns","a");        st.setAttribute("columns","b");        System.out.println(st.toString());    }

 

 

 

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

你可能感兴趣的文章
Android利用SQLiteStatement提高数据库插入数据的效率
查看>>
socketpair的使用
查看>>
不要一辈子靠技术生存,要随环境变化而改变。外圆内方(转)
查看>>
Matlab画图-非常具体,非常全面
查看>>
hadoop 2.6全分布安装
查看>>
自建数据源(RSO2)、及数据源增强
查看>>
java将图片转换成二进制
查看>>
shell 批量压缩指定文件夹及子文件夹内图片
查看>>
Offer是否具有法律效力?
查看>>
c++异常详解
查看>>
几个经典分治算法
查看>>
Qt部件学习之-烧鹅
查看>>
关于Mantis变更日志(Changelog)和路线图(Roadmap)的说明
查看>>
Android文字的复制和粘贴
查看>>
Android平台的音乐资源管理与播放
查看>>
C#开发微信门户及应用(25)-微信企业号的客户端管理功能
查看>>
完善ecshop的mysql类
查看>>
Html的空格显示
查看>>
SQL复制表及表结构
查看>>
Oracle merge into 使用记录
查看>>