JSF посмотреть расчеты - PullRequest
       7

JSF посмотреть расчеты

1 голос
/ 06 февраля 2011

Я знаю, что в JSF 2 предпочтительными языками декларации представления являются facelets.

Является ли JSP to jsf устаревшим?

В любом случае мне нужно создать специальный макет, чтобы я не мог использовать Datatable. Вместо этого у меня есть 6 делений, которые я использую в качестве столбцов, в которые я помещаю коллекцию статей. Моя проблема в том, что у меня есть составной компонент JSF, который внедряется с коллекцией A:

List<Article>

объект.

Затем компонент должен разделить размер коллекции на равные части для каждого столбца. Затем установите подходящее смещение и размер для каждого

<ui:repeat></ui:repeat> 

так что я в конечном итоге с этим

<!-- INTERFACE -->
<cc:interface>
    <cc:attribute name="featuredArticles" required="true" type="java.util.List;" />
</cc:interface>

<!-- IMPLEMENTATION -->
  <cc:implementation>
    <div class="col">
       <ui:repeat value="#{cc.attrs.featuredArticles}" var="art" offset="??" size="??">
            <mycomps:article art="#{art}" />
       </ui:repeat>
    </div>
    <div class="col">
       <ui:repeat value="#{cc.attrs.featuredArticles}" var="art" offset="??" size="??">
            <mycomps:article art="#{art}" />
       </ui:repeat>
    </div>
    <div class="col">
       <ui:repeat value="#{cc.attrs.featuredArticles}" var="art" offset="??" size="??">
            <mycomps:article art="#{art}" />
       </ui:repeat>
    </div>
    <div class="col">
       ...same here...
    </div>
    <div class="col">
       ...same here...
    </div>
</cc:implementation>

Так как мне рассчитать эти смещения и размеры, чтобы каждый столбец перебирал часть коллекции? Или, может быть, есть лучший способ?

1 Ответ

3 голосов
/ 07 февраля 2011

Размер коллекции можно получить с помощью fn:length, а в EL есть основные арифметические операторы.

<ui:composition xmlns:fn="http://java.sun.com/jsp/jstl/core">
    ...
    <ui:param name="size" value="#{fn:length(featuredArticles) / 6}" />
    ...
    <ui:repeat size="#{size}">
    ...
</ui:composition>

Обновление : что касается округления, которое становится сложным. В старом JSP вы могли использовать для этого JSTL <fmt:formatNumber>, который может экспортировать в атрибут var вместо отображения его прямо в представлении.

<fmt:formatNumber var="size" value="${fn:length(featuredArticles) / 6}" pattern="0" />

Но JSTL fmt недоступен в Facelets.

Хакерским способом было бы разделить дроби, используя fn:substringBefore.

<ui:param name="size" value="#{fn:substringBefore(fn:length(featuredArticles) / 6, '.')}" />

Но это всегда округляется.

Лучший способ - создать собственную функцию EL. Вы можете найти пример в этом ответе . Для JSF 2.0 вам нужно только заменить устаревший <param-name>facelets.LIBRARIES</param-name> на <param-name>javax.faces.FACELETS_LIBRARIES</param-name>. В конце концов вы получите как:

<ui:param name="size" value="#{x:roundUp(fn:length(featuredArticles) / 6)}" />

В качестве совершенно другой альтернативы вы также можете выполнять эту работу в конструкторе, инициаторе или получателе управляемого компонента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...