【问题标题】:Vaadin 7.1.0 PushVaadin 7.1.0 推送
【发布时间】:2013-07-16 12:33:45
【问题描述】:

我是 Vaadin 的新手,我只是实现了一个原型来测试功能。目前我在玩 Vaadin Server-Push 功能。 我喜欢做一个可以通过 Button 增加的简单计数器。之后我喜欢从不同的浏览器打开这一面,当我计数时,我喜欢更新所有浏览器。

现在我知道当前浏览器是由一个单独的线程更新的。

public class PushTestView extends VerticalLayout implements View {

   private static final long serialVersionUID = -8056849522760207972L;
   private Label counter;

   public void enter(ViewChangeEvent event) {
      removeAllComponents();
      PushTestController controller = PushTestController.getInstance();
      counter = new Label("" + controller.getCounter());
      Button button = new Button("Count up");

      button.addClickListener(new ClickListener() {
         private static final long serialVersionUID = -1437136914245802675L;

         @Override
         public void buttonClick(ClickEvent event) {
            InitializerThread thread = new InitializerThread();
            thread.run();
         }
      });

      addComponent(counter);
      addComponent(button);

   }

   class InitializerThread extends Thread {
      @Override
      public void run() {
         // Init done, update the UI after doing locking
         UI.getCurrent().access(new Runnable() {
            @Override
            public void run() {
               // Here the UI is locked and can be updated
               PushTestController.getInstance().countUp();
               counter.setValue("" + PushTestController.getInstance().getCounter());
               UI.getCurrent().notifyAll();
            }
         });
      }
   }
}

这个视图嵌入到我的 UI 中,由 @Push 注释。 这是我的控制器:

public class PushTestController {

   private static PushTestController instance = new PushTestController();
   private int counter = 0;

   private PushTestController() {
      //Private Constructor for Singleton 
   }

   public static PushTestController getInstance() {
      return instance;
   }

   public int getCounter() {
      return counter;
   }

   public String getCounterString() {
      return "" + counter;
   }

   public void countUp() {
      counter++;
   }
}

我如何扩展这个示例以更新不同浏览器中的 UI?

【问题讨论】:

标签: java vaadin


【解决方案1】:

【讨论】:

    【解决方案2】:

    您必须在您的项目中使用 servlet 3.0 并编辑您的 ivy.xml(或者如果您使用 Maven,则使用 pom.xml)。之后,您必须添加 @Push 注释以启用 ui 推送。 像这样的:

    <dependency org="com.vaadin" name="vaadin-push" rev="&vaadin.version;" conf="default->default" />
    

    在 Maven 中:

    <dependency>
      <groupId>com.vaadin</groupId>
      <artifactId>vaadin-push</artifactId>
      <version>${vaadin.version}</version>
    </dependency>
    

    servlet 配置:

    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.vaadin.server.VaadinServlet</servlet-class>
        <init-param>
            <param-name>ui</param-name>
            <param-value>org.vaadin.example.MyUI</param-value>
        </init-param>
        <async-supported>true</async-supported>
    </servlet>
    

    最后是@Push

    @Push 
    public class PushTestUI extends UI 
    

    Reference here

    【讨论】:

    • 我还是做了这个测试。到目前为止它有效。但现在我喜欢将 UI 从一个浏览器更新到另一个浏览器。
    • @TooR push 本身只允许服务器和每个 UI 实例(可以说是每个浏览器)之间的直接通信。如果您想通知其他 UI/会话,您必须自己执行此操作,例如通过触发更新其他 UI 两个的后台操作。
    • @TooR ,您需要使用一点 Atmosphere 框架基础设施,通过在 UI 上实现 BroadcasterListener 接口:vaadin.com/wiki/-/wiki/Main/…
    • @TooR The Book Of Vaadin 现在包含您想要的an example,从一个用户广播到其他用户。请参阅第 11.16 章,服务器推送。
    猜你喜欢
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    相关资源
    最近更新 更多