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

发布于 2024-12-11 13:21:19 字数 724 浏览 0 评论 0原文

我在我的应用程序中使用 JSF 和 Hibernate。假设我有一个用户帐户,我想使用

    无序列表中显示其问题。如果没有问题,我不想呈现列表,而是显示“没有问题”文本。我目前的处理方式如下:

<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>

这有两个问题,如果没有问题的话,会出现杂散的

    标签。

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

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

I am using JSF and Hibernate in my application. Say I have a user account, whose questions I want to display using <ui:repeat>, in a <ul> unordered list. I don't want to render the list if there are no questions, and display "No questions" text instead. The way I currently account is the following:

<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>

There are two problems with this, the stray <ul> tags if there are no questions.

Should I encapsulate it in another panel with again rendered=#{user.questions.size() > 0} because it seems ui:repeat does not accept rendered property.

The second problem is that user.questions.size() is calculated twice (and user.questions is accessed in two different places), does that mean two hits for the same variable in db?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

青春有你 2024-12-18 13:21:19

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

是的。

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

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

@ManagedBean @RequestScoped
public class DemoBean {

  private List<Question> questions;

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

  // etc.

Should I encapsulate it in another panel with again rendered=#{user.questions.size() > 0} because it seems ui:repeat does not accept rendered property.

Yes.

The second problem is that user.questions.size() is calculated twice (and user.questions is accessed in two different places), does that mean two hits for the same variable in db?

Such behaviour should be handled in your model by appropriately scoping and caching the data.

@ManagedBean @RequestScoped
public class DemoBean {

  private List<Question> questions;

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

  // etc.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文