我有一个JSF页面,它将创建一个新的Comment
。我将该页面的托管bean作为RequestScoped
托管bean。
@ManagedBean(name="PostComment")
@RequestScoped
public class PostComment {
private Comment comment = null;
@ManagedProperty(value="#{A}")
private A a; //A is a ViewScoped Bean
@ManagedProperty(value="#{B}")
private B b; //B is a ViewScoped Bean
@PostConstruct
public void init(){
comment = new Comment();
}
// setters and getters for comment and all the managed property variable
...
public void postComment(String location){
//persist the new comment
...
if(location.equals("A")){
//update the comment list on page A
a.updateListOnA();
}else if(location.equals("B")){
//update the comment list on page B
b.updateListOnB();
}
}
}
从上面的代码中可以看出,2 ViewScoped bean A和B都将使用方法postComment()
。两者都将组件绑定到属性comment
,因此两者都将从bean getComment()
访问getter PostComment
。我现在遇到的问题是,如果我在A上,A的构造函数将加载,但它也将加载bean B的构造函数(因为使用ManagedProperty注入bean)。这使我的页面加载速度慢两倍。什么是解决这个问题的最佳方法?
编辑
我一直在想的一种方法是:创建两个不同的RequestedScoped bean,PostAComment
和PostBComment
,然后PostAComment
将不需要注入bean {{1因此,不会加载B
构造函数。现在将实现这一点,直到有人能指出我更好的解决方案
答案 0 :(得分:2)
我认为您应该删除A
和B
bean并创建一个服务,该服务将根据位置字符串保留注释。 PostComment
bean应调用此方法。
在任何页面上发布评论后,应刷新该页面并再次从数据库加载评论。
编辑:
服务只是一个流行语,它可以是会话bean,也可以只是一个简单的java类:
public class CommentService {
public void comment(Comment comment, String location) {
//persist the comment
}
//other methods like loading the comments from db
}
重构后,原始bean应如下所示:
@ManagedBean(name="PostComment")
@RequestScoped
public class PostComment {
private Comment comment = null;
private CommentService commentService;
@PostConstruct
public void init(){
comment = new Comment();
commentSetvice = new CommentService();
}
// setters and getters for comment
...
public void postComment(String location){
commentService.comment(comment, location);
}
}
我不知道A和B包含什么,但这段代码足以添加评论。要显示注释,您应该创建其他bean,以加载数据库中的注释。