我想创建自定义图像组件,所以我从与服务器端集成一步一步地进行操作。对于基本步骤或第一步,我按照以下步骤创建了测试服务器到客户机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从客户端到服务器应该可以工作了。