在JSF中避免冗余数据库查询并有条件地呈现ui:repeat

时间:2011-10-21 09:00:47

标签: jsf

我在我的应用程序中使用JSF和Hibernate。假设我有一个用户帐户,我想在<ui:repeat>无序列表中使用<ul>显示问题。如果没有问题,我不想呈现列表,而是显示“无问题”文本。我目前的帐户方式如下:

<ul>
<ui:repeat value="#{user.questions}" var="question">
    <li>#{question.text}</li>
</ui:repeat>
</ul>

<h:outputText rendered=#{user.questions.size() == 0}">no questions</h:outputText>

如果没有问题,这有两个问题,即迷路<ul>标签。

我是否应该再次使用rendered=#{user.questions.size() > 0}将其封装在另一个面板中,因为ui:repeat似乎不接受渲染属性。

第二个问题是user.questions.size()计算两次(并且在两个不同的地方访问user.questions),这是否意味着db中同一个变量的两次点击?

1 个答案:

答案 0 :(得分:1)

  

我是否应该再次使用rendered=#{user.questions.size() > 0}将其封装在另一个面板中,因为ui:repeat似乎不接受渲染属性。

  

第二个问题是user.questions.size()计算两次(并且在两个不同的地方访问user.questions),这是否意味着db中同一个变量的两次点击?

应通过适当地确定范围和缓存数据来在模型中处理此类行为。

@ManagedBean @RequestScoped
public class DemoBean {

  private List<Question> questions;

  public List<Question> getQuestions() {
    if(questions == null) {
      questions = lookupQuestions();
    }
    return questions;
  }

  // etc.