【问题标题】:Primefaces- JSF, data in a list can't be displayed in a p:datatabePrimefaces-JSF,列表中的数据无法在 p:datatable 中显示
【发布时间】:2012-07-30 08:48:48
【问题描述】:

我有一个用户列表,我想使用 primefaces p:datatable 在 JSF 页面中显示这些用户。我也不例外,但是我无法将a拥有的数据显示到列表中,甚至没有显示列标题,实际上我使用'getUserListe()'方法从调用我的服务层的数据库中获取数据,为了确定这一点,我添加了一些 userDomain 属性(我的模型类)的 sysprint(),当我访问 URL 时,我想用来自 UserListe 的数据填充我的数据表,所以我用 @ 调用它987654325@,问题是列表不显示。但是当页面被收费时,意味着 getUserListe() 被调用,在我的控制台中,属性被成功打印,有人对此有任何想法吗? :

我的托管 bean 的一部分:

@ManagedBean(name="userMB")
@RequestScoped
public class UserManagedBean implements Serializable {

        private List<UserDomain> userListe ;
    public List<UserDomain> getUserListe() {
            this.userListe = new ArrayList<UserDomain>();
            this.userListe.addAll(getUserServicee().getAll());
            for(UserDomain u : userListe)
                System.out.println(u.getFirstName());
            return userListe;
        }

        public void setUserListe(List<UserDomain> userListe) {
            this.userListe = userListe;
        }

我的 jsf.xhtml 文件的一部分:

<h:form>
        <h:outputText value="USER's rights list: "></h:outputText>
        <p:dataTable id="userss" var="userr" value="#{userMB.userListe}" style="width: 10%">

            <h:column>
                    <f:facet name="header"><h:outputText value="FirstName" /></f:facet>                     
                    <h:outputText value="#{userr.firstName}"  />                    
            </h:column>

            <h:column>
                    <f:facet name="header"><h:outputText value="LastName" /></f:facet>                  
                    <h:outputText value="#{userr.lastName}"  />                 
            </h:column>

            <h:column>                  
                    <f:facet name="header"><h:outputText value="Action" /></f:facet>                    
                    <h:commandLink value="Edit" action="#{userMB.editAction(userr)}"  />                
            </h:column>

        </p:dataTable> 

        <h:commandButton value="OK" action="#{userMB.userProp}" />
    </h:form>

请注意,我的用户已正确设置其属性的所有 getter 和 setter, 谢谢你的帮助

【问题讨论】:

  • &lt;h:column&gt;&lt;h:dataTable&gt; 一起使用,将其更改为&lt;p:column&gt;。使您的 bean @ViewScoped 并将您的 getUserListe 的业务逻辑移动到另一个方法,为此请阅读 Between a jsf page and a managed bean, why the getter method is called twice
  • Luiggi 说得对,使用 p:column 将修复它,您应该加载该数据一次,而不是每次请求该值。
  • 谢谢@LuiggiMendoza 的回答,你是对的,Daniel,我怎样才能只加载一次数据,是通过“onload”preperty 还是什么?再次非常感谢您的帮助。
  • 要仅加载一次列表,请在注解为@PostConstruct 的方法中加载列表,并将列表保存在UserManagedBean 的成员变量中。然后,在“getUserListe()”中,只返回变量。原因是页面渲染时JSF会多次调用“getUserListe()”。
  • @maouven 您可以创建一个检索数据的方法,并在 bean 构造函数和其他方法(如 commandButton 操作)中调用它来刷新数据。假设这是您的情况,最好让您的 bean ViewScoped,RequestScoped 将在每个请求(甚至是 ajax 请求!)中创建 bean。

标签: jsf jakarta-ee primefaces


【解决方案1】:

我按照@luiggi 在他的评论中所说的将&lt;h:column&gt; 更改为&lt;p:column&gt; 并且工作正常,所以谢谢。 我还将托管 bean 从 @RequestScoped 更改为 @ViewScoped

我想补充和分享的另一件事是,我在阅读了这篇文章的 cmets 后做了一些研究,所以我找到了另一个似乎比其他人更好的解决方案,只加载一次列表,它是通过将侦听器附加到系统事件,所以在我的 jsf 文件中添加

<f:view>
    <f:event type="preRenderView" listener="#{userMB.loadUserListe}" />
...

我的 bean 中的 loadUserListe() 方法调用了实例化用户列表的业务逻辑代码。 当然,jsf 页面包含在 f:view 中。另请注意,使用此侦听器至少需要 JSF 2.0

谢谢大家的帮助,请原谅我的英语,我希望这个回复可以帮助其他人

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2012-07-25
    相关资源
    最近更新 更多