如何使用 Vaadin CDI 和 Navigator 实现 MVP?

2023-12-22

我想使用 Vaadin 在我的 Web 应用程序中实现 MVP 模式。我正在使用 Vaadin Navigator 和 CDIViewProvider,如下所示:

//MyUI.java
public class MyUI extends UI {
    @Inject
    CDIViewProvider viewProvider;

    Navigator navigator;

    @Override
    protected void init(VaadinRequest vaadinRequest) {

        //UI setup
        navigator = new Navigator(this, someContainer);
        navigator.addProvider(viewProvider);
        getNavigator().navigateTo("myView");
    }
}

//MyViewImpl.java
@CDIView("myView")
public class MyViewImpl extends VerticalLayout implements com.vaadin.navigator.View, MyView {
    // ...

据我了解,视图提供程序实例化了 MyViewImpl 的一个对象,该对象是 ViewScoped,即当用户导航到/离开该视图时它会被创建/销毁。接下来我需要考虑在哪里实例化这个视图的presenter。我考虑过将其设为 SessionScoped 并将其注入到视图中:

// ... continue MyViewImpl.java

@Inject 
private MyViewListener presenter;

// in some of the MyViewImpl methods we can do stuff like presenter.buttonClicked();
}

//MyViewPresenter.java
@SessionScoped
public class MyViewPresenter implements MyView.MyViewListener {

    MyView view; //how can the presenter obtain the view here ?

    @PostConstruct
    public void init() 
    @Override
    public void buttonClicked() {
        view.displaySomething();
    }
}

//MyView.java
public interface MyView {
    public interface MyViewListener {     
        public void buttonClicked();
    }

    public void displaySomething();
}

正如我已经在演示者引用视图后面的评论中指出的那样,我不知道演示者如何获取视图实例(由视图提供者创建)。让演示者处于 SessionScoped 范围内,而每当视图更改时视图就会被创建/销毁,这是否有意义?另一种方法是视图没有对演示者的引用,但演示者将自身添加为视图的侦听器。然而,在这种情况下,我再次不知道在哪里实例化演示者以及如何获取对当前视图的引用。


不要尝试注入视图,而是在演示者中使用视图设置器并从视图中调用它@PostConstruct:

@Dependent
class MyPresenter {

    private MyView view;

    public void setView(MyView view) {
        this.view = view;
    }
}

public interface MyView {
}

@CDIView("my-view")
public class MyViewImpl extends VerticalLayout implements View, MyView {

    @Inject
    private MyPresenter presenter;

    @PostConstruct
    private void init() {
        presenter.setView(this);
    }
}

我认为创建顺序是这里令人困惑的问题。在某种程度上,视图具有更高的优先级,因为它们是在您调用时由 Vaadin 创建的getNavigator().navigateTo("my-view")。 Presenter 由 CDI 的视图实例化(即使它监督视图)并且应该具有@Dependent scope.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Vaadin CDI 和 Navigator 实现 MVP? 的相关文章

随机推荐

  • Xlint:无效的绝对类型名称

    我在服务器启动时看到下面的 Spring 框架异常 gt Initialization of bean failed nested exception is gt java lang IllegalArgumentException war
  • 为什么堆栈上的项目必须具有编译时已知的大小?

    我明白为什么他们一定有大小不变 但我不明白为什么这个尺寸一定是编译时已知 即使 C 也允许在堆栈上使用可变长度数组 这个限制对 Rust 有什么帮助 即使 C 也允许在堆栈上使用可变长度数组 由于其简单的语义 C 可以相对容易地支持这一点
  • C# 中的元组展开类似于 Python [重复]

    这个问题在这里已经有答案了 在 Python 中 我们可以使用类似的语法展开元组 a b 1 2 C 中有类似的结构吗 或者访问如下元素 Tuple
  • 考虑在配置中定义“org.hibernate.SessionFactory”类型的 bean

    我是 Java EE 新手 一直在开发一个简单的 Spring Boot 项目 每次我运行它时 我都会收到此错误 请随时回答我的问题 我们非常感谢代码中的任何改进 Field sessionFactory in com example da
  • 我应该使用 cocos2D 还是 andengine?

    什么项目比较活跃 稳定 你能告诉我cocos2D和andengine之间的深层区别吗 我肯定会选择Andengine Android 版 Cocos2D 的 bug 还太多
  • VFR-Reader 在 iOS8 中崩溃

    我测试了一个当前正在 iOS8 上使用 VFR Reader Core 的应用程序 当我尝试从中打开 PDF 时 我完全崩溃了 我是唯一一个有这个问题的人吗 知道我可以在哪里搜索来纠正这个问题吗 这是崩溃报告 https gist gith
  • 会话 Cookie 与持久 Cookie

    我了解持久 cookie 与会话 cookie 的正常应用 但是 如果您可以指定会话 cookie 的过期时间 使其表现得像持久 cookie 反之亦然 除了对用户进行混淆并将会话存储在服务器上之外 使用会话 cookie 是否还有其他好处
  • window.opener 为 null(iOS 12.3.1 Safari 和 Chrome)

    有一个target blank关联 链接页面中的脚本使用window opener 这已经工作了很多年 但现在它在 iOS 上被破坏了 因为window opener is null 我能做些什么 有很多旧的 一些very旧 window
  • 是否可以在 C# 中创建一个新的运算符?

    我知道你可以重载现有的运算符 我想知道是否可以创建一个新的运算符 这是我的场景 我要这个 var x y lt z y z 相当于 var x y
  • 从 Stripe 账户转账到其他账户

    我用它来向连接的帐户收费 然后将钱发送到另一个帐户 但我不断收到此错误消息 我不断收到此错误消息 您不能提供destination向连接的帐户收费时 return stripe charges create amount 1000 curr
  • VueJS:如何滚动 v-list-title

    使用 v list 制作列表屏幕时 我卡住了滚动 v list title 项目 我正在使用 VueJS 和 vuetifyjs 我的代码片段如下 https codepen io badsaarow pen aaRaxe editors
  • 如何直接从测试驱动程序调用自定义 Django manage.py 命令?

    我想为 Django manage py 命令编写一个单元测试 该命令对数据库表执行后端操作 如何直接从代码调用管理命令 我不想从tests py 在操作系统的shell 上执行命令 因为我无法使用使用manage py test 设置的测
  • 更改 Alembic 中的主键?

    我已读完the docs http alembic readthedocs org en latest ops html 但我在任何地方都找不到这方面的说明 我尝试删除旧密钥并添加新密钥 但这会导致错误 op drop constraint
  • Pandas:根据行值删除重复项

    我有一个数据框 我想根据不同的条件删除重复项 A B 0 1 1 0 1 1 1 0 2 2 2 0 3 2 2 0 4 3 3 0 5 4 4 0 6 5 5 0 7 5 1 8 5 1 9 5 3 我想删除 A 列中除带有 的行之外的所
  • 返回带有 ember-data find() 和多个参数的单个记录

    我正在尝试对除 id 之外的其他参数 实际上是两个参数 进行查找 使用 ember data 但我得到的只是 Uncaught Error assertion failed Your server returned a hash with
  • HTML 表单上的默认提交按钮是如何确定的?

    如果提交表单但未通过任何特定按钮提交 例如 by pressing Enter using HTMLFormElement submit in JS 浏览器如何确定使用多个提交按钮 如果有 中的哪一个作为按下的按钮 这在两个层面上具有重要意
  • TabLayout选项卡样式

    我用新的TabLayout from com android support design图书馆 我想更改选定 未选定选项卡的背景 我查看来源 只发现tabBackground更改所有选项卡颜色但不控制选定选项卡颜色的属性 如何控制选定 未
  • 检查 INTENT 互联网连接

    有安卓的吗Intent ACTION XXX当互联网连接可用时通知我 我想实例化一个BroadcastReceiver当用户启用互联网连接 通过 wifi GSM 等 时通知我的应用程序 有人可以帮助我吗
  • 我如何知道我正在使用什么 CLR?

    是否有信息可以告诉我正在使用的 NET 版本以及它是否是 NET 2 0 SP1 Thanks 您可以使用Environment Version http msdn microsoft com en us library system en
  • 如何使用 Vaadin CDI 和 Navigator 实现 MVP?

    我想使用 Vaadin 在我的 Web 应用程序中实现 MVP 模式 我正在使用 Vaadin Navigator 和 CDIViewProvider 如下所示 MyUI java public class MyUI extends UI