gpt4 book ai didi

java - Vaadin Spring 中的 MVP 结构

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

我正在使用 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/

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