gpt4 book ai didi

java - 如何使用异步回调实现MVC?

转载 作者:行者123 更新时间:2023-11-30 03:19:03 25 4
gpt4 key购买 nike

我目前正在重构我的 GWT 客户端,并尝试将 MVC 模式应用于所有相关的类。我的问题是我不确定这里的两件事:

  • 在哪里控制显示哪个 View ?例如,如果用户登录并且应该加载起始页。 Controller 会加载该页面或模型吗?
  • 我如何最好地处理异步回调以及谁(模型或 Controller )应该持有异步服务?

我有一个简单的登录示例,它是我的实际代码,因为它当前看起来像这样:

登录模型

// LoginModel appears kind of obsolete ..
public class LoginModel {

private final LoginServiceAsync loginService = LoginService.Util.getInstance();

public void onLoginClick(String userId, String password, AsyncCallback<UserDTO> asyncCallback) {
// Login on the server ..
this.loginService.login(userId, password, asyncCallback);
}
}

登录查看

public class LoginView extends Composite {

private static UILoginUiBinder uiBinder = GWT.create(UILoginUiBinder.class);

@UiField Button btnLogin;
@UiField TextBox txtPassword;
@UiField TextBox txtUserID;

interface UILoginUiBinder extends UiBinder<Widget, LoginView> {
}

public LoginView() {
initWidget(uiBinder.createAndBindUi(this));
}

public void addLoginButtonClickHandler(ClickHandler clickHandler) {
this.btnLogin.addClickHandler(clickHandler);
}

public String getUserId() {
return this.txtUserID.getText();
}

public String getPassword() {
return this.txtPassword.getText();
}

public void displayLoginFailure() {
// TODO display login failure ..
}
}

登录 Controller

public class LoginController {

private final LoginModel loginModel;

private final LoginView loginView;

public LoginController(LoginModel loginModel, final LoginView loginView) {

this.loginModel = loginModel;
this.loginView = loginView;
this.loginView.addLoginButtonClickHandler(new LoginButtonClickHandler());
}

private class LoginButtonClickHandler implements ClickHandler {
@Override
public void onClick(ClickEvent event) {

loginModel.onLoginClick(loginView.getUserId(), loginView.getPassword(), new AsyncCallback<UserDTO>() {
public void onFailure(Throwable caught) {
onLoginFailure(caught);
}

public void onSuccess(UserDTO userDto) {
onLoginSuccess(userDto);
}
});
}
}

public void onLoginFailure(Throwable caught) {
Throwable cause = caught.getCause();
if (cause instanceof LoginException) {
GWT.log("Cause: " + cause.getMessage());
cause.printStackTrace();
}

this.loginView.displayLoginFailure();
}

public void onLoginSuccess(UserDTO userDto) {
// NOTE: UIStart is what is going to become StartView!
UIStart home = new UIStart();
RootPanel.get("mainUIContainer").clear();
RootPanel.get("mainUIContainer").add(home);
}
}

这是 MVC 模式的良好实现吗?我可以做得更好吗?

最佳答案

Ray Ryan 在 2009 年 Google I/O 大会上发表了演讲:Best Practices for Architecting GWT App

在 GWT 中,您不使用 MVC,而是使用 MVP(模型 - View - 演示者),它可以更清晰地划分各个部分。您可以将 MVP 用于您的小部件和屏幕。接下来使用 EventBus 来解耦组件。

最后,您应该使用“Activity 和地点”在应用程序内导航。

看这里: MVP Activities and Places 。这是一个很好的起点。

此外,您可以查看 GWT-Platform GWTPmvp4g因为它们是 GWT 中 mvp 模式的不同实现。

正如 Abhijith Nagaraja 已经提到的:在演示器内进行异步调用。

编辑:另请参阅 Demystifying MVP and EventBus in GWT (链接取自评论部分)。

关于java - 如何使用异步回调实现MVC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31794794/

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