gpt4 book ai didi

java - JSF:绝对需要将昂贵的业务逻辑放在访问器方法中。如何避免调用这个昂贵的 BL 倍数时间

转载 作者:行者123 更新时间:2023-11-30 07:33:12 24 4
gpt4 key购买 nike

这是我的困境,我知道在 JSF 中访问器方法会被多次调用,因此我知道不要将昂贵的业务逻辑(如数据库访问)放在访问器方法中。如果我绝对必须将业务逻辑放入我的访问器中怎么办。在这种情况下我该怎么办?以下是我的困境的高级布局。 (Mojarra 2.1, GF 3.1)

<h:dataTable value="#{myBean.comments}" var="item1">
<h:column>
#{item1.name} says: #{item1.comment}
<h:dataTable value="#{myBean.handleReplies(item1)}" var="item2">
<h:column>
#{item2.name} replies: #{item2.comment}
</h:column>
</h:dataTable>
</h:column>
</h:dataTable>

@ManagedBean
@ViewScoped
public void myBean(){
private List<Comment> comments;

@EJB
private MyEJB myEJB;

@PostConstruct
public void init(){
comments = myEJB.getAllComments();
}

//getters and setters for List<Comment> comments

public List<Comment> handleReplies(Comment comment){
//Return a List of replies of the comment
return myEJB.getRepliesFromComment(comment);
}
}

如您所见,inner dataTable 接受outer dataTable 的item 来生成它的List。有没有办法以某种方式停止多次调用 handleReplies(),因为此访问器方法访问 DB。

最佳答案

如何使用 HashMap 创建 View 范围的缓存?

类似于:

private Map<Comment, List<Comment>> replies = new HashMap<Comment, List<Comment>>();

public List<Comment> handleReplies(Comment comment){
if (!replies.containsKey(comment)) {
replies.put(comment, myEJB.getRepliesFromComment(comment));
}

return replies.get(comment);
}

这样,您的 View 范围 bean 会存储以前的请求结果,并在请求已经完成时返回它们。如果没有,则发出请求。最后,没有重复请求!

关于java - JSF:绝对需要将昂贵的业务逻辑放在访问器方法中。如何避免调用这个昂贵的 BL 倍数时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6022337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com