Vaadin Spring的MVP结构

新奇拉

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

因此,如果我是对的,则LoginViewPresenter将为我提供presenterInstance.getView()上的视图。这已经可以正常工作,但是我应该如何通过视图访问演示者?当我想对视图进行逻辑操作时,应该在presenter类中进行。但是,如何从视图Buttonclicklistener调用presenter方法呢?

我的第二个问题是我的presenter类上是否有UIScope注释,Spring何时从该类实例化一个新对象?只要界面存在,我就一直保持。但是在构造函数中生成一个随机字符串后,我将打印出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;
    }
}

LoginView.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)
    {
    }

}
阿德里安·科尔森(Adrien Colson)

您的视图不应该知道演示者。它应该触发事件,您的演示者可以听这些事件。

这是我的方法:

LoginView.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仍然始终具有新值吗?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章