2013-08-26 2 views
7

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

не могли бы вы помочь? благодаря

+2

Если вы можете перебирать коллекцию java, вы можете отправить туда список результатов и сделать это. Это должно быть довольно стандартным для любого механизма шаблонов ... – Thihara

ответ

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

18

Синтаксис выглядит

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

В этом примере я итерация по списку и печати каждому. Результат, который будет напечатан, следующий:

Cats Birds Turtles 

Мы можем изучить синтаксис, который делает это возможным. Прежде чем мы это сделаем, помните, что разделители по умолчанию в StringTemplate меньше < и больше >. Поскольку мы не указывали разные разделители, это будет то, что мы используем в нашем примере. See more about delimiters

:{ } 

Этот набор символов, двоеточие : и открытый и закрытый скобка {} может быть прочитана как «для каждого». В примере шаблона код считывает для каждого 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 

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

+0

Что произойдет, если Кошки (например,) являются классами Cats, а не строкой. Я хочу сказать, что, если в списке может быть список. Как решить эту проблему. Я столкнулся с проблемами, анализируя это, получив «никакого исключения элемента». Может кто-то помочь – AnirbanDebnath

+1

Я не знаю, что я могу полностью ответить на ваш вопрос в комментарии. Я попробую хотя. Если вы повторяете свои собственные классы, вы можете позвонить получателям. в примере можно сказать, что каждая команда является классом Team, который имеет метод getName. Мы можем позвонить , который вызовет этот метод. "<команды: {team | }>" interface Team { public String getName(); } @AnirbanDebnath –

+1

@AnirbanDebnath Я обновил пример, чтобы ответить на ваш вопрос. Надеюсь, это поможет. –