java - Vaadin Spring 中的 MVP 结构

标签 java spring vaadin mvp

我正在使用 Vaadin 7.5.6官方 Vaadin Spring 1.0.0 设置我的第一个 Vaadin 应用程序。我想使用 MVP 模式,但我在问自己这些组件如何协同工作。因为我是 MVP 的新手,所以我不想使用任何插件,所以我尝试自己设置它。

因此,如果我是对的,LoginViewPresenter 将通过 presenterInstance.getView() 为我提供 View 。这已经工作正常,但我应该如何通过 View 访问演示者?当我想为我的 View 做一个逻辑操作时,我应该在演示者类中做。但是如何从 View Buttonclicklistener 中调用 Presenter 方法呢?

我的第二个问题是,如果我的演示者类上有 UIScope 注释,那么 Spring 什么时候从这个类实例化一个新对象?我认为只要 UI 存在。但是在构造函数中生成随机字符串后,我打印出 randomString 变量的内容(在 UI.class init() 方法中),但总是有一个新值。

问候

LoginViewPresenter.java

@SpringComponent
@UIScope
public class LoginViewPresenter implements Serializable
{
    private static final long serialVersionUID = 6286518141570430211L;

    @Autowired
    private LoginView view;

    public final String randomString;

    public LoginViewPresenter()
    {
        randomString = Utils.generateRandomString(8);
    }

    @PostConstruct
    public void init()
    {

    }

    public LoginView getView()
    {
        return view;
    }

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

登录 View .java

@SuppressWarnings("serial")
@UIScope
@SpringView(name = LoginView.NAME)
public class LoginView extends VerticalLayout implements View
{
    public static final String NAME = "LoginView";

    @PostConstruct
    private void init()
    {
    }

    @Override
    public void enter(ViewChangeEvent event)
    {
    }

}

最佳答案

您的 View 不应该知道演示者。它应该触发事件,并且您的演示者可以收听它们。

这是我的做法:

登录 View .java

@SuppressWarnings("serial")
@UIScope
@SpringView(name = LoginView.NAME)
public class LoginView extends VerticalLayout implements View {
    public static final String NAME = "LoginView";

    @Autowired
    private transient Collection<LoginViewListener> loginViewListeners;

    @PostConstruct
    private void init() {
        ...
        Button b = new Button("click me");
        b.addClickListener(e -> loginViewListeners.forEach(l -> l.eventFired()));
        addComponent(b);
        ...
        loginViewListeners.forEach(listener -> listener.viewInitialized(this));
    }

    @Override
    public void enter(ViewChangeEvent event)
    {
    }

    public interface LoginViewListener {

        void viewInitialized(LoginView view);


        void eventFired();

    }

}

LoginViewPresenter.java

@SpringComponent
@UIScope
public class LoginViewPresenter implements LoginViewListener, Serializable {
    private static final long serialVersionUID = 6286518141570430211L;

    private LoginView view;

    public final String randomString;

    public LoginViewPresenter() {
        randomString = Utils.generateRandomString(8);
    }

    @PostConstruct
    public void init() {

    }

    public LoginView getView() {
        return view;
    }

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

    @Override
    public void viewInitialized(LoginView v) {
        setView(v);
    }

    @Override
    void eventFired() {
        ...
    }

}

采用这种设计,您的 randomString 是否仍然始终具有新值?

关于java - Vaadin Spring 中的 MVP 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32949274/

相关文章:

java - Spring 4实体管理器配置

spring - 测试 RabbitMQ 和 Spring 集成

jakarta-ee - 我无法使用 @Inject 和 Vaadin CDI 实例化我的 bean

java - Vaadin 导航器 NPE

java - 为什么我不能将 1000000 个整数的数组从一个 Activity 发送到另一个?

java - Eclipse 编辑器允许接口(interface)中缺少 static 和 Final 关键字

java - 如何使用java中的扫描仪从数组列表中随机选择图像

Java实现跳跃列表中的删除方法

java - Azure Spring Boot - 获取登录用户的 OAuth 2.0 访问 token

vaadin - 如何在 vaadin 流程中禁用 ComboBox 中的清除按钮?