Как повторить вывод текста через простой цикл for в Facelets без модели?

Как повторить вывод некоторого контента в JSF, используя только стандартные теги (ui:, h: и т. д.)? Другими словами, как сделать эквивалент PHP-кода ниже в JSF? Я сразу хотел воспользоваться ui:repeat, но он требует сбора - у меня есть только номер.

for ($i = 0; $i < 10; $i++) {
    echo "<div>content</div>";
}

person marioosh    schedule 07.11.2011    source источник


Ответы (2)


JSF 2.3+

Если вы уже используете JSF 2.3+, вы можете использовать begin/end атрибуты <ui:repeat>.

xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
...
<ui:repeat begin="1" end="10">
    <div>content</div>
</ui:repeat>

JSF 2.2-

Если вы еще не используете JSF 2.3, то либо используйте <c:forEach> (правда, смешивание JSTL с JSF иногда не одобряется, но это не должно навредить в вашем конкретном случае, потому что вы, похоже, хотите создать представление статически; оно не зависит от каких-либо динамических переменных ):

xmlns:c="http://java.sun.com/jsp/jstl/core"
...
<c:forEach begin="1" end="10">
    <div>content</div>
</c:forEach>

Или создайте функцию EL для создания фиктивного массива для <ui:repeat>:

package com.example.util;

public final class Functions {

    private Functions() {
        //
    }

    public static Object[] createArray(int size) {
        return new Object[size];
    }
}

который зарегистрирован в /WEB-INF/util.taglib.xml:

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    version="2.0">
    <namespace>http://example.com/util/functions</namespace> 
    <function>
        <function-name>createArray</function-name>
        <function-class>com.example.util.Functions</function-class>
        <function-signature>Object[] createArray(int)</function-signature>
    </function>
</facelet-taglib>

и используется следующим образом

xmlns:util="http://example.com/util/functions"
...
<ui:repeat value="#{util:createArray(10)}">
    <div>content</div>
</ui:repeat>
person BalusC    schedule 07.11.2011
comment
@jFrenetic: я был почти уверен, что об этом когда-либо сообщалось/запрашивалось в базе данных проблем JSF/Facelets, но после более чем 15-минутного поиска я ничего не могу найти. - person BalusC; 07.11.2011
comment
@BalusC Что вы думаете о смешивании JSTL с веб-приложением JSF? Я встречался с мнениями, что это не очень хороший подход? - person marioosh; 07.11.2011
comment
Это нормально смешивать, вы должны только помнить, что JSTL запускается во время сборки представления, а JSF запускается во время рендеринга представления. Если вы собираетесь использовать JSTL для целей отображения времени рендеринга, то это плохо. Или когда вы собираетесь использовать JSTL, когда уже есть компонент/атрибут JSF для той же цели, это тоже плохо. В данном конкретном случае вы не можете сделать это с компонентом JSF, и вы, похоже, не используете его для времени рендеринга просмотра (иначе у вас действительно была бы коллекция), так что все должно быть в порядке. - person BalusC; 07.11.2011
comment
См. также stackoverflow.com/ вопросы/3342984/ - person BalusC; 07.11.2011
comment
Благослови вас за то, что вы нашли время, чтобы поддерживать качество ваших сообщений. знак равно - person casperOne; 03.01.2012
comment
Запрос на улучшение от @BalusC был закрыт, поскольку он был продублирован другим запросом: java.net/jira/ browse/JAVASERVERFACES_SPEC_PUBLIC-1102 Все, кто хотел бы улучшить ui:repeat, должны пройти по этой ссылке, зарегистрироваться на java.net и проголосовать за этот запрос. Прошло больше года с момента первоначального запроса BalusC, слишком долго ждать! - person Mr. Lance E Sloan; 31.01.2013
comment
@LS: если вы используете OmniFaces, проверьте of:createArray() и of:createIntegerArray(): showcase-omnifaces .rhcloud.com/showcase/functions/Arrays.xhtml - person BalusC; 31.01.2013
comment
Спасибо за предложение, @BalusC. Я не использую OmniFaces, но обязательно проверю. Я устал от плохой реализации самых основных функций JSF. - person Mr. Lance E Sloan; 01.02.2013
comment
Вау круто. Это именно то, что мне нужно. - person Dan Torrey; 07.03.2014

Поскольку ему нужна коллекция, вы можете создать коллекцию (содержащую столько элементов, сколько раз вы хотите вывести элементы div) в вспомогательном компоненте:

public class MyBean {
  private List list = new ArrayList<Integer();

  { ... populate the list with numbers, for example ... }

  public List getList() {
     return list;
  }
 ...
}

а потом:

<ui:repeat value="#{myBean.list}" var="item">
  <div>content</div>
</ui:repeat>

.. который будет выводить столько div, сколько размер свойства list.

person Konstantin Yovkov    schedule 07.11.2011
comment
Да, но он должен генерировать список в классе. Я думал о чем-то простом, как в PHP;) - person marioosh; 07.11.2011
comment
ЭТО правильный ответ. ui:repeat — безопасный для jsf способ выполнения jstl c:foreach. - person Calabacin; 15.09.2015
comment
Да, конечно, это лучший способ сделать это. - person Rob Grant; 19.01.2016