2011-12-25 3 views
10

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

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

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

Предложения? Благодарю.


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

ответ

18

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

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

с

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

вы можете даже передать fullworthy объекты вдоль вроде как:

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

с

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

Если вы ориентации контейнера сервлетов 2.5, то вы могли бы достичь того же, заменив реализацию EL с помощью, например, JBoss EL, который поддерживает ту же самую конструкцию. См. Также Invoke direct methods or methods with arguments/variables/parameters in EL.

+0

это также возможно внутри тегов или компонентов?Когда я передаю компонент в компонент/тег, я вызываю метод атрибута, который содержит компонент, например. 'Действие = "# {myBean [ 'actionToCall']}"'. С моей точки зрения я не знал, как передать параметр в синтаксисе скобок, отличном от установки его с помощью функции f: setPropertyActionListener, и в этом случае нам нужны скобки над точками, верно? – Louise

+1

@Louise: просто используйте 'action =" # {myBean ['actionToCall'] (someParam)} "'. Обратите внимание, что этот синтаксис имел ошибку в старых версиях Tomcat и Glassfish. Только с Tomcat 7.0.22 и Glassfish 3.1.2 он должен работать правильно. – BalusC

+0

Откуда этот «товар» (или «item.id»)? Может ли это быть как идентификатор выбранной вкладки p: tab в p: tabView (perffaces)? –

7

Вы можете вызывать методы 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> 
+2

+1 thee propertyActionListener - лучший способ для меня – jpganz18

Смежные вопросы