<h:commandlink>无法在<h:datatable> </h:datatable> </h:commandlink>内工作

时间:2012-11-07 16:54:15

标签: jsf ajax4jsf

我会试着解释一下自己:

我正在使用java,JSF 2.0和RichFaces 4.2.1开发JSF项目。

当我访问我的jsf时,它只加载一个搜索过滤器和一个commandLink。 commandLink将在我的backingBean中启动一个方法来加载它将在dataTable中显示的数据。

<h:commandLink id="btnRecords">
    <f:ajax render="myCompAjax" event="click" listener="#{myBean.loadRecords}" />
    <h:graphicImage value="img/ico_new.gif" alt="#{bundle['button.search']}" />
</h:commandLink>

首先看不到数据表,但是一旦你点击commandLink,backingBean中的一个标志就会改变,表格会显示我刚刚加载的数据。

<a4j:outputPanel ajaxRendered="true" id="myCompAjax">
    <h:dataTable id="recordsTable" value="#{myBean.records}"                   
     var="item" rendered="#{myBean.flagShowTable}">
        <h:column headerClass="thPijama" >
            <f:facet name="header">
                <table><tr class="thPijama"><td></td></tr></table>
            </f:facet>
            <h:commandLink action="#{myBean.goNextPage}">
                <h:outputText value="Go Next Page" />
                <h:inputHidden value="#{item}" />   
            </h:commandLink>                                                     
        </h:column>                   
    </h:dataTable>
</a4j:outputPanel>

问题是dataTable内部的commandLink操作根本不起作用。我只是想导航到另一个jsf。事实上,它的作用是隐藏dataTable并保持过滤器不变。动作方法仍然无法访问。

当然,如果我在dataTable之外设置相同的commandLink,它就可以工作。

我不能使用Session Scope Beans,因为我工作的人不赞成它。

任何人都可以帮助我吗?

感谢您的提示。

1 个答案:

答案 0 :(得分:3)

  

我不能使用Session Scope Beans,因为我工作的人不赞成它。

您是否暗示将bean放在会话范围而不是请求范围实际上解决了问题?如果是这样,那么只需将bean放在视图范围内。

@ManagedBean
@ViewScoped
public class MyBean implements Serializable {
    // ...
}

这样,只要您通过ajax请求与同一视图进行交互,bean就会存在。 bean是在同一会话中的其他浏览器选项卡/窗口中共享(在架构师之间确实是禁止在简单视图中使用它的主要原因)。

另见: