Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT MVP体系结构优势_Gwt_Mvp - Fatal编程技术网

GWT MVP体系结构优势

GWT MVP体系结构优势,gwt,mvp,Gwt,Mvp,我正在学习GWT,我在多个地方都读到,使用MVP体系结构最适合开发GWT应用程序 我也读过,使用MVP架构进行测试很容易。有人能解释一下为什么使用MVP架构进行测试很容易吗 此外,我正在使用MVP进行一个项目,我发现将视图连接到数据库非常繁琐。我的意思是,为了连接到数据库,我必须更新我的演示者、服务、服务异步、服务CIMPL、Facades 有人能给我介绍一下MVP for GWT的精髓吗?我希望能举几个例子。演示者(包含逻辑)和视图(围绕UI控件的愚蠢包装)之间的分离允许您: 为演示者编写单

我正在学习GWT,我在多个地方都读到,使用MVP体系结构最适合开发GWT应用程序

我也读过,使用MVP架构进行测试很容易。有人能解释一下为什么使用MVP架构进行测试很容易吗

此外,我正在使用MVP进行一个项目,我发现将视图连接到数据库非常繁琐。我的意思是,为了连接到数据库,我必须更新我的演示者、服务、服务异步、服务CIMPL、Facades


有人能给我介绍一下MVP for GWT的精髓吗?我希望能举几个例子。

演示者(包含逻辑)和视图(围绕UI控件的愚蠢包装)之间的分离允许您:

  • 为演示者编写单元测试,无需相应的环境(桌面、浏览器、GWT小部件)即可运行
  • 重用前端逻辑,而无需绑定到一组特定的小部件/UI框架
后一种用例很少出现,因此让我们关注MVP模型对于自动化、编程测试的适用性。对于开发团队来说,这通常采取在无头服务器上使用(或类似)的连续构建/测试周期的形式,在无头服务器上,每次运行测试时打开web浏览器、创建控件等都是不切实际的

MVP+GWT的典型用法是视图实现演示者提供的接口,并且该接口通常是根据其他通用接口定义的。下面是一个非常简单的演示器,单击按钮时会增加一个数字标签-请注意,视图不会直接显示和,而是返回泛型和实例:

public class ButtonClickPresenter {
    public interface View {
        HasText currentValue();
        HasClickHandlers incrementButton();
    }

    private final View myView;
    private int currentValue = 0;

    public ButtonClickPresenter(View myView) {
        this.myView = myView;
        this.myView.currentValue().setText("0");

        this.bind(); // for the sake of demonstration
    }

    public void bind() {
        this.myView.incrementButton.addClickHandler(
            @Override
            new ClickHandler() {
                void onClick(ClickEvent event) {
                    currentValue ++;
                    myView.currentValue().setText(
                        Integer.toString(currentValue));
                }
            });
    }
}
“真实”视图返回UI小部件(在本例中通过UiBinder创建):

鉴于单元测试创建了一个虚拟实现(或使用等),因此不需要任何UI组件:

public class ButtonClickPresenterTest {
    ButtonClickPresenter presenter;
    ClickHandler currentHandler;
    String currentText;

    @Before
    public void setUp() {
        presenter = new ButtonClickPresenter(
            // dummy view - just stores label text in a String and
            // keeps track of the Presenter's click handler
            new ButtonClickPresenter.View() {
                @Override
                public HasText currentValue() {
                    return new HasText() {
                        @Override public String getText() { return currentText; }
                        @Override public void setText(String text) { currentText = text; }
                    };
                }

                @Override
                public HasClickHandlers incrementButton() {
                    return new HasClickHandlers() {
                        @Override
                        public HandlerRegistration addClickHandler(ClickHandler handler) {
                            currentHandler = handler;
                        }
                    };
                }
            });
    }

    @Test
    public void testIncrement() {
        // initial value
        assertEquals("0", currentText);

        // clicking the button should increment the number
        currentHandler.onClick(null);
        assertEquals("1", currentText);
    }
}
至于你的下一段:你的视图根本不应该连接到数据库!演示者应该通过Service/ServiceAsync(或诸如或之类的抽象)请求数据,然后调用视图上的方法来填充UI

顺便说一句,如果您正在寻找GWT MVP代码示例,那么最后两个链接(以及)是一个很好的开始——它们提供了将所有这些内容结合在一起的框架


说了这么多,我同意——GWT+MVP+Java的结合可能是一项艰苦的工作,而且非常冗长(我很高兴我现在不需要太多地使用它)。然而,另一种选择就更不吸引人了:一个不稳定、无法维护的意大利面球……

您可能想看看博客上关于gwt平台应用程序的示例->

干杯 标记

public class ButtonClickPresenterTest {
    ButtonClickPresenter presenter;
    ClickHandler currentHandler;
    String currentText;

    @Before
    public void setUp() {
        presenter = new ButtonClickPresenter(
            // dummy view - just stores label text in a String and
            // keeps track of the Presenter's click handler
            new ButtonClickPresenter.View() {
                @Override
                public HasText currentValue() {
                    return new HasText() {
                        @Override public String getText() { return currentText; }
                        @Override public void setText(String text) { currentText = text; }
                    };
                }

                @Override
                public HasClickHandlers incrementButton() {
                    return new HasClickHandlers() {
                        @Override
                        public HandlerRegistration addClickHandler(ClickHandler handler) {
                            currentHandler = handler;
                        }
                    };
                }
            });
    }

    @Test
    public void testIncrement() {
        // initial value
        assertEquals("0", currentText);

        // clicking the button should increment the number
        currentHandler.onClick(null);
        assertEquals("1", currentText);
    }
}