JavaEE:关于设计的问题

时间:2011-01-04 07:52:18

标签: java jsf java-ee

我有一个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,PostACommentPostBComment,然后PostAComment将不需要注入bean {{1因此,不会加载B构造函数。现在将实现这一点,直到有人能指出我更好的解决方案

1 个答案:

答案 0 :(得分:2)

我认为您应该删除AB 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,以加载数据库中的注释。