Как передать аргумент методу из обработанного 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)}" />

Я хочу иметь возможность передавать аргумент в рамках проверки рендеринга и возвращать логическое значение для рендеринга или нет. Допустим, в этом запросе sql возвращено 20 записей. Если значение recordId текущей строки меньше или равно 10, оно вернет значение true и отобразится поле listedRecord.dateAdded. В противном случае он вернет false и будет отображаться слово Archived.

Является ли это правильным способом передачи аргумента из XHTML-страницы, сгенерированной JSF, в метод управляющего компонента?

Есть ли лучший или более эффективный способ сделать это?


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