h:commandButton внутри h:dataTable

Я использую таблицу данных JSF. Одним из столбцов в таблице является кнопка Command.

Когда эта кнопка нажата, мне нужно передать несколько параметров (например, значение выбранной строки), используя язык выражений. Эти параметры необходимо передать управляемому компоненту JSF, который может выполнять методы для них.

Я использовал следующий фрагмент кода, но значение, которое я получаю в бине JSF, всегда равно нулю.

<h:column>
    <f:facet name="header">
        <h:outputText value="Follow"/>
    </f:facet>

    <h:commandButton id="FollwDoc" action="#{usermanager.followDoctor}" value="Follow" />
    <h:inputHidden id="id1" value="#{doc.doctorid}" />
</h:column>

Метод бобов:

public void followDoctor() {
    FacesContext context = FacesContext.getCurrentInstance();
    Map requestMap = context.getExternalContext().getRequestParameterMap();
    String value = (String)requestMap.get("id1");
    System.out.println("Doctor Added to patient List"+ value);
}

Как передать значения в управляемый компонент JSF с помощью кнопки команды?

1 ответ

Использование DataModel#getRowData() получить текущую строку в методе действия.

@ManagedBean
@ViewScoped
public class Usermanager {
    private List<Doctor> doctors;
    private DataModel<Doctor> doctorModel;

    @PostConstruct
    public void init() {
        doctors = getItSomehow();
        datamodel = new ListDataModel<Doctor>(doctors);
    }

    public void followDoctor() {
        Doctor selectedDoctor = doctorModel.getRowData();
        // ...
    }

    // ...
}

Вместо этого используйте его в таблице данных.

<h:dataTable value="#{usermanager.doctorModel}" var="doc">

И избавиться от этого h:inputHidden сразу после h:commandButton в представлении.


Без элегантной альтернативы является использование f:setPropertyActionListener,

public class Usermanager {
    private Long doctorId;

    public void followDoctor() {
        Doctor selectedDoctor = getItSomehowBy(doctorId);
        // ...
    }

    // ...
}

Со следующей кнопкой:

<h:commandButton action="#{usermanager.followDoctor}" value="Follow">
    <f:setPropertyActionListener target="#{usermanager.doctorId}" value="#{doc.doctorId}" />
</h:commandButton>

Связанные с:

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