Вызов методов bean с аргументами со страниц JSF - PullRequest
12 голосов
/ 25 декабря 2011

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

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

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

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


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

Ответы [ 3 ]

20 голосов
/ 25 декабря 2011

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

<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 .

10 голосов
/ 25 декабря 2011

Да, это так.

<h:commandButton action="#{bean.method(object)}" />

Смотрите это http://www.mkyong.com/jsf2/4-ways-to-pass-parameter-from-jsf-page-to-backing-bean/

8 голосов
/ 25 декабря 2011

Вы можете вызывать методы 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...