Как да предам аргумент на метод от изобразен h:outputText?

Показвам таблица с данни от sql заявка и искам да изобразя част от код въз основа на една от стойностите на полето от тази sql заявка.

Преглед: records.xthml

<table>
  <thead>
    <tr>
      <td>#{messages['table.header.id']}</td>
      <td>#{messages['table.header.name']}</td>
      <td>#{messages['table.header.date.added']}</td>
      <td>&nbsp;</td>
    </tr>
  </thead>
  <tbody>
    <a4j:repeat value="recordListBean.records" var="listedRecord" rowKeyVar="index">
      <tr>
        <td><h:outputText value="#{listedRecord.id}</td>
        <td><h:outputText value="#{listedRecord.name}</td>
        <td>
          <h:outputText value="#{listedRecord.dateAdded}" rendered="#{viewRecordBean.currentRecord(listedRecord.id)}" />
          <h:outputText value="#{messages['table.header.record.archived']}" rendered="!#{viewRecordBean.currentRecord(listedRecord.id)}" />
        </td>
      </tr>
    </a4j:repeat>
  </tbody>
</table>

Контролер: ViewListBean.java

public boolean currentRecord(Long recordId) {
  Long maxRecordId = 10;
  if (recordId <= maxRecordId) {
    return true;
  } else {
    return false;
  }
}

Въпросните два реда код records.xhtml са:

<h:outputText value="#{listedRecord.candidate}" rendered="#{viewRecordBean.currentRecord(listedRecord.id)}" />
<h:outputText value="#{messages['table.header.record.archived']}" rendered="#{!viewRecordBean.currentRecord(listedRecord.id)}" />

Искам да мога да предам аргумент в рамките на изобразената проверка и да върна булево значение за изобразяване или не. Да кажем, че има 20 записа, върнати в тази sql заявка. Ако стойността recordId на текущия ред е по-малка или равна на 10, тя ще върне вярно и ще се покаже полето listedRecord.dateAdded. В противен случай ще върне false и ще се покаже думата Archived.

Това ли е правилният начин за предаване на аргумент от JSF генерирана XHTML страница към метода на контролиращия bean?

Има ли по-добър или по-ефективен начин да направите това?


person DrewShirts    schedule 24.02.2012    source източник
comment
Ако бях на твое място, бих направил нещо подобно: value="#{viewRecordBean.currentRecord(listedRecord.id) ? listedRecord.candidate : messages['table.header.record.archived']}" . Вместо два реда имате само един и проверявате условието само веднъж.   -  person Piotr Sagalara    schedule 12.04.2017


Отговори (1)


Имате само една грешка: ! трябва да влезе в EL израза.

т.е. това е невалидно:

rendered="!#{viewRecordBean.currentRecord(listedRecord.id)}" 

трябва да бъде:

rendered="#{!viewRecordBean.currentRecord(listedRecord.id)}" 

За остатъка изглежда, че трябва да работи добре, ако приемем, че вашата среда поддържа EL 2.2. Бих използвал само <h:dataTable>, тъй като това елиминира HTML шаблона.

person BalusC    schedule 24.02.2012
comment
Благодаря за бързия отговор!! Аз съм доста начинаещ в JSF/Java/EL и т.н. Как да разбера какъв EL поддържа моят стек? - person DrewShirts; 24.02.2012
comment
Зависи от сървъра и версията на web.xml. Вижте също stackoverflow.com/questions/5273729/ - person BalusC; 24.02.2012
comment
Изглежда, че използвам jboss-el-2.0.1. с Мохара. - person DrewShirts; 25.02.2012
comment
Засега трябва да запазя HTML шаблона, така че все още трябва да използвам опцията a4j:repeat. Когато направя това, listedRecord.id отказва да премине към viewRecordBean.currentRecord(listedRecord.id) метода като нещо друго, но не и нула. Не съм сигурен как да получа действителната стойност. - person DrewShirts; 27.02.2012
comment
Моя грешка... това всъщност работи. Вече успях да проверя дали стойността на параметъра действително се предава правилно. Благодаря отново за помощта!! - person DrewShirts; 27.02.2012