Я хочу перебирать результаты запроса на спящий режим внутри stringtemplate. Я искал примеры, но ничего не могу найти.Как я могу перебирать список java в stringtemplate?
не могли бы вы помочь? благодаря
Я хочу перебирать результаты запроса на спящий режим внутри stringtemplate. Я искал примеры, но ничего не могу найти.Как я могу перебирать список java в stringtemplate?
не могли бы вы помочь? благодаря
%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 для извлечения записей.
Синтаксис выглядит
<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
Что произойдет, если Кошки (например,) являются классами Cats, а не строкой. Я хочу сказать, что, если в списке может быть список. Как решить эту проблему. Я столкнулся с проблемами, анализируя это, получив «никакого исключения элемента». Может кто-то помочь – AnirbanDebnath
Я не знаю, что я могу полностью ответить на ваш вопрос в комментарии. Я попробую хотя. Если вы повторяете свои собственные классы, вы можете позвонить получателям. в примере можно сказать, что каждая команда является классом Team, который имеет метод getName. Мы можем позвонить
@AnirbanDebnath Я обновил пример, чтобы ответить на ваш вопрос. Надеюсь, это поможет. –
Если вы можете перебирать коллекцию java, вы можете отправить туда список результатов и сделать это. Это должно быть довольно стандартным для любого механизма шаблонов ... – Thihara