Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSF(和PrimeFaces)如何将参数传递给ManagedBean中的方法_Java_Jsf_Xhtml_Primefaces_Managed Bean - Fatal编程技术网

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

Java JSF(和PrimeFaces)如何将参数传递给ManagedBean中的方法,java,jsf,xhtml,primefaces,managed-bean,Java,Jsf,Xhtml,Primefaces,Managed Bean,我在inputtext中显示了一个Employee对象。 例如,员工的名字显示在inputtext中。当这个名字的值改变时,它调用一个方法。在此之前,我想调用一个方法,将员工ID保存在managedbean中,以便知道需要更改哪个员工。 我如何做到这一点,到目前为止我已经做到了: <h:outputText value="First name:"/> <p:inplace id="firstname" editor="true"> <p:ajax even

我在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来获取它。

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

FacesContext context = FacesContext.getCurrentInstance();
Employee employee = context.getApplication().evaluateExpressionGet(context, "#{emp}", Employee.class);
Long id = employee.getId();
// ...
Employee employee = model.getRowData();
Long id = employee.getId();
// ...
或者,如果将
包装在
数据模型
中,则可以获得当前行,如下所示:

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

与具体问题无关对于值更改,没有必要使用两种侦听器方法。请注意,
valueChangeListener
为您提供了通过事件获取旧值和新值的机会,而
p:ajax listener
则不是,此时新值已设置为模型值。如果需要新旧值,请删除
侦听器
属性。顺便说一下,
event=“valueChange”
已经是默认事件,所以也可以将其删除。

使用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>
public void onValueChanged(AjaxBehaviorEvent事件)
{
Employee=(Employee)((UIOutput)event.getSource()).getValue();
//...
}
不要强制转换为employee,而是强制转换为String,因为您的值是字符串,或者使用employee对象并使用转换器或其toString()方法。

试试看

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


这是否在数据表中?
{emp}
不是
{employeeController}
的属性,乍一看很奇怪。这是在数据表中。所以你给出的答案是有用的,你知道它是否也有可能再次渲染原地吗?它仍然显示旧的值。这似乎不起作用,我用一个带有警报的javascript来测试它是否呈现,它会。但它看起来像是在值更改之前进行渲染。我在刷新页面时使用它,但它的值正确。请提出新问题。这与最初的问题无关。通过添加p:ajax event=“save”update=“@this”解决了问题。在另一个p:ajax行下面添加了这一点。我修改了BalusC的建议,使用“优雅的黑客”利用p:inplace的id传播(保存事件侦听器)EL表达式的翻译形式,该实体的值正在由inplace编辑: