【问题标题】:JSF reloading ViewParam after commandButton actionJSF 在 commandButton 操作后重新加载 ViewParam
【发布时间】:2019-01-20 17:45:28
【问题描述】:

我正在使用 JSF 和 Primefaces。我有一个带有 f:viewParam 的 edit.xhtml 页面接收实体 ID:

<f:viewParam name="id" value="#{backingBean.entity}" converter="entityConverter" />

我有两个commandButton,一个用来提交和保存实体:

<p:commandButton ajax="false" value="#{bundle.save}" 
action="#{backingBean.save()}"/>

另一个将项目添加到实体集合中:

<p:commandButton ajax="true" process="@this" value="#{bundle.add}" 
actionListener="#{backingBean.addItem()}" />

这是我的 BackingBean:

@ViewScoped 
@Named("backingBean")
public class BackingBean {
  @EJB
  MyDAO myDAO;

  private Entity entity; //with getters and setters

  public void addItem() {
    entity.getData().add(new Item()); //another entity object
  }

  public void save(){
    myDAO.save(entity);
  }
...
}

我还有一个调用 DAO 并加载对象的 EntityConverter 类:

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    try {
        return myDAO.findById(Entity.class, Long.valueOf(value));
    } catch (Exception e) {
        return null;
    }
}

如果我尝试添加多个项目或单击保存按钮,则会通过调用转换器类的 getAsObject 方法重新加载 BackingBean 类中的实体。

我做错了什么? 谢谢!

【问题讨论】:

    标签: jsf primefaces converter


    【解决方案1】:

    为了清楚起见,正常的 f:param 将始终以这种方式运行。我在我的所有项目中都使用了OmniFaces ViewParam,它解决了这些问题。

    无状态模式可避免在回发时进行不必要的转换、验证和模型更新

    标准 UIViewParameter 实现调用模型设置器 回发后再次。当被绑定到一个 查看作用域 bean 并在组合时可能导致性能问题 带有昂贵的转换器。为了解决这个问题,这个组件默认 将提交的值存储为组件属性,而不是存储在 模型(因此处于视图状态,以防绑定到视图 范围 bean)。

    标准的 UIViewParameter 实现调用转换器和 验证器再次回发。当您 有例如一个 required="true",但参数不保留在表单上 提交。您需要在每个命令中保留它 链接/按钮。为了解决这个问题,这个组件不调用 在回发时再次使用转换器和验证器。

    【讨论】:

    • 感谢您的回答!我将实现omnifaces
    猜你喜欢
    • 2012-09-02
    • 2012-10-30
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多