1

我正在尝试处理众所周知的“问题”,其中 ah:commandLink 的操作方法在放置在从请求范围 bean 获取其数据的 dataTable 中时不会被调用。由于项目限制,我仅限于使用 JSF 2.0 和 RichFaces 3.x(部分支持它),所以我不能依赖 Tomahawk 的解决方案(preserveDataModel)。

经过一天的搜索和试验/错误:

  • 我已经读过 dataTable 提供的“数据模型”需要存储在会话中。在不使整个 bean 成为会话范围的情况下,我该如何做到这一点?我尝试使用保存数据的静态变量,但不起作用。
  • 我尝试将 a4j:keepAlive 与我的 bean 一起使用(如果重要,它实现了 Serializable),但未能使其工作。
  • 使 bean ViewScoped 也不起作用。

对此的任何帮助将不胜感激。

编辑:

这是我正在尝试做的事情:

在页面中,有一个组合显示了从数据库中检索到的许多选项。当用户选择一个时,dataTable 会填充与所选选项相关的信息。第一列的数据呈现为命令链接。如果用户单击链接,它应该调用指定的方法,但它不会被调用。

我的页面.xhtml

<h:form>
<!-- Placed a <a4j:keepAlive beanName="myBean"> in this line, but didn't work -->
<h:selectOneMenu value="#{myBean.selectedOption}">
    <f:selectItems value="#{myBean.optionsList}" var="option"
                   itemLabel="#{option.labelProperty}" itemValue="#{option.valueProperty}"/>
    <a4j:support event="onchange" action="#{myBean.getDataBasedOnSelectedOption}"
        reRender="table_panel" ajaxSingle="true"/>
</h:selectOneMenu>

<a4j:outputPanel id="table_panel" >
    <rich:dataTable id="table" value="#{myBean.data}" var="dataRow"
             rendered="#{not empty myBean.selectedOption}">
        <f:facet name="header">
            <rich:columnGroup>
                <rich:column>Some column header</rich:column>
            </rich:columnGroup>
        </f:facet>

        <rich:column>
                <a4j:commandLink  action="#{myBean.linkClickedAction}"
                    value="#{dataRow.someProperty}"/>
        </rich:column>
</a4j:outputPanel>

MyBean.java

@ManagedBean(name="myBean")
@RequestScoped //Tried with @ViewScoped but didn't work

private List<MyPOJO1> optionsList;
private List<MyPOJO2> data; //Made this variable static, but didn't work
private String selectedOption;

@PostConstruct
public void init()
{
    optionsList = getOptionsListFromDatabase();
}

public String getDataBasedOnSelectedOption()
{
    data = getRelevantDataFromDatabase(selectedOption);

    return null;
}

//This method doesn't get called
public String linkClickedAction()
{
    System.out.println("I'm here!");

    return null;
}

public List<MyPOJO1> getOptionsList()
{
   return optionsList;
}

public void getSelectedOption()
{
    return selectedOption;
}

public void setSelectedOption(String selectedOption)
{
    this.selectedOption = selectedOption;
}
4

1 回答 1

0

如果a4j:keepAlive@ViewScoped不起作用,那么数据模型的数据加载逻辑错误的可能性很大。您可能是根据一些参数将它加载到 getter 中,而不是在操作方法、构造函数或@PostConstructbean 中加载。在 JSF 生命周期的应用请求值阶段,getter 也将被调用,以确定命令链接被按下的行,以便 JSF 可以确定需要调用哪个操作。如果 getter 没有返回具有预期行的数据模型,则根本不会调用该操作。

相应地修复它。getter 应该只返回 bean 属性,或者最多只做延迟加载。

于 2010-12-04T12:26:48.027 回答