mrj*_*per 13 java stringtemplate-4
我想遍历stringtemplate中的hibernate查询结果.我一直在寻找例子但我找不到任何东西.
你能帮忙吗?谢谢
Chu*_*ery 29
语法如下
<items :{ item | <item> }>
Run Code Online (Sandbox Code Playgroud)
将它放在Java中:
List<String> teams = Arrays.asList("Cats", "Birds", "Turtles");
ST s = new ST( "<teams :{team | <team> }>");
s.add("teams", teams);
System.out.println(s.render());
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我遍历List并打印每个.将打印的结果是:
Cats Birds Turtles
Run Code Online (Sandbox Code Playgroud)
我们可以探索实现这一目标的语法.在我们开始之前,请记住,StringTemplate中的默认分隔符小于teams和大于<.由于我们没有指定不同的分隔符,因此我们将在示例中使用这些分隔符.查看更多有关分隔符的信息
:{ }
Run Code Online (Sandbox Code Playgroud)
这组符号,冒号>和开括号和闭括号<可以解读为"for each".在这个例子中模板的代码读取,对每个>在:打印{}.垂直管道的左侧team表示将为每次迭代创建的变量.它将从团队列表中保留当前团队.印刷品由teams垂直管的右侧team和封闭支架的左侧组成|.在垂直管道的右侧<team>和关闭基座之前的任何东西都|将被评估为打印.
:{ current value | everything in here will be printed }
Run Code Online (Sandbox Code Playgroud)
为了构建这个概念,让我们使用更复杂的数据结构.
public class Player {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() { return age; }
public String getName() { return name; }
}
Run Code Online (Sandbox Code Playgroud)
现在我们可以为我们的团队创建一些玩家:
Player[] players = new Player[] {
new Player("Bill", 29),
new Player("Steve", 30),
new Player("Toby", 15)
};
String playerTemplate = "<players:{ player |<player.name> is <player.age> <\\n>}>"
ST s = new ST( playerTemplate );
s.add("players", Arrays.asList(players));
System.out.println(s.render());
Run Code Online (Sandbox Code Playgroud)
给出了结果
Bill is 29
Steve is 30
Toby is 15
Run Code Online (Sandbox Code Playgroud)
几点要注意.我们没有直接访问属性age和name.ST称为方法getAge和getName.ST不会考虑这些属性.相反,它寻找查找访问方法.
如果我们只想迭代包含另一个列表的列表,该怎么办?我们也可以这样做.首先,让我们构建我们的数据结构并用几个列表填充它.
List<List<String>> listOfLists = asList(
asList("One", "Two", "Three"),
asList("Four", "Five"),
asList("Six", "Seven", "Eight", "Nine")
);
Run Code Online (Sandbox Code Playgroud)
模板将如下所示.
<list :{ items |<items :{ item |<item> }><\n>}>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们的模板只是一个组合.外壳将迭代我们将提交的列表.
<list :{ items | what we will print }>
Run Code Online (Sandbox Code Playgroud)
然后,对于每个项目,我们将打印出列表中的项目.
<items :{ item |<item> }>
Run Code Online (Sandbox Code Playgroud)
一旦我们把它们放在一起
String template = "<list :{ items |<items :{ item |<item> }><\\n>}>";
ST st = new ST( template);
st.add("list", listOfLists);
System.out.println(st.render());
Run Code Online (Sandbox Code Playgroud)
我们得到的结果如下所示.
One Two Three
Four Five
Six Seven Eight Nine
Run Code Online (Sandbox Code Playgroud)
基于这个概念,我们可以创建一个包含玩家列表的第二个数据结构.这将演示如何在迭代中进行迭代.
我们需要的第一件事是包含列表的数据结构.为此,我们可以为我们的球员创建一个团队.
public class Team {
private List<Player> players;
private String name;
public Team (String name, List<Player> players) {
this.players = players;
this.name = name;
}
public List<Player> getPlayers() {
return players;
}
public String getName() {
return name;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我们的团队包含玩家.这个组合将允许我们建立两个迭代.
现在我们已经拥有了我们的数据结构,可以将所有内容组合在一起,以便与一些玩家组成几个团
List<Team> teams = asList(
new Team("Billings", asList(
new Player("Bill", 29),
new Player("Steve", 30),
new Player("Toby", 15)
)),
new Team("Laurel", asList(
new Player("Chad", 32),
new Player("Chuck", 29),
new Player("Will", 24),
new Player("Ben", 26)
))
);
Run Code Online (Sandbox Code Playgroud)
现在让我们创建一个模板并填写一些细节:
String simpleTeamTemplate = "<teams:{ team |<team.name> has <length(team.players)> players<\\n>}>";
ST template = new ST( simpleTeamTemplate );
template.add("teams", teams);
System.out.println(template.render());
Run Code Online (Sandbox Code Playgroud)
那将打印出来
Billings has 3 players
Laurel has 4 players
Run Code Online (Sandbox Code Playgroud)
我们的简单模板与上面的第一个模板大致相同.唯一真正的区别是我们正在使用构建方法}.点击此处查看更多功能
让我们在第二次迭代中添加一些模板的复杂性.
首先,我们将创建我们的|.这与我们}上面的模板几乎完全相同.唯一的区别是我们的球员来自length():playersTemplate.
String playersTemplate = "<team.players :{ player |<player.name> is <player.age><\\n>}>";
Run Code Online (Sandbox Code Playgroud)
现在我们将构建包含第一个模板的第二个模板.在这个模板中,我们可以对团队进行迭代,对于每个团队,我们将打印出playerTemplate玩家的数量team和所有内容team.players.
String teamTemplate = "<teams:{ team |<team.name> has <length(team.players)> players<\\n>"+playersTemplate+"}>";
Run Code Online (Sandbox Code Playgroud)
现在让我们把它们放在一起.
ST teamsTemplate = new ST( simpleTeamTemplate);
teamsTemplate.add("teams", teams);
System.out.println(teamsTemplate.render());
Run Code Online (Sandbox Code Playgroud)
这将为我们打印以下内容.
Billings has 3 players
Bill is 29
Steve is 30
Toby is 15
Laurel has 4 players
Chad is 32
Chuck is 29
Will is 24
Ben is 26
Run Code Online (Sandbox Code Playgroud)
现在,您真的不想以这种方式组合模板.将字符串附加到一起构成模板是相当愚蠢的.StringTemplate提供了使部分模板组合非常容易的工具.如果您对组合模板感到好奇,可以在这里找到更多信息