gpt4 book ai didi

java - 如何使用 Vaadin CDI 和 Navigator 实现 MVP?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:57:55 25 4
gpt4 key购买 nike

我想使用 Vaadin 在我的 Web 应用程序中实现 MVP 模式。我正在使用 Vaadin Navigator 和 CDIViewProvider,如下所示:

//MyUI.java
public class MyUI extends UI {
@Inject
CDIViewProvider viewProvider;

Navigator navigator;

@Override
protected void init(VaadinRequest vaadinRequest) {

//UI setup
navigator = new Navigator(this, someContainer);
navigator.addProvider(viewProvider);
getNavigator().navigateTo("myView");
}
}

//MyViewImpl.java
@CDIView("myView")
public class MyViewImpl extends VerticalLayout implements com.vaadin.navigator.View, MyView {
// ...

据我了解, View 提供程序实例化了一个 MyViewImpl 对象,该对象是 ViewScoped,即当用户导航到/离开该 View 时,它会被创建/销毁。接下来需要考虑在哪里实例化这个view的presenter。我考虑过将其设为 SessionScoped 并将其注入(inject)到 View 中:

// ... continue MyViewImpl.java

@Inject
private MyViewListener presenter;

// in some of the MyViewImpl methods we can do stuff like presenter.buttonClicked();
}

//MyViewPresenter.java
@SessionScoped
public class MyViewPresenter implements MyView.MyViewListener {

MyView view; //how can the presenter obtain the view here ?

@PostConstruct
public void init()
@Override
public void buttonClicked() {
view.displaySomething();
}
}

//MyView.java
public interface MyView {
public interface MyViewListener {
public void buttonClicked();
}

public void displaySomething();
}

正如我已经在演示者引用 View 后面的评论中指出的那样,我不知道演示者如何获得 View 实例(由 View 提供者创建)。让演示者成为 SessionScoped 是否有意义,而 View 在 View 更改时创建/销毁?另一种方法是 View 没有对演示者的引用,但是演示者将自己添加为 View 的监听器。但是在这种情况下,我再次不知道在哪里实例化演示者以及如何获取对当前 View 的引用。

最佳答案

不要尝试注入(inject) View ,而是在演示者中使用 View setter ,并从 View 的 @PostConstruct 调用它:

@Dependent
class MyPresenter {

private MyView view;

public void setView(MyView view) {
this.view = view;
}
}

public interface MyView {
}

@CDIView("my-view")
public class MyViewImpl extends VerticalLayout implements View, MyView {

@Inject
private MyPresenter presenter;

@PostConstruct
private void init() {
presenter.setView(this);
}
}

我认为创建顺序是这里令人困惑的问题。在某种程度上, View 具有更高的优先级,因为它们是由 Vaadin 在您调用 getNavigator().navigateTo("my-view") 时创建的。 Presenter 由 CDI 的 View 实例化(即使它监督 View )并且应该具有 @Dependent 范围。

关于java - 如何使用 Vaadin CDI 和 Navigator 实现 MVP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32184406/

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