通过数据表使用JSF视图参数?可能?

时间:2011-06-15 21:49:55

标签: jsf jsf-2 richfaces primefaces openfaces

环境: JSF 2.0 / JPA(由EclipseLink提供)/ Glassfish 3.1 / java-EE-5 /

  • 一个小的JSF(No Spring,没有EJB,没有CDI)Web应用程序主要包括显示实体的数据表,但目的是显示给定Writer的实体iems列表: / EM>

  • 数据表(<h:datatable/>)显示作家列表。

  • 数据表(<h:datatable/>)显示由作家编写的书籍列表。 (1 - *)
  • 数据表(<h:datatable/>)显示给予作者的评估列表。 (1 - *)
  • 数据表(<h:datatable/>)显示由作者处理的主题列表。 (1 - *)。

这就是我看到的东西:

由于所有数据表都有一个带有Writer ID(Writer主键)的列。 当用户选择给定的编写器(最好来自Writer数据表)并使用它来仅显示与所选编写器行相关的记录时,如何告诉当前用户会话保存参数(Writer ID)。

同样地,当用户完成所选的作者时,他/她可以重置会话以保存另一个作者ID并愉快地探索新选择的作家子项目。

换句话说,使用<h:datatables /><f:param />(或类似的东西),如何持久地列出所选作者的书籍,评估和主题项目。

E.G:对我持久意味着=当用户从数据表中选择一个编写器并导航到/book/List.xhtml页面时,书籍数据表必须仅列出所选编写者具有的书籍项目。如果用户导航到其他地方,他只能看到与同一作者有关的内容。

一个想法是使用OpenFaces数据表过滤器,但是每次他/她导航到页面时,最终用户过于残忍地过滤表格太残忍了。他只需要做一次。 (一个令人兴奋的解决方案是为每个数据表(在这种情况下为<o:inputTextFilter />)添加 OpenFaces 过滤器(<o:datatable >),然后所有表的所有过滤器自动获取writer ID在JSF循环期间由用户会话保持为参数。但这是否真的可行:(?

对不起冗余。希望有人可以帮助提示,想法,解决方案或更好的选择。 问候。

1 个答案:

答案 0 :(得分:1)

假设您确实在运行Java EE 6而不是Java EE 5,您可以将当前选定的writer作为方法参数传递给数据表中commandlink /按钮中的bean,并让其他表依赖于此。

给出以下Writer实体:

public class Writer {

    private String name;
    private List<Book> books;
    private List<Evaluation> evaluations;
    private List<Topic> topics;

    // ...
}

以及以下托管bean:

@ManagedBean
@ViewScoped // request or session are also okay.
public class Bean {

    private List<Writer> writers; // +getter
    private Writer writer; // +getter +setter

    // ...
}

然后您可以按如下方式设置数据表(在单个视图中):

<h:form>
    <h:dataTable value="#{bean.writers}" var="writer">
        <h:column>#{writer.name}</h:column>
        <h:column>
            <h:commandButton value="View" action="#{bean.setWriter(writer)}">
                <f:ajax render=":details" />
            </h:commandButton>
        </h:column>
    </h:dataTable>
</h:form>
<h:panelGroup id="details">
    <ui:fragment rendered="#{not empty bean.writer}">
        <h:dataTable value="#{bean.writer.books}" var="book">
            <h:column>#{book.name}</h:column>
            ...
        </h:dataTable>
        <h:dataTable value="#{bean.writer.evaluations}" var="evaluation">
            <h:column>#{evaluation.name}</h:column>
            ...
        </h:dataTable>
        <h:dataTable value="#{bean.writer.topics}" var="topic">
            <h:column>#{topic.name}</h:column>
            ...
        </h:dataTable>
    </ui:fragment>
</h:panelGroup>