Vaadin 中的 MVP 结构 Spring
MVP Structure in Vaadin Spring
我正在使用 Vaadin 7.5.6 和 官方 Vaadin Spring1.0.0。我想使用 MVP 模式,但我在问自己这些组件如何协同工作。因为我是 MVP 的新手,我不想使用任何插件,所以我尝试自己设置它。
所以如果我是对的,LoginViewPresenter 将给我提供 presenterInstance.getView() 的视图。这已经工作正常,但我应该如何通过视图访问演示者?当我想为我的视图做一个逻辑操作时,我应该在演示者中做它 class。但是如何从视图 Buttonclicklistener 中调用 Presenter 方法呢?
我的第二个问题是,如果我在演示者 class 上有 UIScope 注释,Spring 何时从这个 class 实例化一个新对象?我认为只要 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;
}
}
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)
{
}
}
您的视图不应该知道演示者。它应该触发事件,并且您的演示者可以收听它们。
这是我的做法:
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 是否仍然始终具有新值?
我正在使用 Vaadin 7.5.6 和 官方 Vaadin Spring1.0.0。我想使用 MVP 模式,但我在问自己这些组件如何协同工作。因为我是 MVP 的新手,我不想使用任何插件,所以我尝试自己设置它。
所以如果我是对的,LoginViewPresenter 将给我提供 presenterInstance.getView() 的视图。这已经工作正常,但我应该如何通过视图访问演示者?当我想为我的视图做一个逻辑操作时,我应该在演示者中做它 class。但是如何从视图 Buttonclicklistener 中调用 Presenter 方法呢?
我的第二个问题是,如果我在演示者 class 上有 UIScope 注释,Spring 何时从这个 class 实例化一个新对象?我认为只要 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;
}
}
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)
{
}
}
您的视图不应该知道演示者。它应该触发事件,并且您的演示者可以收听它们。
这是我的做法:
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 是否仍然始终具有新值?