vadin 7:从服务器到客户端的RPC调用



我想创建自定义图像组件,所以我从与服务器端集成一步一步地进行操作。对于基本步骤或第一步,我按照以下步骤创建了测试服务器到客户机RPC调用

MyComponentWidget.java

public class MyComponentWidget extends HTML {
public MyComponentWidget() {
    getElement().setAttribute("class", "thumbnail");
}
public final void createCustomImage(final String url) {
 getElement().setInnerHTML("<div class='delete-block'></div><img src=" + url + " />");
}
}

MyComponentState.java

public class MyComponentState extends AbstractComponentState {
private String url;
private String html;
public final String getUrl() {
    return url;
}
public final void setUrl(final String url) {
    this.url = url;
}
public final String getHtml() {
    return html;
}
public final void setHtml(final String html) {
    this.html = html;
}
}

MyComponentConnector.java

public class MyComponentConnector extends AbstractComponentConnector {
public MyComponentConnector() {
    registerRpc(MyComponentClientRpc.class, new MyComponentClientRpc() {
        @Override
        public void getMessage() {
            // never reach to this place
            System.err.println("Reach Here !");
            getState().setHtml(getWidget().getHTML());
        }
    });
}
@Override
public final MyComponentWidget getWidget() {
    return (MyComponentWidget) super.getWidget();
}
@Override
public final MyComponentState getState() {
    return (MyComponentState) super.getState();
}
@OnStateChange("url")
final void updateText() {
    getWidget().createCustomImage(getState().getUrl());
}
}

MyComponentClientRpc.java

import com.vaadin.shared.communication.ClientRpc;
public interface MyComponentClientRpc extends ClientRpc {
void getMessage();
}

MyComponent.java

public class MyComponent extends AbstractComponent {
public MyComponent(final String url) {
    getState().setUrl(url);
}
public final MyComponentState getState() {
    return (MyComponentState) super.getState();
}
public final String getHTML() {
    getRpcProxy(MyComponentClientRpc.class).getMessage();
    return getState().getHtml();
}
}

和call as

MyComponent image = new MyComponent("myImageUrl");
System.out.println(image.getHTML());

我的问题是为什么我总是得到null值在我的控制台?我可以在浏览器上看到图像,但是System.out.println(image. gethtml ());产生null。我错过了什么?

要从客户端到服务器端进行rpc调用,必须扩展ServerRpc接口,例如:

package com.example.client.MyServerRpc
public interface MyServerRpc extends com.vaadin.shared.communication.ServerRpc {
    void sendHTML(String html);
}

在连接器中注册rpc:

private MyServerRpc rpc = RpcProxy.create(MyServerRpc.class, this);

然后您可以通过在连接器中使用注册的rpc发送一个值:

 rpc.sendHTML(html);

要接收组件或扩展的服务器端类上的值,必须创建rpc接口的实例:

private MyServerRpc rpc = new MyServerRpc() {
    @Override
    public void sendHTML(String html) {
        // this method will be called!
    }
};

并在构造函数中注册:

registerRpc(rpc);

完成这些步骤后,RPC从客户端到服务器应该可以工作了。

最新更新