Вызов методов bean с аргументами из страниц JSF

Можно ли вызвать методы bean и напрямую передать им параметры из представления вместо того, чтобы требовать сначала установить свойства bean, а затем вызвать методы без аргументов с помощью commandButton или аналогичных?

У меня есть список элементов с каждым элементом, имеющим список действий. Чтобы уменьшить состояние, я использую только один простой штрих remoteCommand вместо нескольких commandButton (s). При получении триггера действия из представления я бы назвал remoteCommand из javascript, но так как remoteCommand является одним, но используется для нескольких элементов, поэтому мне нужно также передать идентификатор элемента. Мне интересно, есть ли способ передать идентификатор элемента методу bean непосредственно в качестве аргумента вместо того, чтобы сначала установить его как свойство bean? Есть ли способ сделать это?

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

Предложения? Спасибо.


Использование JSF 2.1.6 Mojarra с Primefaces 3.0RC1

Ответ 1

Аргументы метода передачи поддерживаются с EL 2.2, который является частью Servlet 3.0. Поэтому, если ваш webapp работает на совместимом с Servlet 3.0 контейнере (Tomcat 7, Glassfish 3 и т.д.) С объявленной спецификацией Servlet 3.0 web.xml (что, скорее всего, верно, поскольку вы используете JSF 2.1, который, в свою очередь, неявно требует Servlet 3.0), то вы сможете передать аргументы метода методам действий bean в следующей форме:

<h:commandButton value="Submit" action="#{bean.submit(item.id)}" />

с

public void submit(Long id) {
    // ...
}

Вы даже можете передать полнофункциональные объекты, например:

<h:commandButton value="Submit" action="#{bean.submit(item)}" />

с

public void submit(Item item) {
    // ...
}

Если вы настроили таргетинг на контейнер Servlet 2.5, вы могли бы добиться того же, заменив реализацию EL, например JBoss EL, которая поддерживает ту же конструкцию. См. Также Вызывать прямые методы или методы с аргументами/переменными/параметрами в EL.

Ответ 3

Вы можете вызвать методы ManagedBean с такими аргументами.

<h:commandButton actionListener="#{stateBean.delete(row.stateID)}" 
 value="Delete" id="btnDeleteS">

   <f:ajax event="action" execute="@form" render="@form"/>
</h:commandButton>

Соответствующий ManagedBean будет таким.

@ManagedBean
@RequestScoped
public class StateBean
{
    @EJB
    private RemoteInterface obj=null;

    public void delete(String stateID)
    {
        //Code stuff here.
    }
}

Вы также можете напрямую установить значение свойств ManagedBean с помощью <f:setPropertyActionListener></f:setPropertyActionListener>, как это.

<h:commandButton value="Delete" id="btnDeleteS">

     <f:setPropertyActionListener target="#{stateBean.someProperty}"
       value="#{someValue}"/>
     <f:ajax event="action" execute="@form" render="@form"/>
</h:commandButton>