JSF: сохранить выбранное значение переменной в datatable для следующего просмотра

У меня есть таблица данных:

    <h:dataTable binding="#{table}" value="#{chooseKittens.kittenList}">
      <h:column>
        <p:commandLink value="#{chooseKittens.kittenList[table.rowIndex]}" action="#{chooseKittens.petKitten}"/>
      </h:column>
    </h:dataTable>

DataTable - это ссылка, которая приведет вас на другую страницу. Однако, когда я перехожу на другую страницу, я хочу сохранить значение щелчка по ссылке на команду, чтобы я мог отобразить ее в последующих представлениях. Есть ли способ сделать это без SessionScope? Я посмотрел в t: saveState, но я не уверен, как сохранить только переменную, выбранную в Datatable. Если SessionScope - единственная доступная вещь, есть ли способ сделать список kittenList в другом объеме? (Список котят должен меняться при добавлении нового котенка в базу данных, поэтому он должен быть в RequestScope или ViewScope).

1 ответ

Решение

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

  1. Передайте информацию следующему представлению как параметр GET

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

    <h:link value="Next page" outcome="/view-kitten">
        <f:param name="id" value="#{kitten.id}"/>
    </h:link>
    

    На странице получения параметр доступен через:

    <f:metadata>
        <f:viewParam name="id" value="#{kittenBean.id}/>
    </f:metadata>
    

    Более подробную информацию можно найти в разделе Что можно <f:metadata> а также <f:viewParam> быть использованы для?

  2. Передайте информацию в перенаправленное представление, используя Flash

    В этом случае вы выполняете перенаправление в методе действия командного компонента и присоединяете необходимые данные к целевому представлению, используя Flash объект:

    <h:commandButton value="Next page" action="#{bean.next}"/>
    

    с

    public String next() {
        //do business job
        FacesContext.getCurrentInstance().getExternalContext().getFlash().put("kitten", selectedKitten);
        return "/view-kitten?faces-redirect=true";
    }
    

    Он будет доступен в виде цели через EL с #{flash.kitten} или программно с FacesContext.getCurrentInstance().getExternalContext().getFlash().get("kitten"),

    Расширенный пример можно найти в JSF2.0 - Как получить значения в bean-компоненте другой страницы jsf в области запроса.

Последнее, что следует отметить: не злоупотребляйте HTTP-сессией. Вы не должны загрязнять сессию информацией, которая принадлежит другому.

Другие вопросы по тегам