Да пример от nixlike работает очень хорошо.
Инвентарь:
[docker-host]
myhost1 user=barbara
myhost2 user=heather
playbook:
---
- hosts: localhost
connection: local
tasks:
- name: loop debug inventory hostnames
debug:
msg: "the docker host is {{ item }}"
with_inventory_hostnames: docker-host
- name: loop debug items
debug:
msg: "the docker host is {{ hostvars[item]['user'] }}"
with_items: "{{ groups['docker-host'] }}"
output:
ansible-playbook ansible / tests / vars-test-local.yml
PLAY [localhost]
TASK [setup] ****************** ************************************************* ОК : [localhost]
TASK [идентификаторы хостов для отладки цикла] ******************************** ********** ok: [localhost] => (item = myhost2) => {"item": "myhost2", "msg": "хост докера - это myhost2"} ok: [localhost] => (item = myhost1) => {"item": "myhost1", "msg": "хост докера - это myhost1"}
TASK [элементы отладки цикла] ******* ************************************************* ОК : [localhost] => (item = myhost1) => {"item": "myhost1", "msg": "хост докера - это barbara"} ok: [localhost] => (item = myhost2) => {" item ":" myhost2 "," msg ":" хост докера - это вереск "}
PLAY RECAP ********************** *********************************************** localhost: ok = 3 changed = 0 unreachable = 0 failed = 0
blockquote>спасибо!
Вызвано: javax.servlet.ServletException: javax.servlet.jsp.JspTagException: не знаю, как перебирать поставленные «элементы» в
blockquote><forEach>
Это произойдет, когда
<c:forEach items>
не ссылается на действительный объект, по которому он может итерации. Объект должен бытьObject[]
(простой массив),Collection
,Map
,Iterator
,Enumeration
илиString
(см. также исходный код ). Все, что еще нельзя повторить с помощью<c:forEach>
. ВашDetResults
класс не является экземпляром любого из вышеупомянутых типов, поэтому он не сработает.Ваш класс
DetResults
выглядит неправильно. Он выглядит в основном как один бог-боб со совокупностью всех свойств нескольких отдельных объектов. Это неправильно. Класс bean должен представлять не более одного объекта. Перепишите свой классDetResults
, чтобы в итоге вы получили полноценную коллекцию javabeans:List<DetResult> results = detDAO.fetchDetResults(paramBean);
, чтобы вы могли получить к ней доступ следующим образом:
<c:forEach items="${results}" var="result"> ${result.heading} <c:forEach items="${result.data}" var="dataItem"> ${dataItem} </c:forEach> </c:forEach>
вы действительно настаиваете на том, чтобы сохранить свой
DetResults
bean-компонент по своему усмотрению, вы можете получить к нему доступ следующим образом:<c:forEach begin="0" end="${results.columnCount}" varStatus="loop"> ${results.headings[loop.index]} <c:forEach items="${results.data[loop.index]}" var="dataItem"> ${dataItem} </c:forEach> </c:forEach>
См. также:
- Места, где JavaBeans
- Показать JDBC ResultSet в HTML на странице JSP с использованием шаблона MVC и DAO
Не имеет отношения к конкретная проблема, атрибут
<c:forEach var>
неверен. Вы не должны указывать то же имя, что и существующий объект в области. Это будет только столкновение. Но это вопрос нового вопроса, если вы не можете интерпретировать сообщение об ошибке.
Вы должны иметь возможность перебирать заголовки
<tr>
<c:foreach var="heading" items="${results.headings}">
<th>${heading}</th>
</c:foreach>
</tr>
И затем по данным ...
<c:foreach var="row" items="${results.data}">
<tr>
<c:foreach var="i" items="${row}">
<td>${i}</td>
</c:foreach>
</tr>
</c:foreach>
Или что-то в этих строках?