瓦丁书中例子的简化
《瓦丁之书》中有一章是关于 Push 的,包括一个使用 Vaadin Charts 的例子。
下面是我的代码。虽然基于上面提到的Vaadin Charts示例,但我通过将图表
对象的使用替换为简单的标签
对象来简化它。标签每秒更新一次,以告知您当前时间。
例如,仅使用 – 在实际项目中使用执行器
警告:我下面的示例是为简单起见而构建的,而不是作为生产代码。休眠线程是管理计划的线程工作的一种粗糙而笨拙的方式。Java为这种工作提供了工具。在实际项目中,我会使用 ScheduledExecutorService 而不是单个休眠 Thread
对象来调度我们的任务(告诉时间)。相关提示:切勿在 Servlet 环境中使用 。有关更完整,更真实的例子,请参阅我对有关Vaadin推送的类似问题的回答。Executor
Timer
在此示例中,我采用了其他快捷方式,例如:我将小部件直接放在 上,而实际工作将使用 a 来包含 .Label
UI
Layout
Label
我的配置
我的代码使用 Vaadin 7.3.7 和 NetBeans 8.0.2 中的 Java 8 Update 25,在 Mac OS X 10.8.5 (Mountain Lion) 上使用 Tomcat 8.0.15。
Push技术相对较新,尤其是WebSocket品种。请务必使用最新版本的 Web 服务器,例如 Tomcat 7 或 8 的最新更新。
如何使用此示例
此代码是单个文件,即该文件。要使用此代码,请执行以下操作:MyUI.java
- 在您选择的IDE中创建新的默认Vaadin应用程序。
- 在修改之前,让该示例成功运行。
- 将类的内容替换为下面的代码。
MyUI
@Push
注解
在中间的代码旁边,请注意我们如何将@Push
注释添加到类定义中。MyUI
示例代码
package com.example.pushvaadinapp;
import com.vaadin.annotations.Push;
import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.annotations.Widgetset;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;
import javax.servlet.annotation.WebServlet;
/**
* © 2014 Basil Bourque. This source code may be used freely forever by anyone absolving me of any and all responsibility.
*
* +----------------------------+
* | NOT FOR PRODUCTION USE! |
* +----------------------------+
* Sleeping threads is an awkward way to manage scheduled background work.
* By the way, never use a 'Timer' in a Servlet environment.
* Use an Executor instead, probably a ScheduledExecutorService.
*/
@Push
@Theme ( "mytheme" )
@Widgetset ( "com.example.pushvaadinapp.MyAppWidgetset" )
public class MyUI extends UI
{
Label label = new Label( "Now : " );
@Override
protected void init ( VaadinRequest vaadinRequest )
{
// Put a widget on this UI. In real work we would use a Layout.
setContent( this.label );
// Start the data feed thread
new FeederThread().start();
}
@WebServlet ( urlPatterns = "/*" , name = "MyUIServlet" , asyncSupported = true )
@VaadinServletConfiguration ( ui = MyUI.class , productionMode = false )
public static class MyUIServlet extends VaadinServlet
{
}
public void tellTime ()
{
label.setValue( "Now : " + new java.util.Date() ); // If Java 8, use: Instant.now(). Or, in Joda-Time: DateTime.now().
}
class FeederThread extends Thread
{
int count = 0;
@Override
public void run ()
{
try {
// Update the data for a while
while ( count < 100 ) {
Thread.sleep( 1000 );
// Calling special 'access' method on UI object, for inter-thread communication.
access( new Runnable()
{
@Override
public void run ()
{
count ++;
tellTime();
}
} );
}
// Inform that we have stopped running
// Calling special 'access' method on UI object, for inter-thread communication.
access( new Runnable()
{
@Override
public void run ()
{
label.setValue( "Done." );
}
} );
} catch ( InterruptedException e ) {
e.printStackTrace();
}
}
}
}
下面是一个简单但完整的 Vaadin 8 示例,它演示了如何使用服务器推送和 Java EE 消息传递 API,使用 Vaadin 文档中描述的广播程序模式在不同的 UI 之间发送消息。如果您对向其他用户发送消息或广播不感兴趣,请仅查看 ReceiveMessageUI。
原则上,这一切都归结为以下内容:
- 注释 Vaadin UI 以启用服务器推送(默认情况下通过 WebSocket 连接)
@Push
-
包装UI更新,当从其他线程访问它时,默认情况下会自动发送更新:
access()
getUI().access(() -> layout.addComponent(new Label("Hello!")));
使用广播公司模式向其他用户发布消息并订阅其消息。
-
如何使用Java中的RESTful Web服务获取远程/客户端IP地址? 我已经在我的项目中编写了Rest Web服务。Web服务调用可能来自不同 machine.so 我需要通过REST Web服务找出IP地址。 从这个请求.getRemoteAddr()使用这个。 但是我不能使用getRemoteAddr()。因为我的请
-
从包含大量文件的zip文件中提取1文件的最快方法是什么? 我尝试了但它们也缺少一些东西。 LZMA SDK不提供一种如何使用的文档/教程,这非常令人沮丧。没有 javadoc。 虽然7z jbinding没有提供一种简单的方法来只提取1个文件,但是,它只提供了提取zip文件
-
输入/输出流在销毁时是否关闭? Java 中的 InputStreams 和 OutputStreams 是否在销毁时关闭()?我完全理解这可能是不好的形式(特别是在C和C++世界中),但我很好奇。 另外,假设我有以下代码: 无名的FileInputStream是否在p.load
-
Java 程序中的字符串大小是否有任何限制? 我有一个字符串定义为 字符串 xx 我可以分配的字符数是否有任何限制? 2) 我正在将用户输入分配给此字符串 xx。70%的人只说一个字。有时他们给出一个大句子,所以想知道可
-