0

我正在尝试通过来自commandButton 的方法操作将对象(模型托管bean 的实例)从jsf 视图传递到控制器托管bean。但是我发现在控制器托管bean中发现传输的对象为空,因此无法以这种方式执行有问题的服务。这是视图的相关部分:

<h:commandLink  action="#{employee.delete}" value="Delete account">
                <f:setPropertyActionListener target="#{empolyee.emp}" value="#{emp}" />
</h:commandLink>

在这里,控制器托管bean的一部分:

@ManagedBean(name="employee")
@RequestScoped
public class EmployeeController implements Serializable {
private Employee emp = new Employee();

public Employee getEmp() {
    return emp;
}

public void setEmp(Employee emp) {
    this.emp= emp;
}

public String delete(){
    if (this.emp == null) {return "bad";}  // The execution stopped here, and the outcome corresponded is returned 
    else {    
        employImp.deleteAccount(this.emp);
        return "good";
    }
}

为什么对象在处理后变为空?谢谢。

4

1 回答 1

1

此 actionListener 将导致“value”属性给出的值设置为“target”属性给出的 ValueExpression。

当监听器执行时,执行以下操作:

  • 在“值”ValueExpression 上调用 getValue()。
  • 如果“value”表达式的值为 null,则使用 null 值对“目标”ValueExpression 调用 setValue()。
  • 如果“value”表达式的值不为 null,则在“value”和“target”ValueExpressions 上调用 getType() 以确定它们的属性类型。
  • 按照表达式语言强制规则将“值”表达式的值强制为“目标”表达式值类型。使用结果值对“目标”ValueExpression 调用 setValue()。
  • 如果强制或 setValue() 的执行失败,则抛出 AbortProcessingException。

您的表达式#{emp} 被评估为null,并且不调用getEmp(仅具有null 值的setEmp),但是如果您输入#{employee.emp},它将不为null,然后调用getEmp 然后setEmp。注意为什么要为同一个变量赋值?

我建议把:

<f:setPropertyActionListener target="#{empolyee.emp}" value="#{empolyee.emp1}" />

emp1 是您之前创建的另一个对象

于 2015-06-12T19:02:58.617 回答