Подтвердить что ты не робот

Как я могу перебирать java-список в stringtemplate?

Я хочу выполнить итерацию результатов запроса на спящий режим внутри stringtemplate. Я искал примеры, но ничего не могу найти.

можете ли вы помочь? спасибо

4b9b3361

Ответ 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 меньше < и больше чем >. Поскольку мы не указали другой разделитель < >, мы будем использовать его в нашем примере. Подробнее о разделителях

:{ }

Этот набор символов, двоеточие : и открытая и закрытая фигурная скобка {} могут читаться как "для каждого". В примере шаблоне код считывает для каждой team в teams печати team. Левая сторона вертикальной трубы | указывает переменную, которая будет создана для каждой итерации. Он будет удерживать текущую команду из списка команд. Печать состоит из <team> на правой стороне вертикальной трубы | и левая сторона закрывающей скобки }. Все, что находится на правой стороне вертикальной трубы | и до закрытия базы } будет оцениваться для печати.

:{ 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(). Подробнее о функциях здесь

Давайте немного увеличим сложность шаблонов, чтобы добавить их в нашу вторую итерацию.

Сначала мы создадим наш 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 предлагает инструменты для упрощения этой комбинации частичных шаблонов. Если вам интересно объединить шаблоны, вы можете узнать больше здесь

Ответ 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 - это список моей модели. Я использовал спящий режим для извлечения записей.