GWT MVP架构优势

2024-01-04

我正在学习 GWT,并且在多个地方读到,使用 MVP 架构最适合开发 GWT 应用程序

我还读到,使用 MVP ARCH 进行测试很容易。有人可以解释一下为什么使用 MVP 架构进行测试很容易。

另外,我正在使用 MVP 开发一个项目,我发现将视图连接到数据库非常繁琐。我的意思是我必须更新我的 Presenter、service、serviceAsync、servicImpl、Facades 才能连接到数据库。

那么有人可以向我提供 GWT MVP 的本质吗?我会很感激一些例子。


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

  • 为演示者编写不需要相应环境(桌面、浏览器、GWT 小部件)即可运行的单元测试
  • 重用前端逻辑,而无需绑定到一组特定的小部件/UI 框架

后一种用例很少见,因此让我们重点关注 MVP 模型对自动化、程序化测试的适用性。对于开发团队来说,这通常采取连续构建/测试周期的形式,使用Hudson http://hudson-ci.org/(或类似)在无头服务器上,每次运行测试时打开 Web 浏览器、创建控件等是不切实际的。

MVP+GWT 的典型用法是视图实现呈现器提供的接口,并且通常该接口是根据其他通用接口定义的。这是一个非常简单的演示者,当单击按钮时,它会增加数字标签 - 请注意,而不是公开TextBox http://google-web-toolkit.googlecode.com/svn/javadoc/2.0/com/google/gwt/user/client/ui/TextBox.html and Button http://google-web-toolkit.googlecode.com/svn/javadoc/2.0/com/google/gwt/user/client/ui/Button.html直接,视图返回通用的HasText http://google-web-toolkit.googlecode.com/svn/javadoc/2.0/com/google/gwt/user/client/ui/HasText.html and 有点击处理程序 http://google-web-toolkit.googlecode.com/svn/javadoc/2.0/com/google/gwt/event/dom/client/HasClickHandlers.html实例:

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 创建):

public class ButtonClickView implements ButtonClickPresenter.View {
    // ... skipped UiBinder initialisation ...

    @UiField Label currentValueLabel;
    @UiField Button incrementButton;

    @Override
    public HasText currentValue() {
        return currentValueLabel;
    }

    @Override
    public HasClickHandlers incrementButton() {
        return incrementButton;
    }

    // ... etc ...
}

而单元测试创​​建一个虚拟实现(或使用Mockito http://code.google.com/p/mockito/, EasyMock http://easymock.org/等),因此不需要任何 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(或诸如此类的抽象)请求数据gwt-调度 http://code.google.com/p/gwt-dispatch/ or gwt-平台 http://code.google.com/p/gwt-platform/),然后调用视图上的方法来填充 UI。

顺便说一下,最后两个链接(以及gwt-演示者 http://code.google.com/p/gwt-presenter/)如果您正在寻找 GWT MVP 代码示例 - 结合谷歌杜松子酒 http://code.google.com/p/google-gin/他们提供了将所有这些东西结合在一起的框架。

说了这么多,我同意——GWT+MVP+Java 的组合可以是艰苦的工作,极其冗长(我很高兴这些天我不必经常使用它)。然而,另一种选择则更没有吸引力:一个无法测试、无法维护的意大利面球……

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

GWT MVP架构优势 的相关文章

  • 正则表达式和 GWT

    我的问题是 在GWT中使用正则表达式有没有好的解决方案 例如 我对 String split regex 的使用不满意 GWT 将代码翻译为 JS 然后将正则表达式用作 JS 正则表达式 但我无法使用 Java Matcher 或 Java
  • 生产中的 GWT 源映射

    GWT 支持超级开发模式下的源映射 不幸的是 尽管我在 gwt xml 文件中添加了源映射选项 但它们似乎无法在生产模式下工作 如何在那里启用它们 看看 GWT 自己的网站是如何做到这一点的 https gwt googlesource c
  • 带下拉箭头的 GWT 文本框

    我想在文本框中有一个下拉箭头 在我的例子中实际上是 SuggestBox GMail 执行此操作是为了实现高级搜索功能 打开高级搜索对话框 要使该箭头显示在 TextBox 的右侧并可单击 正确的 GWT 布局是什么 看看 GMail 我发
  • GWT:对RichTextArea进行文本限制并阻止用户输入更多字符

    我正在使用 GWT RixhText Area 并希望在 richText Area 中限制 100 个字符 现在我正在做这个 description addKeyDownHandler new KeyDownHandler Overrid
  • 如何在 GWT 的 Jetty 中启用 HTTPS?

    如何在 GWT 附带的 Jetty 中启用 HTTPS gwt dev jar 中 隐藏 了一个 README SSL txt 你可以找到最新版本在 Github 上 https github com gwtproject gwt blob
  • Winforms MVP

    我主要有 ASP Net 背景 懂一些 MVC 我也做了一些 Silverlight 和 MVVM 但是我现在即将转向 Winforms 我对它的经验很少 所以我想知道如何处理 MVP 典型的 MVP 示例显示演示者设置视图属性 通过某种
  • GWT:在另一个模块内调用RPC服务

    我有一个模块B 它继承了模块A 当我从A内部调用RPC服务时 它们工作正常 但是当我在B中调用A的服务时 RPC调用总是失败 我错过了什么吗 预先感谢您的任何帮助 我在这里找到了我的问题的答案 http blog cloudglow com
  • 从输入跳到 CellTable 中的输入

    我有一个 CellTable 其中包含一堆渲染到的单元格
  • GWT 和 Google 文档 API

    我正在使用 GWT 创建一个简单的应用程序 让教师可以轻松创建自己的课程 该应用程序将位于 Google App Engine 上 但我想将课程存储在用户的 Google 文档空间中 是否可以 据我所知 gwt 将 java 转换为 jav
  • GWT 和身份验证

    保护 GWT Tomcat 应用程序执行身份验证和授权的最佳策略是什么 有两种基本策略 确保入口点安全 确保远程服务的安全 确保入口点安全 最简单的方法是使用常规 Web 应用程序安全工具限制对 GWT 生成的 html js 文件的访问
  • gwt hibernate 程序中的异常

    我正在尝试制作一个简单的 GWT RPC Hibernate 程序 将用户添加到 MySQL 数据库 我正在使用 Eclipse EE 该应用程序已成功将用户添加到数据库 但在编译时引发异常 这是我的应用程序的例外情况和来源 例外 Exce
  • GWT 主题/模板 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 GWT 开发一个应用程序 尽管 GWT 是基于 JAVA 的媒介 但外观和感觉只能通过 CS
  • gwt 中的垂直居中

    如何使用垂直面板在 gwt 中垂直居中 或者请告诉我有什么方法可以进行垂直居中 如果你想直接使用VerticalPanel从代码中 您需要使用setVerticalAlignment HasVerticalAlignment ALIGN M
  • 在 GWT 中使用 SVG

    我想知道是否可以在面板中包含 SVG 内容 或者在 GWT 中工作的任何内容 能够以编程方式向 SVG 添加更多内容 例如添加圆或曲线 并处理鼠标事件 这会是在 SVG 或 GWT 中 我尝试创建一个 HTML 对象 添加以下内容
  • GWT - 让 CellTable 单元格使用 HTML?

    我有一个 CellTable 我想将 HTML 代码放入单元格中 以下代码不起作用 空格已从输出中删除 TextColumn
  • 讨论iPhone上的MVC实现

    我在不同的框架上使用 MVC 模式一段时间 例如 swing android gwt 现在 我正在学习iPhone框架 我对MVC的实现感到非常惊讶 我问的问题是关于视图和控制器交互的 首先 这就是我构思 MVC 模式的方式 视图和控制器通
  • 在 Java/GWT 中解析用户时间输入

    解析用户在 GWT 中的文本字段中键入的时间的最佳方法是什么 默认时间格式要求用户完全按照区域设置指定的时间格式输入时间 我想要更加灵活 因为用户可以通过多种不同的方式输入时间 例如 8 8p 8pm 8 15pm 13 15 1315 1
  • gwt-dispatch - GWT 的命令模式替代方案

    有没有替代方案gwt 调度 http code google com p gwt dispatch 在GWT项目中使用 GWT 平台 http code google com p gwt platform has a 调度模块 http c
  • GWT - css 中常量的问题

    我是 GWT 新手 我正在构建一个小型示例应用程序 我有几个 CSS 文件 我能够成功使用 ClientBundle 和 CssResource 将样式分配给 UiBinder 脚本中定义的元素 现在我想更进一步 使用 def css ru
  • zk 与 gwt zk 请求太多

    您好 我正在尝试比较 zk 和 gwt 的性能 在我的比较中 如果框架本身将一些代码转换为js 那么我自己无法编写任何javascript 如get 但我无法自己编写js 在以上述方式编写代码时 几乎所有在浏览器上完成的操作都会将请求发送到

随机推荐

  • Objective-C 使用短路评估吗?

    我尝试了以下内容 if myString nil myString length And got NSNull length 发送到实例的无法识别的选择器 第一个条件失败后 Objective C 不会短路吗 Objective C 确实支
  • iPhone 应用程序可以充当服务器来发送消息或推送通知吗?

    我想写一个可以充当客户端的iOS应用程序and通过蜂窝数据网络连接其他 iPhone 的服务器 即没有典型的集中式服务器 目标是通过某种通知方式从 iPhone 服务器向多个 iPhone 客户端共享一系列约 200 条短事件消息 一次一条
  • 获取Google广告ID并限制广告

    我正在构建一个 Unity Android 应用程序 并查看一些广告 我们正在考虑的一项服务需要我的谷歌广告 ID 并限制广告状态 以便进行服务器到服务器的转换跟踪 问题是我不确定如何在 Unity 中获取这些值 看来我需要某种形式的插件
  • 将值插入循环内的关联数组中

    我是 php 的新手 我使用 foreach 循环来遍历已解码对象的数组 我想为每次迭代向新数组输入值 这是代码的一部分 example of array before decoding it id 1 quantity 12 other
  • jQuery 在 jsFiddle 中可以运行,但在我的电脑上不行

    我是 jQuery 的新手 一整天都在绞尽脑汁试图确定为什么这个脚本在 jsFiddle 中运行而不是在我的计算机上运行 我没有服务器设置 我只是从桌面在浏览器中启动 html 代码在这里工作正常 http jsfiddle net 9Du
  • Julia 语言 - @async 任务中的状态 :: 当前目录

    我注意到 阅读 捕获了生产错误 Julia 中的不同任务 没有自己的工作目录 但当前目录 是共享的 我意识到在操作系统级别这是显而易见的 一个进程有一个工作目录 我的问题是第一 是否有任何其他明显或不太明显的全局状态我应该注意 显然是环境变
  • Box.COM 与 Android 应用程序集成-OAuthActivity-NullpointerException?

    我正在整合BOX COM与我的 android 应用程序 所以我正在使用BoxAndroidLibraryV2 and BoxJavaLibraryV2与我的申请 我可以运行示例 Android 应用程序BoxSDKSample 因此 我从
  • 使用 R 中的 fct_reorder 根据值重新排序因子

    My data structure list LoB c C C C A A B C A A C A B C B A C B A B C A B B A B C A B C B word c speed connection call bt
  • 如何使用 ansible 'expect' 模块来处理多个不同的响应?

    在这里 我尝试测试我的 bash 脚本 它提示了四次 bin bash date gt opt prompt txt read p enter one one echo one echo one gt gt opt prompt txt r
  • 如何在perl中删除文件的最后10行

    我将总行数作为用户输入 然后从文件中删除这些行数 我看到了这个 learn perl org faq perlfaq5 html How do I count the number of lines in a file 然后我厌倦了下面的简
  • 堆转储中不可能的 Java 内存引用

    我有一个在晚上 7 41 拍摄的 Java 堆转储 我正在使用 Eclipse 内存分析工具对其进行分析 堆转储包含 20 个会话对象 对堆中的这些会话对象之一使用 GC 根路径 命令会显示以下 3 个对该会话对象的引用 来自终结器线程拥有
  • 找不到netbeans 8.0.2中maven本地存储库路径的设置位置

    在 netbeans 中 当我转到 工具 gt 选项 gt Java gt Maven 面板时 显示 Maven 主页 捆绑Maven主页 https i stack imgur com 8yQIQ png 但是我在Netbeans 8 0
  • Heroku、Grails:如果使用多个 Web dyno,则会缺少资源

    我已经创建了 grails 应用程序并将其上传到 heroku 中 如果我使用 heroku 规模网络 1 一切看起来都不错 但如果我跑 heroku 规模网络 2 一些静态资源消失了 从日志中我可以看出 web 2 dyno 中的所有静态
  • 阴影位于文本上方

    我正在向 Xamarin UWP 项目添加阴影 但问题并不是真正特定于 Xamarin 而是一般来说是 UWP bool IsShadowSupported gt ApiInformation IsApiContractPresent Wi
  • 无法使用带有 connect 的 ref 调用子方法

    我想从子组件调用一个方法 按照这里的建议从父方法调用子方法 https stackoverflow com questions 37949981 call child method from parent 但是 当子组件使用来自react
  • 在 while 循环中延迟

    所以我想在 jquery 中执行延迟的 ajax 请求 直到收到特定的服务器响应 非空 我该怎么做呢 while data response null ajax done function data function doUntilResu
  • Python将列表分成n块

    我知道这个问题已经被讨论过很多次了 但我的要求不同 我有一个类似的列表 range 1 26 我想把这个列表分成固定数量n 假设 n 6 gt gt gt x 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1
  • 联合和结构初始化

    我偶然发现了一段基于 C 语言联合的代码 代码如下 union struct char ax 2 char ab 2 s struct int a int b st u 12 1 printf d d u st a u st b 我只是不明
  • 以最少的比较次数对数组进行排序

    我的计算机科学作业需要一些帮助 我需要编写一个排序例程 在最坏的情况下使用 7 次比较对长度为 5 的数组进行排序 我已经证明 由于决策树的高度 将需要 7 次比较 我考虑使用决策树 硬编码 但这意味着该算法非常复杂 并且我的导师暗示这不是
  • GWT MVP架构优势

    我正在学习 GWT 并且在多个地方读到 使用 MVP 架构最适合开发 GWT 应用程序 我还读到 使用 MVP ARCH 进行测试很容易 有人可以解释一下为什么使用 MVP 架构进行测试很容易 另外 我正在使用 MVP 开发一个项目 我发现