我有一个由ViewScoped Managed Bean支持的页面。该页面上有一个对话框(我正在使用primefaces),它由RequestScoped ManagedBean支持。我选择使对话框的托管bean请求作用域,以便在对话框启动时将其清除(基本上用例是用户打开对话框,填写一些数据,然后将数据添加到页面中由ViewScoped Managed Bean支持。
我正在集成两个bean的方式是通过对话框的RequestScoped bean上的ManagedProperty。即ViewScoped bean被注入RequestScoped bean。在保存对话框时,Dialog的RequestScoepd Bean上的actionListener方法更新ViewScoped bean上的属性,该属性包含对当前Bean实例的RequestScoped ManagedBean的引用。然后,请求范围bean调用ViewScoped托管bean上的actionListener。因此,ViewScoped托管bean中的actionListneer可以使用新注入的RequestScoped ManagedBean。
这是做我正在尝试做的好方法还是有更好的方法?
示例代码:
@ManagedBean
@ViewScoped
public class PageBackingBean
{
List<DialogValue> dialogValues;
DialogValue dialogValue;
public void setDialogValue(DialogValue dialogValue)
{
this.dialogValue = dialogValue);
}
public DialogValue getDialogValue() { return dialogValue; }
public void handleDialogSave(ActionEvent event)
{
dialogValues.add(getDialogValue());
}
}
@ManagedBean
@RequestScoped
public class DialogValue
{
@ManagedProperty(#{pageBackingBean})
PageBackingBean pageBackingBean;
String val1;
String val2;
// getters/setters ommitted for brevity...
public void dialogSave(ActionEvent event)
{
pageBackingBean.setDialogValue(this);
pageBackingBean.handleDialogSave(event);
}
}
答案 0 :(得分:2)
合作非常有意义。 DialogValue
中只有handleDialogSave()
属性和PageBackingBean
方法是多余的,可能会让未来的维护者感到困惑。您也可以在DialogValue
支持bean中执行此操作。
public void dialogSave(ActionEvent event)
{
pageBackingBean.getDialogValues().add(dialogValue);
}
也许可以将DialogValue
重命名为DialogBacking
或其他内容,至少它的名称不应该仅仅是一个模型。