RichFaces 4和@ViewScoped

时间:2011-04-05 06:04:32

标签: jsf richfaces

我正在从RichFaces 3.3.3迁移到4.0,并且遇到了一个无法弄清楚如何解决的问题。

到目前为止,我已经使用RichFaces的@ KeepAlive注释来实现使用bean的View范围,但到目前为止,新版本4没有这样的功能(据我所知)。所以我认为@ViewScoped注释将是自然(和快速)替换,但它不起作用。 这是给我带来麻烦的相关代码。它呈现一个包含客户名称为链接的表,因此当单击一个名称时,它会弹出一个弹出窗口来编辑数据。它在v3.3.3中与@KeepAlive一起使用,但在v4中不与@ViewScoped一起使用(弹出窗口不会被调用)。

页面:

<h:form prependId="false">
 <rich:dataTable id="table" value="#{myBean.customers}" var="customer">
    <!--...headers...-->
    <h:column>
        <a4j:commandLink action="#{myBean.selectCustomer}"
            oncomplete="#{rich:component('popup_customer_editor')}.show();" render="form_customer_editor">
            ${customer.name}
            <f:setPropertyActionListener value="#{customer}" target="#{myBean.selectedCustomer}"/>
        </a4j:commandLink>
    </h:column>
    <h:column>${customer.address}</h:column>
 </rich:dataTable>
</h:form>

<rich:popupPanel id="popup_customer_editor>
    <h:form id="form_customer_editor">
    <!--...form fields...-->
    </h:form>
</rich:popupPanel>

豆子:

@ManagedBean
@ViewScoped   //It was @KeepAlive before
public class MyBean implements Serializable
{
    private String name;
    private String address;
    private Customer selectedCustomer;  //POJO class
    //getters and setters
    ...
    public String selectCustomer()
    {
        name = selectedCustomer.getName();
        address = selectedCustomer.getAddress();

        return null;
    }
}

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:3)

可能无法调用您的操作有两个原因:

  1. 您有一个提交的字段,验证/转换失败。如果您有验证或转换错误,则不会调用您的操作。您应该有一个<h:messages>以确保您看到它,因为它是a4j:clickLink将其放在a4j:outputPanel内,如下所示:<a4j:outputPanel ajaxRendered="true"><h:messages/></a4j:outputPanel>

  2. 您在另一个<h:form> 中有 <h:form>,并且您正在尝试提交内部的<h:form> 。你可以用firebug跟踪它真的很容易。由于某种原因,JSF决定不做任何事情。

  3. 看起来你在这里做了一些时髦的事情:

    1. 重新呈现表单。我在JSF2中重新渲染<body>(即他们停止工作)时遇到了严重问题,尤其是使用richfaces模式面板,通过它们实现实际面板的方式使其成为可能,它们将内容从<h:panelGrid>元素中的DOM中的任何位置移动。因此,我建议在表单中创建一个<f:setPropertyActionListener>,然后重新呈现该表单。
    2. <强> <a4j:commandLink action="#{myBean.selectCustomer}" oncomplete="#{rich:component('popup_customer_editor')}.show();" render="form_customer_editor"> ${customer.name} <f:setPropertyActionListener value="#{customer}" target="#{myBean.selectedCustomer}"/> </a4j:commandLink> 即可。真?你也应该有EL2,所以你可以改变它:

      <a4j:commandLink action="#{myBean.selectCustomer(customer)}"
          oncomplete="#{rich:component('popup_customer_editor')}.show();" render="form_customer_editor" value=#{customer.name}"/>
      
    3. {{1}}