【问题标题】:how do I iterate though a java list in stringtemplate?如何遍历 stringtemplate 中的 java 列表?
【发布时间】:2013-08-26 05:08:23
【问题描述】:

我想遍历字符串模板中的休眠查询结果。我一直在寻找示例,但找不到任何东西。

你能帮忙吗?谢谢

【问题讨论】:

  • 如果您可以遍历 java 集合,那么您可以将结果列表发送到那里并执行此操作。它应该是任何模板引擎的标准......

标签: java stringtemplate-4


【解决方案1】:

语法看起来像

<items :{ item | <item> }>

用 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());

在此示例中,我遍历列表并打印teams 列表中的每个团队。打印出来的结果是:

Cats Birds Turtles 

我们可以探索实现这一点的语法。在我们开始之前,请记住,StringTemplate 中的默认分隔符小于&lt; 并且大于&gt;。由于我们没有指定不同的分隔符 &lt; &gt; 将是我们在示例中使用的。See more about delimiters

:{ }

这组符号,冒号: 和左大括号{} 可以读作“for each”。在示例模板中,代码读取,对于teams 中的每个team,打印team。垂直管道| 的左侧表示将为每次迭代创建的变量。它将保存团队列表中的当前团队。打印由垂直管道右侧的&lt;team&gt; | 和闭合大括号的左侧} 组成。垂直管道| 右侧和闭合底座} 之前的任何内容都将被评估为打印。

:{ current value | everything in here will be printed }

为了构建这个概念,让我们使用更复杂的数据结构。

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; }
}

现在我们可以为我们的团队创建一些球员:

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());

给出结果

Bill is 29
Steve is 30
Toby is 15

有几点需要注意。我们没有直接访问属性年龄和名称。 ST 调用了 getAge 和 getName 方法。 ST不看属性。相反,它会寻找访问方法。

如果我们只是想遍历一个包含另一个列表的列表怎么办。我们也可以这样做。 首先,让我们建立我们的数据结构并用几个列表填充它。

List<List<String>> listOfLists = asList(
    asList("One", "Two", "Three"), 
    asList("Four", "Five"), 
    asList("Six", "Seven", "Eight", "Nine")
);

模板如下所示。

<list :{ items |<items :{ item |<item> }><\n>}>

在这种情况下,我们的模板只是一个组合。外壳会遍历我们将要提交的列表。

 <list :{ items |  what we will print   }>

然后对于每个项目,我们将打印出其列表中的项目。

<items :{ item |<item> }>

一旦我们把它们放在一起

String template = "<list :{ items |<items :{ item |<item> }><\\n>}>";
ST st = new ST( template);
st.add("list", listOfLists);
System.out.println(st.render());

我们得到如下所示的结果。

One Two Three 
Four Five 
Six Seven Eight Nine 

在这个概念的基础上,我们可以创建第二个包含玩家列表的数据结构。这将演示如何在迭代中进行迭代。

我们首先需要的是一个包含列表的数据结构。为此,我们可以创建一个团队让我们的玩家参与其中。

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;
    }
}

请注意,我们的团队中有球员。这种组合将允许我们建立两个迭代。

现在我们有了我们的数据结构,让我们将所有内容组合在一起,组成几个有一些球员的球队。

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)
        ))
);

现在让我们创建一个模板并填写一些细节:

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());

打印出来

Billings has 3 players
Laurel has 4 players

我们的简单模板与上面的第一个模板几乎相同。唯一真正的区别是我们使用的是 ST length() 提供的内置方法。 See more on functions here

让我们稍微增加模板的复杂性,以便在我们的第二次迭代中添加。

首先,我们将创建我们的playersTemplate。这与上面的playerTemplate 模板几乎相同。唯一的区别是我们的玩家来自team:team.players

String playersTemplate = "<team.players :{ player |<player.name> is <player.age><\\n>}>";

现在我们将构建包含第一个模板的第二个模板。在这个模板中,我们可以迭代团队,对于每个团队,我们将打印出name、玩家人数length(team.players),以及playersTemplate 中的所有内容。

String teamTemplate = "<teams:{ team |<team.name> has <length(team.players)> players<\\n>"+playersTemplate+"}>"; 

现在让我们把它们放在一起。

ST teamsTemplate = new ST( simpleTeamTemplate);
teamsTemplate.add("teams", teams);

System.out.println(teamsTemplate.render());

这将为我们打印以下内容。

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

现在,您不会真的想以这种方式组合您的模板。将字符串附加到一起组成模板是相当愚蠢的。 StringTemplate 提供了一些工具来使这种部分模板的组合变得非常容易。如果您对组合模板感兴趣,可以了解更多here

【讨论】:

  • 如果 Cats(例如)是 Cats 类而不是字符串会发生什么。我的意思是,如果列表中可能有一个列表会怎样。我该如何解决这个问题。我正面临解析问题,得到“没有这样的元素异常”。有人可以帮忙吗
  • 我不知道我可以在评论中完全解决您的问题。不过我会试试的。如果您正在遍历自己的类,则可以调用 getter。在示例中,假设每个团队都是一个具有 getName 方法的 Team 类。我们可以调用 来调用该方法。 " }>" 接口 Team { public String getName(); } @AnirbanDebnath
  • @AnirbanDebnath 我已更新示例以回答您的问题。我希望这会有所帮助。
【解决方案2】:
%staffForOrg: {staff|
    <tr>
        <td><a href="#%staff.id%a" class="directory " id="%staff.id%1" onclick="javascript: window.location='StaffInfo.html?id=%staff.id%';">%staff.telephoneNumber%</a></td>

    </tr>
}%

这段代码完美运行。

staffForOrg 是我的模型列表。我使用休眠来检索记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多