在Vaadin Web应用程序中将数据从一个用户推送到另一个用户

时间:2015-12-25 21:25:36

标签: gwt vaadin

我知道它可能需要超过10行代码(希望不超过50行),但我想知道你是否可以帮助我。

我尝试根据其他用户的输入在运行时更新一个用户的UI线程。我创建了一个实现三个预定义用户(jim,tom和threeskin)的基本项目。我希望从jim向tom发送一条消息,让它在tom的UI中显示为一个新的Label对象,即使它们全部都不知道它们。登录。哦,吉姆不应该刷新他的页面。标签应该只是自己在屏幕上产生。

要说我感谢一些帮助,这将是十年的轻描淡写。

    public class User {
    public String nume;

    public User(String nume) {
        super();
        this.nume = nume;
      }
    }
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    public class Engine implements ServletContextListener {
    public static ArrayList<User>userbase;
        public void contextDestroyed(ServletContextEvent arg0) { }
        public void contextInitialized(ServletContextEvent arg0) {
            System.out.println("This code is running at startup");
            userbase =new ArrayList<User>();
            userbase.add(new User("jim"));userbase.add(new User("tom"));userbase.add(new User("threeskin"));        
        }
    }
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    public class InfigeUI extends UI {    
        User us3r;
        @WebServlet(value = "/*", asyncSupported = true)
        @VaadinServletConfiguration(productionMode = false, ui = InfigeUI.class)    
        public static class Servlet extends VaadinServlet {}    
            protected void init(VaadinRequest request) {
            VerticalLayout everything=new VerticalLayout();
            setContent(everything);
        if (us3r==null){everything.addComponent(auth());}else{everything.addComponent(main());}    
        }
        ComponentContainer auth(){    
            final VerticalLayout layout = new VerticalLayout();        
            layout.setMargin(true);
            TextField userField=new TextField();
            Button login = new Button("Log in");
            login.addClickListener(new Button.ClickListener() {
                public void buttonClick(ClickEvent event) {                
                    us3r=login(userField.getValue());
                    if (us3r!=null){
                    saveValue(InfigeUI.this, us3r);    
                    layout.removeAllComponents();
                   layout.addComponent(main());
                }else{Notification.show("I only know jim, tom and threeskin. Which one are you?");}}
            });
            layout.addComponent(userField);
            layout.addComponent(login);
            return layout;
        }    
        User login(String nume){
            for (int i=0;i<Engine.userbase.size();i++){
                if (nume.equals(Engine.userbase.get(i).nume)){return Engine.userbase.get(i);}                                
            }
            return null;
        }
    static void saveValue(InfigeUI ui,User value){
        ui.us3r=value;
        ui.getSession().setAttribute("something", value);
         VaadinService.getCurrentRequest().getWrappedSession().setAttribute("something", value);            
    }
    ComponentContainer main(){
        VerticalLayout vl=new VerticalLayout();
        Label label=new Label("This is the post-login screen");
        String name=new String(us3r.nume);
        Label eticheta=new Label(name);
        TextField to=new TextField("Send to");
        TextField message=new TextField("Message");
        Button sendNow=new Button("Send now!");
       vl.addComponent(eticheta);
        vl.addComponent(label);
        vl.addComponent(eticheta);
        vl.addComponent(to);
        vl.addComponent(message);
        vl.addComponent(sendNow);
        return vl ;
        }
    }

2 个答案:

答案 0 :(得分:2)

基本上你想要三件事

  1. 用户的UI更新,其自身不执行任何操作,或者换言之,从服务器发送到浏览器的消息。要启用此功能,您需要使用@Push注释UI类。否则,仅当用户做出导致服务器访问的事情时才会显示更新,例如,单击按钮

  2. 在UI实例之间发送消息的某种方式(每个用户有一个UI实例)。您可以使用一些消息总线实现(CDI,Spring,...),或者您可以使用静态字段(所有用户之间共享静态字段)。参见例如https://github.com/Artur-/SimpleChat了解一种方法。在这里避免使用所有* .getCurrent方法也是一个好主意,因为它们在很多情况下会引用另一个UI而不是你想的(例如当你在接收器代码中时的发送者),你会做除了你之外的事情。打算。

  3. 邮件到达时安全地更新用户界面。这是使用UI.access完成的,也可以在聊天示例中看到。

答案 1 :(得分:0)

首先,您需要启用项目的服务器推送help 基于Vaadin文档。 但是,下面的代码示例将给出您想要的内容:

  1. 创建广播监听器接口:

    public interface BroadcastListener {     public void receiveBroadcast(final String message); }

  2. The Broadcaster Class:

    public class Broadcaster {

    private static final List<BroadcastListener> listeners = new CopyOnWriteArrayList<BroadcastListener>();
    
    public static void register(BroadcastListener listener) {
        listeners.add(listener);
    }
    
    public static void unregister(BroadcastListener listener) {
        listeners.remove(listener);
    }
    
    public static void broadcast(final String message) {
        for (BroadcastListener listener : listeners) {
            listener.receiveBroadcast(message);
        }
    }
    

    }

  3. 推送强化的UI(通过注释):

    @Push 公共类BroadcasterUI扩展UI实现BroadcastListener {

    @Override
    protected void init(VaadinRequest request) {
        final VerticalLayout layout = new VerticalLayout();
        layout.setMargin(true);
        setContent(layout);
    
        final TextArea message = new TextArea("",
                "The system is going down for maintenance in 10 minutes");
        layout.addComponent(message);
    
        final Button button = new Button("Broadcast");
        layout.addComponent(button);
        button.addClickListener(new Button.ClickListener() {
            @Override
            public void buttonClick(ClickEvent event) {
                Broadcaster.broadcast(message.getValue());
            }
        });
    
        // Register broadcast listener
        Broadcaster.register(this);
    }
    
    @Override
    public void detach() {
        Broadcaster.unregister(this);
        super.detach();
    }
    
    @Override
    public void receiveBroadcast(final String message) {
        access(new Runnable() {
            @Override
            public void run() {
                Notification n = new Notification("Message received",
                        message, Type.TRAY_NOTIFICATION);
                n.show(getPage());
            }
        });
    }
    
  4. 您可以找到完整链接here