spring - 如何使用 Vaadin + Spring 创建 MVP 架构?

标签 spring vaadin mvp spring-boot vaadin4spring

我想创建以下简单的 MVP 架构:

  • 查看类,即 vaadin 布局、组件、样式。非功能性的。 View 应该绑定(bind)到当前的 ViewScope/SessionScope,因此我使用 https://github.com/peholmst/vaadin4spring@UIScope

  • 演示者应该注入(inject) View ,在 View 组件上注册监听器,处理用户输入并委托(delegate)给模型服务

问题:当我将 View 注入(inject)演示者时, View 被重新创建,因此演示者和 View 不在同一范围内。所以绑定(bind)将不起作用。 我可以改变什么来实现上述设计?

@VaadinComponent
@UIScope
public class LoginView {
    //form fields, buttons
}

@Controller
public class LoginPresenter implements ClickListener {
    @Autowired
    private LoginView view;

    @PostConstruct
    public void bind() {
        view.getLoginButton().addClickListener(this);
    }   

    @Override
    public void buttonClick(ClickEvent event) {
        //validate input and login
    }   
}

最佳答案

也许是这样的

public class LoginView {

    @Autowired
    public void initPresenter(LoginPresenter loginPresenter) {
        loginPresenter.setLoginView(this);
        loginPresenter.bind();
    }
}

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class LoginPresenter {

    private LoginView loginView;

    public void bind() {
        // ...
    }

    public LoginView getLoginView() {
        return loginView;
    }

    public void setLoginView(LoginView loginView) {
        this.loginView = loginView;
    }

}

编辑

例如,您可以解耦添加配置接口(interface),但会增加一些复杂性

    public interface View {

    }

    public interface Presenter {

        void setView(View view);
        void bind();
    }

    public interface ViewManager {

        void configure(View view);
    }

    public class ViewSupport implements View {

        @Autowired
        private ViewManager viewManager;

        @PostConstruct
        public void init() {
            viewManager.configure(this);
        }
    }



 /**
  * ViewManager that configure Presenters following 
  * the naming convention XXView->XXPresenter
  */  
 public class DefaultViewManager implements ViewManager {


    @Autowired
    private ApplicationContext applicationContext;

    @Override
    public void configure(View view) {
        Presenter p = (Presenter) applicationContext.getBean(getPresenterName(view.getClass()));
        p.setView(view);
        p.bind();

    }

    protected String getPresenterName(Class<?> clazz) {
        return StringUtils.uncapitalize(clazz.getSimpleName()).replace("View", "Presenter");
    }

}

关于spring - 如何使用 Vaadin + Spring 创建 MVP 架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23613029/

相关文章:

java - 没有 Maven 的 Vaadin Clojure 小部件编译

java - 多个否定的配置文件

spring - 生成水平布局中嵌套的网格,但未完全显示

java - 当数据源是 SQLContainer 时如何使只有一列可编辑

c# - 如何构建 C# WinForms Model-View-Presenter(被动 View )程序?

android - 具有 Viewmodel 的 Android 上的 Headless Activity

asp.net - 重构旧版 WebForms 应用程序以更好地分离关注点

java - 问题是 maven install - 找不到符号客户端

java - Spring mvc hibernate jsp问题

java - Sonarqube 测试用例规则不考虑 @Test 注释