JSF(和PrimeFaces)如何将参数传递给ManagedBean中的方法

时间:2012-03-21 13:09:02

标签: java jsf xhtml primefaces managed-bean

我有一个我在inputtext中显示的Employee对象。 例如,员工的名字显示在inputtext中。当这个名字的值改变时,它调用一个方法。在此之前,我想调用一个方法,该方法将员工的ID保存在managedbean中,以便我知道哪个员工需要更改。 我是怎么做到的,到目前为止我得到了这个:

<h:outputText value="First name:"/>
<p:inplace id="firstname" editor="true">
     <p:ajax event="save" onsuccess="#{employeeController.saveName()}"/>
     <p:inputText id="firstName" value="#{emp.firstName}"  
                  required="true" label="text"
                  valueChangeListener="#{employeeController.firstNameChanged}">
     <p:ajax event="valueChange" listener="#{employeeController.onValueChangedStart}"/>
     </p:inputText>
</p:inplace>

我想我应该使用onValueChangedStart或firstNameChanged方法传递ID。我该怎么做呢?或者有更好的方法吗? emp有一个吸气剂。所以#{emp} .id得到它。

3 个答案:

答案 0 :(得分:11)

假设您确实位于其#{emp}属性公开var的重复组件内,您可以从值更改侦听器中的EL范围中获取它,如下所示:

FacesContext context = FacesContext.getCurrentInstance();
Employee employee = context.getApplication().evaluateExpressionGet(context, "#{emp}", Employee.class);
Long id = employee.getId();
// ...

或者,如果将value的{​​{1}}包裹在<h:dataTable>内,则可以按如下方式获取当前行:

DataModel<Employee>
对具体问题

无关,没有必要为值更改提供两个侦听器方法。请注意,Employee employee = model.getRowData(); Long id = employee.getId(); // ... 使您有机会通过事件同时获取旧值和新值,而valueChangeListener则不会,新值已在此时设置为模型值。如果您同时需要旧值和新值,请删除p:ajax listener的{​​{1}}属性。 listener已经是默认事件的方式,所以也可以删除它。

答案 1 :(得分:5)

使用primefaces ajax,您可以在java中检索输入的值:

public void onValueChanged(AjaxBehaviorEvent event)
{
    Employee employee = (Employee)((UIOutput)event.getSource()).getValue();
    //...
}

<h:selectOneMenu required="true"
    value="#{empl}" converter="#{bean.employeeConverter}">
    <f:selectItems value="#{bean.employees}" var="varEmployee" 
        itemLabel="#{varEmployee}" itemValue="#{varEmployee}"/>
    <p:ajax event="change" listener="#{bean.onValueChanged}"/>
</h:selectOneMenu>

由于您的值是String,或者使用员工Object并使用Converter或其toString()方法,而不是强制转换为员工,因此您将转换为String。

答案 2 :(得分:1)

<p:ajax event="save" onsuccess="#{employeeController.saveName(emp.id)}"/>